0ee63c139f
Attachments upload direct-to-storage on attach, so an abandoned attach (removed, cancelled, tab closed) would linger forever. Add IiosMediaObject: a row is recorded when bytes land (MediaService.put); a scheduled sweepOrphans() reaps objects past a grace window (IIOS_MEDIA_ORPHAN_GRACE_MS, default 24h) that no IiosMessagePart references (derived live — no flag to drift). Storage delete via the StoragePort; best-effort + idempotent. Gated on IIOS_MEDIA_GC_INTERVAL_MS (off by default). Migration 20260722193958_media_object_tracking. 10 media tests green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
25 lines
1.6 KiB
TypeScript
25 lines
1.6 KiB
TypeScript
import type { PrismaClient } from '@prisma/client';
|
|
|
|
/**
|
|
* FK-safe full reset for DB-backed specs. TRUNCATE … CASCADE clears every kernel
|
|
* table regardless of relation order, so specs don't each need to know the full
|
|
* delete order (which broke once Inbox added FK references to interaction/thread/actor).
|
|
*/
|
|
export async function resetDb(prisma: PrismaClient): Promise<void> {
|
|
await prisma.$executeRawUnsafe(
|
|
`TRUNCATE TABLE
|
|
"IiosRetentionPolicySnapshot","IiosComplianceHold","IiosProjectionCursor","IiosIdempotencyCommand","IiosDlqItem","IiosAuditLink",
|
|
"IiosMeetingActionItem","IiosActionItem","IiosTranscriptSegment","IiosMeetingTranscript","IiosMeetingSummary","IiosMeetingParticipant","IiosMeeting","IiosMeetingRequest",
|
|
"IiosCalendarSyncCursor","IiosCalendarEvent","IiosCalendarProviderAccount","IiosAvailabilityWindow",
|
|
"IiosAiEvidenceLink","IiosAiClaim","IiosAiToolCall","IiosAiArtifact","IiosAiModelRun","IiosAiJob","IiosEmbeddingRef",
|
|
"IiosRouteDecision","IiosRouteBinding","IiosModerationFlag",
|
|
"IiosInboundRawEvent","IiosDeliveryAttempt","IiosOutboundCommand","IiosRateLimitBucket","IiosMediaObject",
|
|
"IiosTicketStateHistory","IiosTicketThreadLink","IiosCallbackRequest","IiosTicket",
|
|
"IiosSupportTeamMember","IiosSupportQueue",
|
|
"IiosInboxItemStateHistory","IiosInboxItem","IiosUnreadCounter","IiosMessageReceipt",
|
|
"IiosOutboxEvent","IiosProcessedEvent","IiosMessagePart","IiosInteraction",
|
|
"IiosThreadParticipant","IiosThread","IiosActorRef","IiosSourceHandle","IiosChannel","IiosScope"
|
|
RESTART IDENTITY CASCADE`,
|
|
);
|
|
}
|