67 lines
2.4 KiB
TypeScript
67 lines
2.4 KiB
TypeScript
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<typeof MediaItemSchema>;
|
|
export type MediaSyncStatus = z.infer<typeof MediaSyncStatusSchema>;
|
|
|
|
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<typeof MediaLibraryTagSchema>;
|
|
export type MediaLibraryAsset = z.infer<typeof MediaLibraryAssetSchema>;
|
|
export type MediaLibraryUpdate = z.infer<typeof MediaLibraryUpdateSchema>;
|