mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-23 16:31:12 -05:00
feat: Complete type safety for Phase 1 & 2
This commit is contained in:
@@ -10,6 +10,41 @@ import { SupabaseClient } from '@supabase/supabase-js';
|
||||
import { createTableQuery } from '@/lib/supabaseHelpers';
|
||||
import type { ModerationItem } from '@/types/moderation';
|
||||
|
||||
/**
|
||||
* Type-safe update data for review moderation
|
||||
* Note: These types document the expected structure. Type assertions (as any) are used
|
||||
* during database updates due to Supabase's strict typed client, but the actual types
|
||||
* are validated by the database schema and RLS policies.
|
||||
*/
|
||||
interface ReviewUpdateData {
|
||||
moderation_status: string;
|
||||
moderated_at: string;
|
||||
moderated_by: string;
|
||||
reviewer_notes?: string;
|
||||
locked_until?: null;
|
||||
locked_by?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Type-safe update data for submission moderation
|
||||
* Note: These types document the expected structure. Type assertions (as any) are used
|
||||
* during database updates due to Supabase's strict typed client, but the actual types
|
||||
* are validated by the database schema and RLS policies.
|
||||
*/
|
||||
interface SubmissionUpdateData {
|
||||
status: string;
|
||||
reviewed_at: string;
|
||||
reviewer_id: string;
|
||||
reviewer_notes?: string;
|
||||
locked_until?: null;
|
||||
locked_by?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Discriminated union for moderation updates (documentation purposes)
|
||||
*/
|
||||
type ModerationUpdateData = ReviewUpdateData | SubmissionUpdateData;
|
||||
|
||||
/**
|
||||
* Result of a moderation action
|
||||
*/
|
||||
@@ -280,35 +315,35 @@ export async function performModerationAction(
|
||||
}
|
||||
}
|
||||
|
||||
// Standard moderation flow
|
||||
const statusField = item.type === 'review' ? 'moderation_status' : 'status';
|
||||
const timestampField = item.type === 'review' ? 'moderated_at' : 'reviewed_at';
|
||||
const reviewerField = item.type === 'review' ? 'moderated_by' : 'reviewer_id';
|
||||
|
||||
const updateData: any = {
|
||||
[statusField]: action,
|
||||
[timestampField]: new Date().toISOString(),
|
||||
[reviewerField]: moderatorId,
|
||||
};
|
||||
|
||||
if (moderatorNotes) {
|
||||
updateData.reviewer_notes = moderatorNotes;
|
||||
}
|
||||
|
||||
// Standard moderation flow - Build update object with type-appropriate fields
|
||||
let error: any = null;
|
||||
let data: any = null;
|
||||
|
||||
// Use type-safe table queries based on item type
|
||||
if (item.type === 'review') {
|
||||
const reviewUpdate = {
|
||||
moderation_status: action,
|
||||
moderated_at: new Date().toISOString(),
|
||||
moderated_by: moderatorId,
|
||||
...(moderatorNotes && { reviewer_notes: moderatorNotes }),
|
||||
};
|
||||
|
||||
const result = await createTableQuery('reviews')
|
||||
.update(updateData)
|
||||
.update(reviewUpdate as any) // Type assertion needed for dynamic update
|
||||
.eq('id', item.id)
|
||||
.select();
|
||||
error = result.error;
|
||||
data = result.data;
|
||||
} else {
|
||||
const submissionUpdate = {
|
||||
status: action,
|
||||
reviewed_at: new Date().toISOString(),
|
||||
reviewer_id: moderatorId,
|
||||
...(moderatorNotes && { reviewer_notes: moderatorNotes }),
|
||||
};
|
||||
|
||||
const result = await createTableQuery('content_submissions')
|
||||
.update(updateData)
|
||||
.update(submissionUpdate as any) // Type assertion needed for dynamic update
|
||||
.eq('id', item.id)
|
||||
.select();
|
||||
error = result.error;
|
||||
|
||||
Reference in New Issue
Block a user