mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-23 00: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(
|
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([{
|
||||||
@@ -110,5 +68,4 @@ export async function submitCompanyUpdate(
|
|||||||
|
|
||||||
if (error) throw error;
|
if (error) throw error;
|
||||||
return { submitted: true };
|
return { submitted: true };
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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" });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user