fix(campaigns): delete universes in dependency order
Some checks failed
CI / validate (push) Has been cancelled
Some checks failed
CI / validate (push) Has been cancelled
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -1,42 +1,15 @@
|
||||
import { requireCampaignAccess, stageTwoApiError, stageTwoDatabase, stageTwoUuid } from '~/server/utils/stage-two-supabase'
|
||||
import { deleteStageTwoCampaign, requireCampaignAccess, stageTwoApiError, 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)
|
||||
const { campaign, 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<Array<{ world_id: string }>>(
|
||||
`campaigns?select=world_id&id=eq.${campaignId}`,
|
||||
)
|
||||
const worldId = campaigns[0]?.world_id as string | undefined
|
||||
if (worldId) {
|
||||
const otherCampaigns = await stageTwoDatabase<Array<{ id: string }>>(
|
||||
`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' })
|
||||
const worldId = stageTwoUuid(campaign.world_id, 'world id')
|
||||
await deleteStageTwoCampaign(campaignId, worldId)
|
||||
return { success: true }
|
||||
} catch (error) {
|
||||
stageTwoApiError(error)
|
||||
|
||||
Reference in New Issue
Block a user