Skip to content
wiki.fftac.org

Reviewrepository - Source Excerpt 02

Back to Reviewrepository

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Domain/ReviewRepository.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Domain/ReviewRepository.php

return is_array($row) ? $this->normalize_row($row) : [];
    }

    /**
     * Upserts a unique per-user review or report row.
     *
     * @return array<string,mixed>
     */
    private function upsert(int $prompt_id, int $reviewer_user_id, string $kind, string $decision, string $reason): array
    {
        global $wpdb;

        $table = Installer::table('prompt_reviews');
        $created_utc = gmdate('Y-m-d H:i:s');
        $kind = sanitize_key($kind);
        $decision = sanitize_key($decision);
        $reason = sanitize_textarea_field($reason);

        $existing_id = (int) $wpdb->get_var(
            $wpdb->prepare(
                "SELECT id FROM {$table}
                 WHERE prompt_post_id = %d AND reviewer_user_id = %d AND review_kind = %s
                 LIMIT 1",
                $prompt_id,
                $reviewer_user_id,
                $kind
            )
        );

        if ($existing_id > 0) {
            $wpdb->update(
                $table,
                [
                    'decision' => $decision,
                    'reason' => $reason,
                    'updated_utc' => $created_utc,
                ],
                ['id' => $existing_id],
                ['%s', '%s', '%s'],
                ['%d']
            );

            return $this->get($existing_id);
        }

        $wpdb->insert(
            $table,
            [
                'prompt_post_id' => $prompt_id,
                'reviewer_user_id' => $reviewer_user_id,
                'review_kind' => $kind,
                'decision' => $decision,
                'reason' => $reason,
                'created_utc' => $created_utc,
                'updated_utc' => $created_utc,
            ],
            ['%d', '%d', '%s', '%s', '%s', '%s', '%s']
        );

        return $this->get((int) $wpdb->insert_id);
    }

    /**
     * Normalizes one DB row for API use.
     *
     * @param array<string,mixed> $row
     * @return array<string,mixed>
     */
    private function normalize_row(array $row): array
    {
        return [
            'id' => (int) ($row['id'] ?? 0),
            'prompt_post_id' => (int) ($row['prompt_post_id'] ?? 0),
            'reviewer_user_id' => isset($row['reviewer_user_id']) ? (int) $row['reviewer_user_id'] : 0,
            'reviewer_label' => sanitize_text_field((string) ($row['display_name'] ?? '')),
            'review_kind' => sanitize_key((string) ($row['review_kind'] ?? '')),
            'decision' => sanitize_key((string) ($row['decision'] ?? '')),
            'reason' => (string) ($row['reason'] ?? ''),
            'created_utc' => (string) ($row['created_utc'] ?? ''),
            'updated_utc' => (string) ($row['updated_utc'] ?? ''),
        ];
    }
}