Refactor: Unify moderation queue for all entities

This commit is contained in:
gpt-engineer-app[bot]
2025-10-01 20:00:22 +00:00
parent 5831705fe2
commit d100e0188b
11 changed files with 94 additions and 223 deletions

View File

@@ -15,30 +15,9 @@ export interface CompanyFormData {
export async function submitCompanyCreation( export async function submitCompanyCreation(
data: CompanyFormData, data: CompanyFormData,
companyType: 'manufacturer' | 'designer' | 'operator' | 'property_owner', companyType: 'manufacturer' | 'designer' | 'operator' | 'property_owner',
userId: string, userId: string
isModerator: boolean
) { ) {
if (isModerator) { // All users submit for moderation
// Moderators can create directly
const { data: newCompany, error } = await supabase
.from('companies')
.insert({
name: data.name,
slug: data.slug,
description: data.description,
person_type: data.person_type,
website_url: data.website_url,
founded_year: data.founded_year,
headquarters_location: data.headquarters_location,
company_type: companyType
})
.select()
.single();
if (error) throw error;
return { company: newCompany, submitted: false };
} else {
// Regular users submit for moderation
const { error } = await supabase const { error } = await supabase
.from('content_submissions') .from('content_submissions')
.insert([{ .insert([{
@@ -59,36 +38,15 @@ export async function submitCompanyCreation(
}]); }]);
if (error) throw error; if (error) throw error;
return { company: null, submitted: true }; return { submitted: true };
}
} }
export async function submitCompanyUpdate( export async function submitCompanyUpdate(
companyId: string, companyId: string,
data: CompanyFormData, data: CompanyFormData,
userId: string, userId: string
isModerator: boolean
) { ) {
if (isModerator) { // All users submit for moderation
// Moderators can update directly
const { error } = await supabase
.from('companies')
.update({
name: data.name,
slug: data.slug,
description: data.description,
person_type: data.person_type,
website_url: data.website_url,
founded_year: data.founded_year,
headquarters_location: data.headquarters_location,
updated_at: new Date().toISOString()
})
.eq('id', companyId);
if (error) throw error;
return { submitted: false };
} else {
// Regular users submit for moderation
const { error } = await supabase const { error } = await supabase
.from('content_submissions') .from('content_submissions')
.insert([{ .insert([{
@@ -111,4 +69,3 @@ export async function submitCompanyUpdate(
if (error) throw error; if (error) throw error;
return { submitted: true }; return { submitted: true };
} }
}

View File

@@ -51,24 +51,18 @@ export default function DesignerDetail() {
const handleEditSubmit = async (data: any) => { const handleEditSubmit = async (data: any) => {
try { try {
const result = await submitCompanyUpdate( await submitCompanyUpdate(
designer!.id, designer!.id,
data, data,
user!.id, user!.id
isModerator()
); );
toast({ toast({
title: result.submitted ? "Edit Submitted" : "Designer Updated", title: "Edit Submitted",
description: result.submitted description: "Your edit has been submitted for review."
? "Your edit has been submitted for review."
: "The designer has been updated successfully."
}); });
setIsEditModalOpen(false); setIsEditModalOpen(false);
if (!result.submitted) {
fetchDesignerData();
}
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Error", title: "Error",

View File

@@ -32,15 +32,14 @@ export default function Designers() {
navigate('/auth'); navigate('/auth');
return; return;
} }
const result = await submitCompanyCreation(data, 'designer', user.id, isModerator()); await submitCompanyCreation(data, 'designer', user.id);
toast({ toast({
title: result.submitted ? "Designer Submitted" : "Designer Created", title: "Designer Submitted",
description: result.submitted ? "Your submission has been sent for review." : "The designer has been created successfully." description: "Your submission has been sent for review."
}); });
setIsCreateModalOpen(false); setIsCreateModalOpen(false);
if (!result.submitted) fetchCompanies();
} catch (error: any) { } catch (error: any) {
toast({ title: "Error", description: error.message || "Failed to create designer.", variant: "destructive" }); toast({ title: "Error", description: error.message || "Failed to submit designer.", variant: "destructive" });
} }
}; };

View File

@@ -51,24 +51,18 @@ export default function ManufacturerDetail() {
const handleEditSubmit = async (data: any) => { const handleEditSubmit = async (data: any) => {
try { try {
const result = await submitCompanyUpdate( await submitCompanyUpdate(
manufacturer!.id, manufacturer!.id,
data, data,
user!.id, user!.id
isModerator()
); );
toast({ toast({
title: result.submitted ? "Edit Submitted" : "Manufacturer Updated", title: "Edit Submitted",
description: result.submitted description: "Your edit has been submitted for review."
? "Your edit has been submitted for review."
: "The manufacturer has been updated successfully."
}); });
setIsEditModalOpen(false); setIsEditModalOpen(false);
if (!result.submitted) {
fetchManufacturerData();
}
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Error", title: "Error",

View File

@@ -71,28 +71,22 @@ export default function Manufacturers() {
return; return;
} }
const result = await submitCompanyCreation( await submitCompanyCreation(
data, data,
'manufacturer', 'manufacturer',
user.id, user.id
isModerator()
); );
toast({ toast({
title: result.submitted ? "Manufacturer Submitted" : "Manufacturer Created", title: "Manufacturer Submitted",
description: result.submitted description: "Your submission has been sent for review."
? "Your submission has been sent for review."
: "The manufacturer has been created successfully."
}); });
setIsCreateModalOpen(false); setIsCreateModalOpen(false);
if (!result.submitted) {
fetchCompanies();
}
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Error", title: "Error",
description: error.message || "Failed to create manufacturer.", description: error.message || "Failed to submit manufacturer.",
variant: "destructive" variant: "destructive"
}); });
} }

View File

@@ -51,24 +51,18 @@ export default function OperatorDetail() {
const handleEditSubmit = async (data: any) => { const handleEditSubmit = async (data: any) => {
try { try {
const result = await submitCompanyUpdate( await submitCompanyUpdate(
operator!.id, operator!.id,
data, data,
user!.id, user!.id
isModerator()
); );
toast({ toast({
title: result.submitted ? "Edit Submitted" : "Operator Updated", title: "Edit Submitted",
description: result.submitted description: "Your edit has been submitted for review."
? "Your edit has been submitted for review."
: "The operator has been updated successfully."
}); });
setIsEditModalOpen(false); setIsEditModalOpen(false);
if (!result.submitted) {
fetchOperatorData();
}
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Error", title: "Error",

View File

@@ -64,25 +64,22 @@ const Operators = () => {
return; return;
} }
const result = await submitCompanyCreation( await submitCompanyCreation(
data, data,
'operator', 'operator',
user.id, user.id
isModerator()
); );
toast({ toast({
title: result.submitted ? "Operator Submitted" : "Operator Created", title: "Operator Submitted",
description: result.submitted description: "Your submission has been sent for review."
? "Your submission has been sent for review."
: "The operator has been created successfully."
}); });
setIsCreateModalOpen(false); setIsCreateModalOpen(false);
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Error", title: "Error",
description: error.message || "Failed to create operator.", description: error.message || "Failed to submit operator.",
variant: "destructive" variant: "destructive"
}); });
} }

View File

@@ -64,25 +64,22 @@ const ParkOwners = () => {
return; return;
} }
const result = await submitCompanyCreation( await submitCompanyCreation(
data, data,
'property_owner', 'property_owner',
user.id, user.id
isModerator()
); );
toast({ toast({
title: result.submitted ? "Property Owner Submitted" : "Property Owner Created", title: "Property Owner Submitted",
description: result.submitted description: "Your submission has been sent for review."
? "Your submission has been sent for review."
: "The property owner has been created successfully."
}); });
setIsCreateModalOpen(false); setIsCreateModalOpen(false);
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Error", title: "Error",
description: error.message || "Failed to create property owner.", description: error.message || "Failed to submit property owner.",
variant: "destructive" variant: "destructive"
}); });
} }

