mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-24 18:31:11 -05:00
Fix superuser release locks RPC
This commit is contained in:
@@ -12,11 +12,15 @@ interface EditHistoryRecord {
|
||||
id: string;
|
||||
item_id: string;
|
||||
edited_at: string;
|
||||
previous_data: Record<string, unknown>;
|
||||
new_data: Record<string, unknown>;
|
||||
edit_reason: string | null;
|
||||
changed_fields: string[];
|
||||
profiles?: {
|
||||
field_changes?: Array<{
|
||||
id: string;
|
||||
field_name: string;
|
||||
old_value: string | null;
|
||||
new_value: string | null;
|
||||
}>;
|
||||
editor?: {
|
||||
username: string;
|
||||
avatar_url?: string | null;
|
||||
} | null;
|
||||
@@ -44,11 +48,15 @@ export function EditHistoryAccordion({ submissionId }: EditHistoryAccordionProps
|
||||
id,
|
||||
item_id,
|
||||
edited_at,
|
||||
previous_data,
|
||||
new_data,
|
||||
edit_reason,
|
||||
changed_fields,
|
||||
profiles:edited_by (
|
||||
field_changes:item_field_changes(
|
||||
id,
|
||||
field_name,
|
||||
old_value,
|
||||
new_value
|
||||
),
|
||||
editor:profiles!item_edit_history_edited_by_fkey(
|
||||
username,
|
||||
avatar_url
|
||||
)
|
||||
@@ -111,19 +119,30 @@ export function EditHistoryAccordion({ submissionId }: EditHistoryAccordionProps
|
||||
<div className="space-y-4">
|
||||
<ScrollArea className="h-[400px] pr-4">
|
||||
<div className="space-y-3">
|
||||
{editHistory.map((entry: EditHistoryRecord) => (
|
||||
<EditHistoryEntry
|
||||
key={entry.id}
|
||||
editId={entry.id}
|
||||
editorName={entry.profiles?.username || 'Unknown User'}
|
||||
editorAvatar={entry.profiles?.avatar_url || undefined}
|
||||
timestamp={entry.edited_at}
|
||||
changedFields={entry.changed_fields || []}
|
||||
editReason={entry.edit_reason || undefined}
|
||||
beforeData={entry.previous_data}
|
||||
afterData={entry.new_data}
|
||||
/>
|
||||
))}
|
||||
{editHistory.map((entry: EditHistoryRecord) => {
|
||||
// Transform relational field_changes into beforeData/afterData objects
|
||||
const beforeData: Record<string, unknown> = {};
|
||||
const afterData: Record<string, unknown> = {};
|
||||
|
||||
entry.field_changes?.forEach(change => {
|
||||
beforeData[change.field_name] = change.old_value;
|
||||
afterData[change.field_name] = change.new_value;
|
||||
});
|
||||
|
||||
return (
|
||||
<EditHistoryEntry
|
||||
key={entry.id}
|
||||
editId={entry.id}
|
||||
editorName={entry.editor?.username || 'Unknown User'}
|
||||
editorAvatar={entry.editor?.avatar_url || undefined}
|
||||
timestamp={entry.edited_at}
|
||||
changedFields={entry.changed_fields || []}
|
||||
editReason={entry.edit_reason || undefined}
|
||||
beforeData={beforeData}
|
||||
afterData={afterData}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</ScrollArea>
|
||||
|
||||
|
||||
@@ -1290,13 +1290,37 @@ export async function editSubmissionItem(
|
||||
if (updateError) throw updateError;
|
||||
|
||||
// Phase 4: Record edit history
|
||||
const { error: historyError } = await supabase
|
||||
const { data: historyData, error: historyError } = await supabase
|
||||
.from('item_edit_history')
|
||||
.insert({
|
||||
item_id: itemId,
|
||||
editor_id: userId,
|
||||
changes: changes,
|
||||
});
|
||||
edited_by: userId,
|
||||
changed_fields: Object.keys(changes),
|
||||
edit_reason: 'Direct edit by moderator',
|
||||
})
|
||||
.select('id')
|
||||
.single();
|
||||
|
||||
// Insert field changes relationally (NO JSON!)
|
||||
if (!historyError && historyData) {
|
||||
const fieldChanges = Object.entries(changes).map(([fieldName, change]: [string, any]) => ({
|
||||
edit_history_id: historyData.id,
|
||||
field_name: fieldName,
|
||||
old_value: String(change.old ?? ''),
|
||||
new_value: String(change.new ?? ''),
|
||||
}));
|
||||
|
||||
const { error: fieldChangesError } = await supabase
|
||||
.from('item_field_changes')
|
||||
.insert(fieldChanges);
|
||||
|
||||
if (fieldChangesError) {
|
||||
handleNonCriticalError(fieldChangesError, {
|
||||
action: 'Record Field Changes',
|
||||
metadata: { editHistoryId: historyData.id }
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (historyError) {
|
||||
handleNonCriticalError(historyError, {
|
||||
@@ -1435,9 +1459,17 @@ export async function fetchEditHistory(itemId: string) {
|
||||
.from('item_edit_history')
|
||||
.select(`
|
||||
id,
|
||||
changes,
|
||||
item_id,
|
||||
edited_at,
|
||||
editor:profiles!item_edit_history_editor_id_fkey (
|
||||
edit_reason,
|
||||
changed_fields,
|
||||
field_changes:item_field_changes(
|
||||
id,
|
||||
field_name,
|
||||
old_value,
|
||||
new_value
|
||||
),
|
||||
editor:profiles!item_edit_history_edited_by_fkey(
|
||||
user_id,
|
||||
username,
|
||||
display_name,
|
||||
|
||||
Reference in New Issue
Block a user