/** * GET /api/v1/admin/users * * List all users with pagination. * * Query Parameters: * - limit: number (default: 50, max: 250) * - offset: number (default: 0) * * Response: AdminListResponse */ import { db } from '@sim/db' import { user } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { count } from 'drizzle-orm' import { adminV1ListUsersContract } from '@/lib/api/contracts/v1/admin' import { parseRequest } from '@/lib/api/server' import { withRouteHandler } from '@/lib/core/utils/with-route-handler' import { withAdminAuth } from '@/app/api/v1/admin/middleware' import { adminValidationErrorResponse, internalErrorResponse, listResponse, } from '@/app/api/v1/admin/responses' import { type AdminUser, createPaginationMeta, toAdminUser } from '@/app/api/v1/admin/types' const logger = createLogger('AdminUsersAPI') export const GET = withRouteHandler( withAdminAuth(async (request) => { const parsed = await parseRequest( adminV1ListUsersContract, request, {}, { validationErrorResponse: adminValidationErrorResponse, } ) if (!parsed.success) return parsed.response const { limit, offset } = parsed.data.query try { const [countResult, users] = await Promise.all([ db.select({ total: count() }).from(user), db.select().from(user).orderBy(user.name).limit(limit).offset(offset), ]) const total = countResult[0].total const data: AdminUser[] = users.map(toAdminUser) const pagination = createPaginationMeta(total, limit, offset) logger.info(`Admin API: Listed ${data.length} users (total: ${total})`) return listResponse(data, pagination) } catch (error) { logger.error('Admin API: Failed to list users', { error }) return internalErrorResponse('Failed to list users') } }) )