mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 16:11:12 -05:00
feat: Implement item editing capability
This commit is contained in:
@@ -357,6 +357,102 @@ export async function resolveConflicts(
|
||||
return { updatedItems, newConflicts };
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit a submission item
|
||||
* Moderators can edit directly, regular users trigger auto-escalation
|
||||
*/
|
||||
export async function editSubmissionItem(
|
||||
itemId: string,
|
||||
newData: any,
|
||||
userId: string
|
||||
): Promise<void> {
|
||||
// Check user permissions
|
||||
const { data: userRoles } = await supabase
|
||||
.from('user_roles')
|
||||
.select('role')
|
||||
.eq('user_id', userId);
|
||||
|
||||
const isModerator = userRoles?.some(r =>
|
||||
['moderator', 'admin', 'superuser'].includes(r.role)
|
||||
);
|
||||
|
||||
// Get current item
|
||||
const { data: currentItem, error: fetchError } = await supabase
|
||||
.from('submission_items')
|
||||
.select('*')
|
||||
.eq('id', itemId)
|
||||
.single();
|
||||
|
||||
if (fetchError || !currentItem) {
|
||||
throw new Error('Failed to fetch submission item');
|
||||
}
|
||||
|
||||
// Preserve original data if not already saved
|
||||
const originalData = currentItem.original_data || currentItem.item_data;
|
||||
|
||||
if (isModerator) {
|
||||
// Moderators can edit directly
|
||||
const { error } = await supabase
|
||||
.from('submission_items')
|
||||
.update({
|
||||
item_data: newData,
|
||||
original_data: originalData,
|
||||
updated_at: new Date().toISOString()
|
||||
})
|
||||
.eq('id', itemId);
|
||||
|
||||
if (error) {
|
||||
console.error('Error updating submission item:', error);
|
||||
throw new Error(`Failed to update item: ${error.message}`);
|
||||
}
|
||||
|
||||
// Log the edit
|
||||
await supabase
|
||||
.from('admin_audit_log')
|
||||
.insert({
|
||||
admin_user_id: userId,
|
||||
target_user_id: currentItem.submission_id,
|
||||
action: 'edit_submission_item',
|
||||
details: {
|
||||
item_id: itemId,
|
||||
item_type: currentItem.item_type,
|
||||
changes: newData
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Regular users trigger auto-escalation
|
||||
const { data: submission } = await supabase
|
||||
.from('content_submissions')
|
||||
.select('id, status')
|
||||
.eq('id', currentItem.submission_id)
|
||||
.single();
|
||||
|
||||
if (submission && submission.status !== 'escalated') {
|
||||
await escalateSubmission(
|
||||
currentItem.submission_id,
|
||||
`User requested edit for ${currentItem.item_type} item`,
|
||||
userId
|
||||
);
|
||||
}
|
||||
|
||||
// Update item with edit request
|
||||
const { error } = await supabase
|
||||
.from('submission_items')
|
||||
.update({
|
||||
item_data: newData,
|
||||
original_data: originalData,
|
||||
status: 'pending',
|
||||
updated_at: new Date().toISOString()
|
||||
})
|
||||
.eq('id', itemId);
|
||||
|
||||
if (error) {
|
||||
console.error('Error updating submission item:', error);
|
||||
throw new Error(`Failed to update item: ${error.message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update individual submission item status
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user