import { z } from "@hono/zod-openapi"; import { BIAS, RELIABILITY, SENTIMENT, TRANSPARENCY } from "../constants"; // schemas export const idSchema = z.uuid(); export const dateRangeSchema = z.object({ end: z.coerce.date(), start: z.coerce.date(), }); export const limitSchema = z.number().int().min(1).max(100); export const sentimentSchema = z.enum(SENTIMENT); export const biasSchema = z.enum(BIAS); export const reliabilitySchema = z.enum(RELIABILITY); export const transparencySchema = z.enum(TRANSPARENCY); export const credibilitySchema = z.object({ bias: biasSchema.default("neutral"), reliability: reliabilitySchema.default("average"), transparency: transparencySchema.default("medium"), }); export const deviceSchema = z.object({ client: z.string().optional(), device: z.string().optional(), isBot: z.boolean(), operatingSystem: z.string().optional(), }); export const geoLocationSchema = z.object({ accuracyRadius: z.number().optional(), city: z.string().optional(), country: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional(), timeZone: z.string().optional(), }); export const distrubtionSchema = z.object({ count: z.number().int(), id: idSchema, name: z.string(), percentage: z.number(), }); export const getDistributionsSchema = z.object({ id: idSchema.optional(), limit: limitSchema.optional(), }); export const getPublicationsSchema = z.object({ id: idSchema.optional(), range: dateRangeSchema.optional(), }); export const distributionsSchema = z.object({ items: z.array(distrubtionSchema), total: z.number().int(), }); export const publicationSchema = z.object({ count: z.number().int(), date: z.string(), }); export const deltaSchema = z.object({ delta: z.number(), percentage: z.number(), sign: z.enum(["+", "-"]), variant: z.enum(["increase", "decrease", "positive"]), }); export const publicationMetaSchema = z.object({ current: z.number(), delta: deltaSchema, previous: z.number(), }); export const publicationsSchema = z.object({ items: z.array(publicationSchema), meta: publicationMetaSchema.optional(), }); export const paginationCursorSchema = z.object({ date: z.string(), id: z.string(), }); export const paginationRequestSchema = z.object({ cursor: z.string().nullable().optional(), limit: limitSchema.optional(), page: z.number().nonnegative().default(1).optional(), }); export const paginationStateSchema = z.object({ cursor: z.string().nullable(), limit: z.number().int(), offset: z.number().int(), page: z.number().int(), payload: paginationCursorSchema.nullable(), }); export const paginationMetaSchema = z.object({ current: z.number().int(), cursor: z.string().nullable(), hasNext: z.boolean(), limit: z.number().int(), nextCursor: z.string().nullable(), }); // types export type PaginatedResult = { items: T[]; meta: PaginationMeta; }; export type ID = z.infer; export type DateRange = z.infer; export type Sentiment = z.infer; export type Bias = z.infer; export type Reliability = z.infer; export type Transparency = z.infer; export type Credibility = z.infer; export type Device = z.infer; export type GeoLocation = z.infer; export type Distribution = z.infer; export type Distributions = z.infer; export type Publication = z.infer; export type Publications = z.infer; export type PublicationMeta = z.infer; export type Delta = z.infer; export type PaginationCursor = z.infer; export type PaginationRequest = z.infer; export type PaginationState = z.infer; export type PaginationMeta = z.infer;