Files
RedditBot/packages/api-contracts/src/media.ts
T

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>;