import { z } from 'zod'; /** * Admin API contract for /api/admin (admin-only). * * The admin service validates most bodies itself (returning {error,status}), so * these schemas pin the well-defined ones: user create/update, the permission * matrix, invites and the boolean feature toggles. Free-form bodies (OIDC * settings, addon config, default user settings) stay with the service. */ export const adminUserCreateRequestSchema = z.object({ email: z.string(), password: z.string().optional(), username: z.string().optional(), role: z.enum(['user', 'admin']).optional(), }); export type AdminUserCreateRequest = z.infer; export const adminPermissionsRequestSchema = z.object({ permissions: z.record(z.string(), z.unknown()), }); export type AdminPermissionsRequest = z.infer; export const adminInviteCreateRequestSchema = z.object({ max_uses: z.number().optional(), expires_in_days: z.number().optional(), role: z.enum(['user', 'admin']).optional(), // Optional trip binding (#1402): a user who registers via the link is // auto-added to this trip. Nullable/absent = a plain registration invite. trip_id: z.number().int().positive().nullable().optional(), }); export type AdminInviteCreateRequest = z.infer; export const adminFeatureToggleRequestSchema = z.object({ enabled: z.boolean(), }); export type AdminFeatureToggleRequest = z.infer;