import { defineCollection } from 'astro:content'; import { glob } from 'astro/loaders'; import { z } from 'astro:schema'; const posts = defineCollection({ loader: glob({ pattern: '**/*.md', base: './src/content/posts' }), schema: z.object({ title: z.string(), // H1. 질문형 한 문장 category: z.enum(['A', 'B', 'C', 'D', 'E', 'F', 'G']), categoryLabel: z.string(), qbIds: z.array(z.string()), // QB 120 문항 ID summary: z.array(z.string()).min(2).max(4), // 세 줄 요약 (직접 답변 블록) description: z.string(), // meta description author: z.string(), // authors.json id reviewer: z.string().optional(), // 감수자 id (physicians) reviewStatus: z.enum(['reviewed', 'pending']).default('pending'), reviewedAt: z.string().optional(), // 의학 검토 완료일. reviewed일 때 필수로 쓴다 approvedBy: z.string().optional(), // 게시 승인자(의료기관 개설자·직함). v2 §12-2. 병원 입력으로만 채운다 approvedAt: z.string().optional(), // 게시 승인일. 색인 허용 빌드(PUBLIC_INDEXABLE=true)는 이 값이 있는 글만 낸다 datePublished: z.string(), dateModified: z.string(), video: z.object({ id: z.string(), title: z.string(), channel: z.string(), speaker: z.string().optional(), published: z.string().optional() }).optional(), videos: z.array(z.object({ id: z.string(), title: z.string(), speaker: z.string().optional(), published: z.string().optional(), note: z.string().optional() })).default([]), gallery: z.array(z.object({ src: z.string(), alt: z.string(), caption: z.string() })).default([]), thumbnail: z.string().optional(), hero: z.object({ src: z.string(), alt: z.string(), caption: z.string() }).optional(), faq: z.array(z.object({ q: z.string(), a: z.string() })).default([]), sources: z.array(z.object({ label: z.string(), url: z.string(), accessed: z.string(), type: z.enum(['clinic', 'doctor', 'product', 'regulation', 'platform', 'secondary']).optional() })).default([]), history: z.array(z.object({ date: z.string(), note: z.string() })).default([]), // 갱신 기록. 화면에 그대로 노출 tags: z.array(z.string()).default([]), }), }); export const collections = { posts };