'use server' import type { CreateMediaInput, CreateMediaResult } from './types' import { getAuditRequestMetadata } from '@admin/actions/audit/get-audit-request-metadata' import { requireRole, UserRole } from '@admin/auth/middleware' import db from '@admin/db' import { adminMedia } from '@admin/db/schema' import { runAdminEventHooks } from '@admin/lib/lifecycle-hooks' import { getTouchedFieldNames } from '@admin/utils/audit/get-touched-field-names' import { toActionError } from '@admin/utils/error/to-action-error' import { updateTag } from 'next/cache' import { getMediaById } from './get-media-by-id' import { mediaCacheTags } from './types' export async function createMedia(data: CreateMediaInput): Promise { const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR]) try { const now = new Date().toISOString() const auditRequestMetadata = await getAuditRequestMetadata() const [row] = await db .insert(adminMedia) .values({ ...data, createdAt: now, updatedAt: now, createdBy: actor.id, updatedBy: actor.id }) .returning({ id: adminMedia.id }) if (row?.id) { updateTag(mediaCacheTags.all) updateTag(mediaCacheTags.byId(row.id)) } const media = row ? await getMediaById(row.id) : null if (media) { runAdminEventHooks({ category: 'media', action: 'create', targetType: 'media', targetId: media.id, targetLabel: media.filename, user: actor, timestamp: now, sourceType: 'admin_ui' as const, changedFields: getTouchedFieldNames(data as unknown as Record), metadata: { contentType: media.contentType, size: media.size }, ...auditRequestMetadata }) } return media ? { success: true, media } : { success: false, error: 'Failed to create media record' } } catch (error) { return { success: false, error: toActionError(error, 'Failed to create media record') } } }