mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-23 07:31:12 -05:00
Refactor: Unify moderation queue for all entities
This commit is contained in:
@@ -15,30 +15,9 @@ export interface CompanyFormData {
|
||||
export async function submitCompanyCreation(
|
||||
data: CompanyFormData,
|
||||
companyType: 'manufacturer' | 'designer' | 'operator' | 'property_owner',
|
||||
userId: string,
|
||||
isModerator: boolean
|
||||
userId: string
|
||||
) {
|
||||
if (isModerator) {
|
||||
// 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
|
||||
// All users submit for moderation
|
||||
const { error } = await supabase
|
||||
.from('content_submissions')
|
||||
.insert([{
|
||||
@@ -59,36 +38,15 @@ export async function submitCompanyCreation(
|
||||
}]);
|
||||
|
||||
if (error) throw error;
|
||||
return { company: null, submitted: true };
|
||||
}
|
||||
return { submitted: true };
|
||||
}
|
||||
|
||||
export async function submitCompanyUpdate(
|
||||
companyId: string,
|
||||
data: CompanyFormData,
|
||||
userId: string,
|
||||
isModerator: boolean
|
||||
userId: string
|
||||
) {
|
||||
if (isModerator) {
|
||||
// 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
|
||||
// All users submit for moderation
|
||||
const { error } = await supabase
|
||||
.from('content_submissions')
|
||||
.insert([{
|
||||
@@ -111,4 +69,3 @@ export async function submitCompanyUpdate(
|
||||
if (error) throw error;
|
||||
return { submitted: true };
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,24 +51,18 @@ export default function DesignerDetail() {
|
||||
|
||||
const handleEditSubmit = async (data: any) => {
|
||||
try {
|
||||
const result = await submitCompanyUpdate(
|
||||
await submitCompanyUpdate(
|
||||
designer!.id,
|
||||
data,
|
||||
user!.id,
|
||||
isModerator()
|
||||
user!.id
|
||||
);
|
||||
|
||||
toast({
|
||||
title: result.submitted ? "Edit Submitted" : "Designer Updated",
|
||||
description: result.submitted
|
||||
? "Your edit has been submitted for review."
|
||||
: "The designer has been updated successfully."
|
||||
title: "Edit Submitted",
|
||||
description: "Your edit has been submitted for review."
|
||||
});
|
||||
|
||||
setIsEditModalOpen(false);
|
||||
if (!result.submitted) {
|
||||
fetchDesignerData();
|
||||
}
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Error",
|
||||
|
||||
@@ -32,15 +32,14 @@ export default function Designers() {
|
||||
navigate('/auth');
|
||||
return;
|
||||
}
|
||||
const result = await submitCompanyCreation(data, 'designer', user.id, isModerator());
|
||||
await submitCompanyCreation(data, 'designer', user.id);
|
||||
toast({
|
||||
title: result.submitted ? "Designer Submitted" : "Designer Created",
|
||||
description: result.submitted ? "Your submission has been sent for review." : "The designer has been created successfully."
|
||||
title: "Designer Submitted",
|
||||
description: "Your submission has been sent for review."
|
||||
});
|
||||
setIsCreateModalOpen(false);
|
||||
if (!result.submitted) fetchCompanies();
|
||||
} 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" });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -51,24 +51,18 @@ export default function ManufacturerDetail() {
|
||||
|
||||
const handleEditSubmit = async (data: any) => {
|
||||
try {
|
||||
const result = await submitCompanyUpdate(
|
||||
await submitCompanyUpdate(
|
||||
manufacturer!.id,
|
||||
data,
|
||||
user!.id,
|
||||
isModerator()
|
||||
user!.id
|
||||
);
|
||||
|
||||
toast({
|
||||
title: result.submitted ? "Edit Submitted" : "Manufacturer Updated",
|
||||
description: result.submitted
|
||||
? "Your edit has been submitted for review."
|
||||
: "The manufacturer has been updated successfully."
|
||||
title: "Edit Submitted",
|
||||
description: "Your edit has been submitted for review."
|
||||
});
|
||||
|
||||
setIsEditModalOpen(false);
|
||||
if (!result.submitted) {
|
||||
fetchManufacturerData();
|
||||
}
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Error",
|
||||
|
||||
@@ -71,28 +71,22 @@ export default function Manufacturers() {
|
||||
return;
|
||||
}
|
||||
|
||||
const result = await submitCompanyCreation(
|
||||
await submitCompanyCreation(
|
||||
data,
|
||||
'manufacturer',
|
||||
user.id,
|
||||
isModerator()
|
||||
user.id
|
||||
);
|
||||
|
||||
toast({
|
||||
title: result.submitted ? "Manufacturer Submitted" : "Manufacturer Created",
|
||||
description: result.submitted
|
||||
? "Your submission has been sent for review."
|
||||
: "The manufacturer has been created successfully."
|
||||
title: "Manufacturer Submitted",
|
||||
description: "Your submission has been sent for review."
|
||||
});
|
||||
|
||||
setIsCreateModalOpen(false);
|
||||
if (!result.submitted) {
|
||||
fetchCompanies();
|
||||
}
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Error",
|
||||
description: error.message || "Failed to create manufacturer.",
|
||||
description: error.message || "Failed to submit manufacturer.",
|
||||
variant: "destructive"
|
||||
});
|
||||
}
|
||||
|
||||
@@ -51,24 +51,18 @@ export default function OperatorDetail() {
|
||||
|
||||
const handleEditSubmit = async (data: any) => {
|
||||
try {
|
||||
const result = await submitCompanyUpdate(
|
||||
await submitCompanyUpdate(
|
||||
operator!.id,
|
||||
data,
|
||||
user!.id,
|
||||
isModerator()
|
||||
user!.id
|
||||
);
|
||||
|
||||
toast({
|
||||
title: result.submitted ? "Edit Submitted" : "Operator Updated",
|
||||
description: result.submitted
|
||||
? "Your edit has been submitted for review."
|
||||
: "The operator has been updated successfully."
|
||||
title: "Edit Submitted",
|
||||
description: "Your edit has been submitted for review."
|
||||
});
|
||||
|
||||
setIsEditModalOpen(false);
|
||||
if (!result.submitted) {
|
||||
fetchOperatorData();
|
||||
}
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Error",
|
||||
|
||||
@@ -64,25 +64,22 @@ const Operators = () => {
|
||||
return;
|
||||
}
|
||||
|
||||
const result = await submitCompanyCreation(
|
||||
await submitCompanyCreation(
|
||||
data,
|
||||
'operator',
|
||||
user.id,
|
||||
isModerator()
|
||||
user.id
|
||||
);
|
||||
|
||||
toast({
|
||||
title: result.submitted ? "Operator Submitted" : "Operator Created",
|
||||
description: result.submitted
|
||||
? "Your submission has been sent for review."
|
||||
: "The operator has been created successfully."
|
||||
title: "Operator Submitted",
|
||||
description: "Your submission has been sent for review."
|
||||
});
|
||||
|
||||
setIsCreateModalOpen(false);
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Error",
|
||||
description: error.message || "Failed to create operator.",
|
||||
description: error.message || "Failed to submit operator.",
|
||||
variant: "destructive"
|
||||
});
|
||||
}
|
||||
|
||||
@@ -64,25 +64,22 @@ const ParkOwners = () => {
|
||||
return;
|
||||
}
|
||||
|
||||
const result = await submitCompanyCreation(
|
||||
await submitCompanyCreation(
|
||||
data,
|
||||
'property_owner',
|
||||
user.id,
|
||||
isModerator()
|
||||
user.id
|
||||
);
|
||||
|
||||
toast({
|
||||
title: result.submitted ? "Property Owner Submitted" : "Property Owner Created",
|
||||
description: result.submitted
|
||||
? "Your submission has been sent for review."
|
||||
: "The property owner has been created successfully."
|
||||
title: "Property Owner Submitted",
|
||||
description: "Your submission has been sent for review."
|
||||
});
|
||||
|
||||
setIsCreateModalOpen(false);
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Error",
|
||||
description: error.message || "Failed to create property owner.",
|
||||
description: error.message || "Failed to submit property owner.",
|
||||
variant: "destructive"
|
||||
});
|
||||
}
|
||||
|
||||
@@ -250,40 +250,7 @@ export default function Parks() {
|
||||
}
|
||||
|
||||
try {
|
||||
if (isModerator()) {
|
||||
// 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
|
||||
// All users submit for moderation
|
||||
const { error } = await supabase
|
||||
.from('content_submissions')
|
||||
.insert({
|
||||
@@ -296,12 +263,11 @@ export default function Parks() {
|
||||
if (error) throw error;
|
||||
|
||||
toast({
|
||||
title: "Submission Sent",
|
||||
title: "Park Submitted",
|
||||
description: "Your park submission has been sent for moderation review.",
|
||||
});
|
||||
|
||||
setIsAddParkModalOpen(false);
|
||||
}
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Submission Failed",
|
||||
@@ -477,7 +443,7 @@ export default function Parks() {
|
||||
<DialogHeader>
|
||||
<DialogTitle>Add New Park</DialogTitle>
|
||||
<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>
|
||||
</DialogHeader>
|
||||
<ParkForm
|
||||
|
||||
@@ -51,24 +51,18 @@ export default function PropertyOwnerDetail() {
|
||||
|
||||
const handleEditSubmit = async (data: any) => {
|
||||
try {
|
||||
const result = await submitCompanyUpdate(
|
||||
await submitCompanyUpdate(
|
||||
owner!.id,
|
||||
data,
|
||||
user!.id,
|
||||
isModerator()
|
||||
user!.id
|
||||
);
|
||||
|
||||
toast({
|
||||
title: result.submitted ? "Edit Submitted" : "Property Owner Updated",
|
||||
description: result.submitted
|
||||
? "Your edit has been submitted for review."
|
||||
: "The property owner has been updated successfully."
|
||||
title: "Edit Submitted",
|
||||
description: "Your edit has been submitted for review."
|
||||
});
|
||||
|
||||
setIsEditModalOpen(false);
|
||||
if (!result.submitted) {
|
||||
fetchOwnerData();
|
||||
}
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Error",
|
||||
|
||||
@@ -83,21 +83,7 @@ export default function Rides() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isModerator()) {
|
||||
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 {
|
||||
// All users submit for moderation
|
||||
const { error } = await supabase
|
||||
.from('content_submissions')
|
||||
.insert({
|
||||
@@ -110,12 +96,11 @@ export default function Rides() {
|
||||
if (error) throw error;
|
||||
|
||||
toast({
|
||||
title: "Submission Sent",
|
||||
title: "Ride Submitted",
|
||||
description: "Your ride submission has been sent for moderation review.",
|
||||
});
|
||||
|
||||
setIsCreateModalOpen(false);
|
||||
}
|
||||
} catch (error: any) {
|
||||
toast({
|
||||
title: "Submission Failed",
|
||||
|
||||
Reference in New Issue
Block a user