'use server' import type { UpdateMediaResult } 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 { getChangedFieldNames } from '@admin/utils/audit/get-changed-field-names' import { toActionError } from '@admin/utils/error/to-action-error' import { eq } from 'drizzle-orm' import { updateTag } from 'next/cache' import { mediaCacheTags } from './types' export async function updateMedia( id: string, data: { alt?: string; tags?: string[] } ): Promise { const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR]) try { const now = new Date().toISOString() const auditRequestMetadata = await getAuditRequestMetadata() const [previousMedia] = await db.select().from(adminMedia).where(eq(adminMedia.id, id)).limit(1) await db .update(adminMedia) .set({ ...data, updatedAt: now, updatedBy: actor.id }) .where(eq(adminMedia.id, id)) updateTag(mediaCacheTags.all) updateTag(mediaCacheTags.byId(id)) runAdminEventHooks({ category: 'media', action: 'update', targetType: 'media', targetId: id, targetLabel: previousMedia?.filename ?? id, user: actor, timestamp: now, sourceType: 'admin_ui' as const, changedFields: getChangedFieldNames( previousMedia as unknown as Record, data as Record ), metadata: { contentType: previousMedia?.contentType ?? null }, ...auditRequestMetadata }) return { success: true } } catch (error) { return { success: false, error: toActionError(error, 'Failed to update media') } } }