28 lines
1.0 KiB
TypeScript
28 lines
1.0 KiB
TypeScript
'use server'
|
|
|
|
import { revalidatePath } from 'next/cache'
|
|
import { fileRepository } from '@/entities/file'
|
|
import { noteId } from '@/entities/note'
|
|
import { audit, blob, db, logger } from '@/shared/api'
|
|
import { ensureVisitor } from '@/shared/lib/visitor-session'
|
|
|
|
/** Remove an attachment the visitor attached: its row first, then its stored bytes. */
|
|
export async function deleteFile(id: string): Promise<void> {
|
|
try {
|
|
const key = noteId.parse(id)
|
|
const actor = await ensureVisitor()
|
|
const removed = await fileRepository(db()).remove(key, actor)
|
|
if (!removed) {
|
|
logger()?.info('file.deleted', { 'file.id': key, outcome: 'denied' })
|
|
return
|
|
}
|
|
await blob().del(removed.url)
|
|
await audit().log('file.deleted', { actor: { kind: 'human', id: actor }, target: { id: key } })
|
|
logger()?.info('file.deleted', { 'file.id': key, outcome: 'ok' })
|
|
revalidatePath('/')
|
|
} catch (error) {
|
|
logger()?.recordException(error, { 'conusai.action': 'file.deleted', 'file.id': id })
|
|
throw error
|
|
}
|
|
}
|