project-nomad/admin/app/validators/curated_collections.ts

108 lines
2.9 KiB
TypeScript

import vine from '@vinejs/vine'
// ---- Versioned resource validators (with id + version) ----
export const specResourceValidator = vine.object({
id: vine.string(),
version: vine.string(),
title: vine.string(),
description: vine.string(),
url: vine.string().url(),
size_mb: vine.number().min(0).optional(),
})
// ---- ZIM Categories spec (versioned) ----
export const zimCategoriesSpecSchema = vine.object({
spec_version: vine.string(),
categories: vine.array(
vine.object({
name: vine.string(),
slug: vine.string(),
icon: vine.string(),
description: vine.string(),
language: vine.string().minLength(2).maxLength(5),
tiers: vine.array(
vine.object({
name: vine.string(),
slug: vine.string(),
description: vine.string(),
recommended: vine.boolean().optional(),
includesTier: vine.string().optional(),
resources: vine.array(specResourceValidator),
})
),
})
),
})
// ---- Maps spec (versioned) ----
export const mapsSpecSchema = vine.object({
spec_version: vine.string(),
collections: vine.array(
vine.object({
slug: vine.string(),
name: vine.string(),
description: vine.string(),
icon: vine.string(),
language: vine.string().minLength(2).maxLength(5),
resources: vine.array(specResourceValidator).minLength(1),
})
).minLength(1),
})
// ---- Wikipedia spec (versioned) ----
export const wikipediaSpecSchema = vine.object({
spec_version: vine.string(),
options: vine.array(
vine.object({
id: vine.string(),
name: vine.string(),
description: vine.string(),
size_mb: vine.number().min(0),
url: vine.string().url().nullable(),
version: vine.string().nullable(),
})
).minLength(1),
})
// ---- Creator Packs spec (versioned) ----
//
// Display metadata only — deliberately NO `url` field. The ZIM bytes are resolved
// through the entitlement Worker at install time (CreatorPackService), never from
// this public catalog. See project_content_creator_packs.
export const creatorPacksSpecSchema = vine.object({
spec_version: vine.string(),
packs: vine.array(
vine.object({
id: vine.string(),
name: vine.string(),
creator: vine.string(),
description: vine.string(),
version: vine.string(),
resource_id: vine.string(),
video_count: vine.number().min(0),
size_mb: vine.number().min(0),
license_id: vine.string(),
poster_url: vine.string().url().optional(),
logo_url: vine.string().url().optional(),
})
).minLength(1),
})
// ---- Wikipedia validators (used by ZimService) ----
export const wikipediaOptionSchema = vine.object({
id: vine.string(),
name: vine.string(),
description: vine.string(),
size_mb: vine.number().min(0),
url: vine.string().url().nullable(),
})
export const wikipediaOptionsFileSchema = vine.object({
options: vine.array(wikipediaOptionSchema).minLength(1),
})