View File

@@ -250,40 +250,7 @@ export default function Parks() {
} }
try { try {
if (isModerator()) { // All users submit for moderation
// Moderators can create parks directly
const { error } = await supabase
.from('parks')
.insert({
name: parkData.name,
slug: parkData.slug,
description: parkData.description || null,
park_type: parkData.park_type,
status: parkData.status,
opening_date: parkData.opening_date || null,
closing_date: parkData.closing_date || null,
website_url: parkData.website_url || null,
phone: parkData.phone || null,
email: parkData.email || null,
banner_image_url: parkData.banner_image_url || null,
banner_image_id: parkData.banner_image_id || null,
card_image_url: parkData.card_image_url || null,
card_image_id: parkData.card_image_id || null,
operator_id: parkData.operator_id || null,
property_owner_id: parkData.property_owner_id || null
});
if (error) throw error;
toast({
title: "Park Created",
description: "The park has been created successfully.",
});
setIsAddParkModalOpen(false);
fetchParks();
} else {
// Regular users submit for moderation
const { error } = await supabase const { error } = await supabase
.from('content_submissions') .from('content_submissions')
.insert({ .insert({
@@ -296,12 +263,11 @@ export default function Parks() {
if (error) throw error; if (error) throw error;
toast({ toast({
title: "Submission Sent", title: "Park Submitted",
description: "Your park submission has been sent for moderation review.", description: "Your park submission has been sent for moderation review.",
}); });
setIsAddParkModalOpen(false); setIsAddParkModalOpen(false);
}
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Submission Failed", title: "Submission Failed",
@@ -477,7 +443,7 @@ export default function Parks() {
<DialogHeader> <DialogHeader>
<DialogTitle>Add New Park</DialogTitle> <DialogTitle>Add New Park</DialogTitle>
<DialogDescription> <DialogDescription>
Add a new park to the database. {isModerator() ? 'The park will be added immediately.' : 'Your submission will be reviewed before being published.'} Add a new park to the database. Your submission will be reviewed before being published.
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
<ParkForm <ParkForm

View File

@@ -51,24 +51,18 @@ export default function PropertyOwnerDetail() {
const handleEditSubmit = async (data: any) => { const handleEditSubmit = async (data: any) => {
try { try {
const result = await submitCompanyUpdate( await submitCompanyUpdate(
owner!.id, owner!.id,
data, data,
user!.id, user!.id
isModerator()
); );
toast({ toast({
title: result.submitted ? "Edit Submitted" : "Property Owner Updated", title: "Edit Submitted",
description: result.submitted description: "Your edit has been submitted for review."
? "Your edit has been submitted for review."
: "The property owner has been updated successfully."
}); });
setIsEditModalOpen(false); setIsEditModalOpen(false);
if (!result.submitted) {
fetchOwnerData();
}
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Error", title: "Error",

View File

@@ -83,21 +83,7 @@ export default function Rides() {
return; return;
} }
if (isModerator()) { // All users submit for moderation
const { error } = await supabase
.from('rides')
.insert(data);
if (error) throw error;
toast({
title: "Ride Created",
description: "The ride has been created successfully.",
});
setIsCreateModalOpen(false);
fetchRides();
} else {
const { error } = await supabase const { error } = await supabase
.from('content_submissions') .from('content_submissions')
.insert({ .insert({
@@ -110,12 +96,11 @@ export default function Rides() {
if (error) throw error; if (error) throw error;
toast({ toast({
title: "Submission Sent", title: "Ride Submitted",
description: "Your ride submission has been sent for moderation review.", description: "Your ride submission has been sent for moderation review.",
}); });
setIsCreateModalOpen(false); setIsCreateModalOpen(false);
}
} catch (error: any) { } catch (error: any) {
toast({ toast({
title: "Submission Failed", title: "Submission Failed",