import { requireCampaignAccess, stageTwoApiError, stageTwoDatabase, stageTwoUuid } from '~/server/utils/stage-two-supabase' import { requireStageTwoUser } from '~/server/utils/stage-two-supabase' export default defineEventHandler(async (event) => { try { const user = await requireStageTwoUser(event) const campaignId = stageTwoUuid(event.context.params?.id ?? '') const { owner } = await requireCampaignAccess(campaignId, user.id, true) if (!owner) throw createError({ statusCode: 403, statusMessage: 'Only the campaign owner can delete it.' }) // Delete associated data first to respect relational integrity await stageTwoDatabase(`characters?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`rounds?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`game_events?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`dice_rolls?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`player_intents?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`story_summaries?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`memories?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`relationships?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`audit_entries?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) // Delete linked world record if it has no other campaigns const campaigns = await stageTwoDatabase>( `campaigns?select=world_id&id=eq.${campaignId}`, ) const worldId = campaigns[0]?.world_id as string | undefined if (worldId) { const otherCampaigns = await stageTwoDatabase>( `campaigns?select=id&world_id=eq.${worldId}&id=neq.${campaignId}`, ) if (!otherCampaigns.length) { await stageTwoDatabase(`world_entities?world_id=eq.${worldId}`, { method: 'DELETE' }) await stageTwoDatabase(`worlds?id=eq.${worldId}`, { method: 'DELETE' }) } } await stageTwoDatabase(`campaign_members?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`invites?campaign_id=eq.${campaignId}`, { method: 'DELETE' }) await stageTwoDatabase(`campaigns?id=eq.${campaignId}`, { method: 'DELETE' }) return { success: true } } catch (error) { stageTwoApiError(error) } })