import { z } from 'zod'; import { RejectedActionResponseSchema, SuccessResponseSchema } from './common.js'; import { RedditAccountOwnerSchema } from './session.js'; export const MediaItemSchema = z.strictObject({ id: z.string(), chatUsername: z.string().nullable(), chatRoomId: z.string().nullable(), sender: z.string(), timestamp: z.number(), originalUrl: z.string(), fileName: z.string(), relativePath: z.string(), createdAt: z.number(), urlPath: z.string(), owner: RedditAccountOwnerSchema.optional(), }); export const MediaResponseSchema = z.array(MediaItemSchema); export const MediaSyncStatusSchema = z.strictObject({ isSyncing: z.boolean(), lastSyncAt: z.number().nullable(), lastSyncDurationMs: z.number().nullable(), lastSyncChats: z.number().nullable(), lastError: z.string().nullable(), nextSyncAt: z.number().nullable(), }); export const MediaSyncRequestSchema = z.strictObject({ full: z.boolean().optional() }); export const MediaSyncTriggerResponseSchema = z.union([ SuccessResponseSchema, RejectedActionResponseSchema, ]); export type MediaItem = z.infer; export type MediaSyncStatus = z.infer; export const MediaLibraryTagSchema = z.enum(['penis', 'chest', 'selfie', 'topless', 'feet']); export const MediaLibraryAssetSchema = z.strictObject({ id: z.string().uuid(), tags: z.array(MediaLibraryTagSchema), safety: z.enum(['sfw', 'nsfw', 'unknown']), classificationStatus: z.enum(['ready', 'failed']), description: z.string().nullable(), confidence: z.number().min(0).max(1).nullable(), fileName: z.string(), mimeType: z.enum(['image/jpeg', 'image/png', 'image/webp']), sizeBytes: z.number().int().nonnegative(), width: z.number().int().positive(), height: z.number().int().positive(), enabled: z.boolean(), consentConfirmedAt: z.number(), createdAt: z.number(), updatedAt: z.number(), sendCount: z.number().int().nonnegative(), lastSentAt: z.number().nullable(), urlPath: z.string(), }); export const MediaLibraryResponseSchema = z.array(MediaLibraryAssetSchema); export const MediaLibraryUpdateSchema = z.strictObject({ tags: z.array(MediaLibraryTagSchema).min(1), safety: z.enum(['sfw', 'nsfw']), enabled: z.boolean(), }); export type MediaLibraryTag = z.infer; export type MediaLibraryAsset = z.infer; export type MediaLibraryUpdate = z.infer;