/** * Admin API Response Helpers * * Consistent response formatting for all Admin API endpoints. */ import { NextResponse } from 'next/server' import type { z } from 'zod' import { getValidationErrorMessage, serializeZodIssues } from '@/lib/api/server' import type { AdminErrorResponse, AdminListResponse, AdminSingleResponse, PaginationMeta, } from '@/app/api/v1/admin/types' /** * Create a successful list response with pagination */ export function listResponse( data: T[], pagination: PaginationMeta ): NextResponse> { return NextResponse.json({ data, pagination }) } /** * Create a successful single resource response */ export function singleResponse(data: T): NextResponse> { return NextResponse.json({ data }) } /** * Create an error response */ export function errorResponse( code: string, message: string, status: number, details?: unknown ): NextResponse { const body: AdminErrorResponse = { error: { code, message }, } if (details !== undefined) { body.error.details = details } return NextResponse.json(body, { status }) } // ============================================================================= // Common Error Responses // ============================================================================= export function unauthorizedResponse(message = 'Authentication required'): NextResponse { return errorResponse('UNAUTHORIZED', message, 401) } export function forbiddenResponse(message = 'Access denied'): NextResponse { return errorResponse('FORBIDDEN', message, 403) } export function notFoundResponse(resource: string): NextResponse { return errorResponse('NOT_FOUND', `${resource} not found`, 404) } export function badRequestResponse(message: string, details?: unknown): NextResponse { return errorResponse('BAD_REQUEST', message, 400, details) } export function adminValidationErrorResponse(error: z.ZodError): NextResponse { return badRequestResponse( getValidationErrorMessage(error, 'Invalid request body'), serializeZodIssues(error) ) } export function adminInvalidJsonResponse(): NextResponse { return badRequestResponse('Request body must be valid JSON') } export function internalErrorResponse(message = 'Internal server error'): NextResponse { return errorResponse('INTERNAL_ERROR', message, 500) } export function notConfiguredResponse(): NextResponse { return errorResponse( 'NOT_CONFIGURED', 'Admin API is not configured. Set ADMIN_API_KEY environment variable.', 503 ) }