@twreporter-academy/api-types 0.0.26 → 0.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -199,6 +199,7 @@ export declare const V1CourseTagSchema: z.ZodObject<{
199
199
  name: z.ZodString;
200
200
  }, z.core.$strip>;
201
201
  export declare const V1ClassroomBySlugResponseSchema: z.ZodObject<{
202
+ id: z.ZodString;
202
203
  slug: z.ZodString;
203
204
  title: z.ZodString;
204
205
  subtitle: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"course.d.ts","sourceRoot":"","sources":["../../src/schemas/course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAavB,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,OAAO,EAAE,GACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3B,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAO/C,CAAA;AAEF,eAAO,MAAM,4BAA4B;;iBAEvC,CAAA;AAEF,eAAO,MAAM,gCAAgC;;;;;;;;;;;iBAI3C,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;iBAcP,CAAA;AAE1B,eAAO,MAAM,wBAAwB;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;iBASP,CAAA;AAE9B,eAAO,MAAM,sBAAsB;;;;;iBAQP,CAAA;AAE5B,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;iBAQP,CAAA;AAElC,eAAO,MAAM,oBAAoB;;;EAAuC,CAAA;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,eAAO,MAAM,yBAAyB;;;EAAyB,CAAA;AAE/D,eAAO,MAAM,wBAAwB;;;;;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAIP,CAAA;AAEjC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;iBAWP,CAAA;AAE/B,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA;AAEpC,6FAA6F;AAC7F,eAAO,MAAM,2BAA2B,qBAAmB,CAAA;AAE3D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;iBAiBP,CAAA;AAEhC,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA;AAEzC,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAA;AAEF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBf,CAAA;AAE7B,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBf,CAAA"}
1
+ {"version":3,"file":"course.d.ts","sourceRoot":"","sources":["../../src/schemas/course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAavB,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,OAAO,EAAE,GACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3B,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAO/C,CAAA;AAEF,eAAO,MAAM,4BAA4B;;iBAEvC,CAAA;AAEF,eAAO,MAAM,gCAAgC;;;;;;;;;;;iBAI3C,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;iBAcP,CAAA;AAE1B,eAAO,MAAM,wBAAwB;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;iBASP,CAAA;AAE9B,eAAO,MAAM,sBAAsB;;;;;iBAQP,CAAA;AAE5B,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;iBAQP,CAAA;AAElC,eAAO,MAAM,oBAAoB;;;EAAuC,CAAA;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,eAAO,MAAM,yBAAyB;;;EAAyB,CAAA;AAE/D,eAAO,MAAM,wBAAwB;;;;;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAIP,CAAA;AAEjC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;iBAWP,CAAA;AAE/B,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA;AAEpC,6FAA6F;AAC7F,eAAO,MAAM,2BAA2B,qBAAmB,CAAA;AAE3D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;iBAiBP,CAAA;AAEhC,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA;AAEzC,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAA;AAEF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBf,CAAA;AAE7B,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBf,CAAA"}
@@ -108,6 +108,8 @@ export const V1CourseTagSchema = z.object({
108
108
  name: z.string()
109
109
  });
110
110
  export const V1ClassroomBySlugResponseSchema = z.object({
111
+ /** Course Item ID (CMS / Keystone id as string) */
112
+ id: z.string(),
111
113
  slug: z.string(),
112
114
  title: z.string(),
113
115
  subtitle: z.string(),
@@ -1 +1 @@
1
- {"version":3,"file":"course.js","names":["z","internalServerErrorResponse","unauthorizedResponse","RestErrorBodySchema","CloudflareStreamVideoSchema","V1LessonProgressSchema","PhotoSchema","registry","CourseThumbnailSchema","JsonValueSchema","union","string","number","boolean","null","array","unknown","record","V1CourseSlugPathParamsSchema","object","slug","min","max","V1CourseBySlugMetaResponseSchema","ogTitle","ogDescription","ogImage","nullable","V1CourseLessonSchema","id","order","int","title","startSeconds","endSeconds","durationSeconds","progress","optional","openapi","V1CourseLessonMetaSchema","duration","V1CourseInstructorSchema","name","bio","avatar","V1CourseResourceSchema","description","downloadUrl","V1CourseFurtherReadingSchema","excerpt","thumbnail","url","V1CourseStatusSchema","enum","V1HeaderCourseBadgeSchema","V1HeaderCourseItemSchema","subtitle","badge","V1CoursesListResponseSchema","courses","V1CourseCatalogItemSchema","image","instructors","tags","status","launchAt","iso","datetime","V1CoursesCatalogResponseSchema","V1LearningCourseBadgeSchema","literal","V1LearningCourseItemSchema","completedLessons","nonnegative","totalLessons","progressPercent","unitTitle","describe","V1CoursesLearningListResponseSchema","V1CourseTagSchema","V1ClassroomBySlugResponseSchema","summary","previewVideoId","videoId","lessons","resources","furtherReading","V1CourseBySlugResponseSchema","estimatedDurationMinutes","trialVideos","lessonsMeta","heroImageVideo","heroImageVideoPortrait","heroImage","registerPath","method","path","responses","content","schema","request","params"],"sources":["../../src/schemas/course.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n internalServerErrorResponse,\n unauthorizedResponse,\n} from '../responses.js'\nimport { RestErrorBodySchema } from '../rest.js'\nimport { CloudflareStreamVideoSchema } from './cloudflare-stream.js'\nimport { V1LessonProgressSchema } from './lesson-progress.js'\nimport { PhotoSchema } from './photo.js'\nimport { registry } from './registry.js'\nimport { CourseThumbnailSchema } from './tag.js'\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | unknown[]\n | Record<string, unknown>\n\nexport const JsonValueSchema: z.ZodType<JsonValue> = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(z.unknown()),\n z.record(z.string(), z.unknown()),\n])\n\nexport const V1CourseSlugPathParamsSchema = z.object({\n slug: z.string().min(1).max(200),\n})\n\nexport const V1CourseBySlugMetaResponseSchema = z.object({\n ogTitle: z.string(),\n ogDescription: z.string(),\n ogImage: CourseThumbnailSchema.nullable(),\n})\n\nexport const V1CourseLessonSchema = z\n .object({\n id: z.string(),\n order: z.number().int(),\n title: z.string(),\n /** Segment start in the course video (seconds) */\n startSeconds: z.number().int(),\n /** Segment end in the course video (seconds) */\n endSeconds: z.number().int(),\n /** Derived segment length: max(0, endSeconds - startSeconds) */\n durationSeconds: z.number().int(),\n /** Present when request includes a valid member JWT; null when no progress record */\n progress: V1LessonProgressSchema.nullable().optional(),\n })\n .openapi('CourseLesson')\n\nexport const V1CourseLessonMetaSchema = z\n .object({\n order: z.number().int().nullable(),\n title: z.string(),\n /** Derived segment length: max(0, endSeconds - startSeconds) */\n duration: z.number().int(),\n })\n .openapi('CourseLessonMeta')\n\nexport const V1CourseInstructorSchema = z\n .object({\n id: z.string(),\n slug: z.string(),\n name: z.string(),\n title: z.string(),\n bio: z.string(),\n avatar: PhotoSchema.nullable(),\n })\n .openapi('CourseInstructor')\n\nexport const V1CourseResourceSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n /** GCS file URL; empty when no PDF uploaded */\n downloadUrl: z.string(),\n })\n .openapi('CourseResource')\n\nexport const V1CourseFurtherReadingSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n excerpt: z.string(),\n thumbnail: PhotoSchema.nullable(),\n url: z.string(),\n })\n .openapi('CourseFurtherReading')\n\nexport const V1CourseStatusSchema = z.enum(['published', 'coming_soon'])\nexport type V1CourseStatus = z.infer<typeof V1CourseStatusSchema>\n\nexport const V1HeaderCourseBadgeSchema = z.enum(['new', 'wip'])\n\nexport const V1HeaderCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n badge: V1HeaderCourseBadgeSchema.optional(),\n })\n .openapi('HeaderCourseItem')\n\nexport const V1CoursesListResponseSchema = z\n .object({\n courses: z.array(V1HeaderCourseItemSchema),\n })\n .openapi('CoursesListResponse')\n\nexport const V1CourseCatalogItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n image: CourseThumbnailSchema.nullable(),\n instructors: z.array(z.object({ name: z.string() })),\n tags: z.array(z.object({ slug: z.string(), name: z.string() })),\n status: V1CourseStatusSchema,\n launchAt: z.iso.datetime().nullable(),\n })\n .openapi('CourseCatalogItem')\n\nexport const V1CoursesCatalogResponseSchema = z\n .object({\n courses: z.array(V1CourseCatalogItemSchema),\n })\n .openapi('CoursesCatalogResponse')\n\n/** Learning badge is only `new`; `wip` / coming_soon courses are excluded from this list. */\nexport const V1LearningCourseBadgeSchema = z.literal('new')\n\nexport const V1LearningCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n image: PhotoSchema.nullable(),\n badge: V1LearningCourseBadgeSchema.optional(),\n launchAt: z.iso.datetime().nullable(),\n completedLessons: z.number().int().nonnegative(),\n totalLessons: z.number().int().nonnegative(),\n progressPercent: z.number().int().min(0).max(100),\n /** Title of the next incomplete lesson; last lesson title when every lesson is complete. */\n unitTitle: z\n .string()\n .describe(\n 'Title of the next incomplete lesson; last lesson title when every lesson is complete.'\n ),\n })\n .openapi('LearningCourseItem')\n\nexport const V1CoursesLearningListResponseSchema = z\n .object({\n courses: z.array(V1LearningCourseItemSchema),\n })\n .openapi('CoursesLearningListResponse')\n\nexport const V1CourseTagSchema = z.object({\n slug: z.string(),\n name: z.string(),\n})\n\nexport const V1ClassroomBySlugResponseSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n /** published: full payload; coming_soon: lessons/resources/furtherReading/previewVideoId stripped */\n status: V1CourseStatusSchema,\n tags: z.array(V1CourseTagSchema),\n /** Trial/preview stream only; null when unconfigured or course is coming_soon */\n previewVideoId: z.string().nullable(),\n /** Course video Cloudflare stream id; null when unpaid or not set */\n videoId: z.string().nullable(),\n lessons: z.array(V1CourseLessonSchema),\n instructors: z.array(V1CourseInstructorSchema),\n resources: z.array(V1CourseResourceSchema),\n furtherReading: z.array(V1CourseFurtherReadingSchema),\n })\n .openapi('ClassroomDetail')\n\nexport const V1CourseBySlugResponseSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n launchAt: z.iso.datetime().nullable(),\n estimatedDurationMinutes: z.number().int().nullable(),\n /** Null when unset or the Lexical document has no content */\n description: JsonValueSchema.nullable(),\n status: V1CourseStatusSchema,\n tags: z.array(V1CourseTagSchema),\n trialVideos: z.array(CloudflareStreamVideoSchema).nullable(),\n lessonsMeta: z.array(V1CourseLessonMetaSchema),\n instructors: z.array(V1CourseInstructorSchema),\n heroImageVideo: CloudflareStreamVideoSchema.nullable(),\n heroImageVideoPortrait: CloudflareStreamVideoSchema.nullable(),\n heroImage: PhotoSchema.nullable(),\n })\n .openapi('CourseDetail')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses',\n tags: ['Courses'],\n description: 'Header course list.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesListResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/catalog',\n tags: ['Courses'],\n description: 'Public course catalog.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesCatalogResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/meta',\n tags: ['Courses'],\n description: 'OG metadata for a course page.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CourseBySlugMetaResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/classroom',\n tags: ['Courses'],\n description:\n 'Classroom course detail. Optional Bearer JWT: paid members receive videoId and lesson progress; unpaid or anonymous requests get videoId null and downloadUrl redacted. When status is coming_soon, lessons, resources, furtherReading, and previewVideoId are empty/null while title, summary, tags, and instructors remain visible.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1ClassroomBySlugResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}',\n tags: ['Courses'],\n description:\n 'Public course landing page. Includes Lexical description, trial videos, lesson metadata, instructors, and hero media.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CourseBySlugResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"course.js","names":["z","internalServerErrorResponse","unauthorizedResponse","RestErrorBodySchema","CloudflareStreamVideoSchema","V1LessonProgressSchema","PhotoSchema","registry","CourseThumbnailSchema","JsonValueSchema","union","string","number","boolean","null","array","unknown","record","V1CourseSlugPathParamsSchema","object","slug","min","max","V1CourseBySlugMetaResponseSchema","ogTitle","ogDescription","ogImage","nullable","V1CourseLessonSchema","id","order","int","title","startSeconds","endSeconds","durationSeconds","progress","optional","openapi","V1CourseLessonMetaSchema","duration","V1CourseInstructorSchema","name","bio","avatar","V1CourseResourceSchema","description","downloadUrl","V1CourseFurtherReadingSchema","excerpt","thumbnail","url","V1CourseStatusSchema","enum","V1HeaderCourseBadgeSchema","V1HeaderCourseItemSchema","subtitle","badge","V1CoursesListResponseSchema","courses","V1CourseCatalogItemSchema","image","instructors","tags","status","launchAt","iso","datetime","V1CoursesCatalogResponseSchema","V1LearningCourseBadgeSchema","literal","V1LearningCourseItemSchema","completedLessons","nonnegative","totalLessons","progressPercent","unitTitle","describe","V1CoursesLearningListResponseSchema","V1CourseTagSchema","V1ClassroomBySlugResponseSchema","summary","previewVideoId","videoId","lessons","resources","furtherReading","V1CourseBySlugResponseSchema","estimatedDurationMinutes","trialVideos","lessonsMeta","heroImageVideo","heroImageVideoPortrait","heroImage","registerPath","method","path","responses","content","schema","request","params"],"sources":["../../src/schemas/course.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n internalServerErrorResponse,\n unauthorizedResponse,\n} from '../responses.js'\nimport { RestErrorBodySchema } from '../rest.js'\nimport { CloudflareStreamVideoSchema } from './cloudflare-stream.js'\nimport { V1LessonProgressSchema } from './lesson-progress.js'\nimport { PhotoSchema } from './photo.js'\nimport { registry } from './registry.js'\nimport { CourseThumbnailSchema } from './tag.js'\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | unknown[]\n | Record<string, unknown>\n\nexport const JsonValueSchema: z.ZodType<JsonValue> = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(z.unknown()),\n z.record(z.string(), z.unknown()),\n])\n\nexport const V1CourseSlugPathParamsSchema = z.object({\n slug: z.string().min(1).max(200),\n})\n\nexport const V1CourseBySlugMetaResponseSchema = z.object({\n ogTitle: z.string(),\n ogDescription: z.string(),\n ogImage: CourseThumbnailSchema.nullable(),\n})\n\nexport const V1CourseLessonSchema = z\n .object({\n id: z.string(),\n order: z.number().int(),\n title: z.string(),\n /** Segment start in the course video (seconds) */\n startSeconds: z.number().int(),\n /** Segment end in the course video (seconds) */\n endSeconds: z.number().int(),\n /** Derived segment length: max(0, endSeconds - startSeconds) */\n durationSeconds: z.number().int(),\n /** Present when request includes a valid member JWT; null when no progress record */\n progress: V1LessonProgressSchema.nullable().optional(),\n })\n .openapi('CourseLesson')\n\nexport const V1CourseLessonMetaSchema = z\n .object({\n order: z.number().int().nullable(),\n title: z.string(),\n /** Derived segment length: max(0, endSeconds - startSeconds) */\n duration: z.number().int(),\n })\n .openapi('CourseLessonMeta')\n\nexport const V1CourseInstructorSchema = z\n .object({\n id: z.string(),\n slug: z.string(),\n name: z.string(),\n title: z.string(),\n bio: z.string(),\n avatar: PhotoSchema.nullable(),\n })\n .openapi('CourseInstructor')\n\nexport const V1CourseResourceSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n /** GCS file URL; empty when no PDF uploaded */\n downloadUrl: z.string(),\n })\n .openapi('CourseResource')\n\nexport const V1CourseFurtherReadingSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n excerpt: z.string(),\n thumbnail: PhotoSchema.nullable(),\n url: z.string(),\n })\n .openapi('CourseFurtherReading')\n\nexport const V1CourseStatusSchema = z.enum(['published', 'coming_soon'])\nexport type V1CourseStatus = z.infer<typeof V1CourseStatusSchema>\n\nexport const V1HeaderCourseBadgeSchema = z.enum(['new', 'wip'])\n\nexport const V1HeaderCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n badge: V1HeaderCourseBadgeSchema.optional(),\n })\n .openapi('HeaderCourseItem')\n\nexport const V1CoursesListResponseSchema = z\n .object({\n courses: z.array(V1HeaderCourseItemSchema),\n })\n .openapi('CoursesListResponse')\n\nexport const V1CourseCatalogItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n image: CourseThumbnailSchema.nullable(),\n instructors: z.array(z.object({ name: z.string() })),\n tags: z.array(z.object({ slug: z.string(), name: z.string() })),\n status: V1CourseStatusSchema,\n launchAt: z.iso.datetime().nullable(),\n })\n .openapi('CourseCatalogItem')\n\nexport const V1CoursesCatalogResponseSchema = z\n .object({\n courses: z.array(V1CourseCatalogItemSchema),\n })\n .openapi('CoursesCatalogResponse')\n\n/** Learning badge is only `new`; `wip` / coming_soon courses are excluded from this list. */\nexport const V1LearningCourseBadgeSchema = z.literal('new')\n\nexport const V1LearningCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n image: PhotoSchema.nullable(),\n badge: V1LearningCourseBadgeSchema.optional(),\n launchAt: z.iso.datetime().nullable(),\n completedLessons: z.number().int().nonnegative(),\n totalLessons: z.number().int().nonnegative(),\n progressPercent: z.number().int().min(0).max(100),\n /** Title of the next incomplete lesson; last lesson title when every lesson is complete. */\n unitTitle: z\n .string()\n .describe(\n 'Title of the next incomplete lesson; last lesson title when every lesson is complete.'\n ),\n })\n .openapi('LearningCourseItem')\n\nexport const V1CoursesLearningListResponseSchema = z\n .object({\n courses: z.array(V1LearningCourseItemSchema),\n })\n .openapi('CoursesLearningListResponse')\n\nexport const V1CourseTagSchema = z.object({\n slug: z.string(),\n name: z.string(),\n})\n\nexport const V1ClassroomBySlugResponseSchema = z\n .object({\n /** Course Item ID (CMS / Keystone id as string) */\n id: z.string(),\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n /** published: full payload; coming_soon: lessons/resources/furtherReading/previewVideoId stripped */\n status: V1CourseStatusSchema,\n tags: z.array(V1CourseTagSchema),\n /** Trial/preview stream only; null when unconfigured or course is coming_soon */\n previewVideoId: z.string().nullable(),\n /** Course video Cloudflare stream id; null when unpaid or not set */\n videoId: z.string().nullable(),\n lessons: z.array(V1CourseLessonSchema),\n instructors: z.array(V1CourseInstructorSchema),\n resources: z.array(V1CourseResourceSchema),\n furtherReading: z.array(V1CourseFurtherReadingSchema),\n })\n .openapi('ClassroomDetail')\n\nexport const V1CourseBySlugResponseSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n launchAt: z.iso.datetime().nullable(),\n estimatedDurationMinutes: z.number().int().nullable(),\n /** Null when unset or the Lexical document has no content */\n description: JsonValueSchema.nullable(),\n status: V1CourseStatusSchema,\n tags: z.array(V1CourseTagSchema),\n trialVideos: z.array(CloudflareStreamVideoSchema).nullable(),\n lessonsMeta: z.array(V1CourseLessonMetaSchema),\n instructors: z.array(V1CourseInstructorSchema),\n heroImageVideo: CloudflareStreamVideoSchema.nullable(),\n heroImageVideoPortrait: CloudflareStreamVideoSchema.nullable(),\n heroImage: PhotoSchema.nullable(),\n })\n .openapi('CourseDetail')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses',\n tags: ['Courses'],\n description: 'Header course list.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesListResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/catalog',\n tags: ['Courses'],\n description: 'Public course catalog.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesCatalogResponseSchema },\n },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/meta',\n tags: ['Courses'],\n description: 'OG metadata for a course page.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CourseBySlugMetaResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}/classroom',\n tags: ['Courses'],\n description:\n 'Classroom course detail. Optional Bearer JWT: paid members receive videoId and lesson progress; unpaid or anonymous requests get videoId null and downloadUrl redacted. When status is coming_soon, lessons, resources, furtherReading, and previewVideoId are empty/null while title, summary, tags, and instructors remain visible.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1ClassroomBySlugResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/courses/{slug}',\n tags: ['Courses'],\n description:\n 'Public course landing page. Includes Lexical description, trial videos, lesson metadata, instructors, and hero media.',\n request: { params: V1CourseSlugPathParamsSchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CourseBySlugResponseSchema },\n },\n },\n 400: {\n description: 'Bad request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 404: {\n description: 'Course not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
@@ -71,6 +71,7 @@ export declare const V1MemberProfileResponseSchema: z.ZodObject<{
71
71
  export declare const V1AccessTokenResponseSchema: z.ZodObject<{
72
72
  accessToken: z.ZodString;
73
73
  twreporterUserId: z.ZodString;
74
+ academyMemberId: z.ZodString;
74
75
  expiresAt: z.ZodNumber;
75
76
  }, z.core.$strip>;
76
77
  export declare const V1RevokeMemberCacheBodySchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"member.d.ts","sourceRoot":"","sources":["../../src/schemas/member.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAUvB,eAAO,MAAM,qBAAqB;;iBAYP,CAAA;AAE3B,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;2BAiBP,CAAA;AAEzB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBAcP,CAAA;AAE3B,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;iBAAwB,CAAA;AAElE,eAAO,MAAM,2BAA2B;;;;iBAMP,CAAA;AAEjC,eAAO,MAAM,6BAA6B;;iBAIP,CAAA;AAEnC,eAAO,MAAM,gCAAgC;;;EAAmC,CAAA;AAEhF,eAAO,MAAM,iCAAiC;;;;;;iBAKP,CAAA"}
1
+ {"version":3,"file":"member.d.ts","sourceRoot":"","sources":["../../src/schemas/member.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAUvB,eAAO,MAAM,qBAAqB;;iBAYP,CAAA;AAE3B,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;2BAiBP,CAAA;AAEzB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBAcP,CAAA;AAE3B,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;iBAAwB,CAAA;AAElE,eAAO,MAAM,2BAA2B;;;;;iBAOP,CAAA;AAEjC,eAAO,MAAM,6BAA6B;;iBAIP,CAAA;AAEnC,eAAO,MAAM,gCAAgC;;;EAAmC,CAAA;AAEhF,eAAO,MAAM,iCAAiC;;;;;;iBAKP,CAAA"}
@@ -45,6 +45,7 @@ export const V1MemberProfileResponseSchema = V1MemberProfileSchema;
45
45
  export const V1AccessTokenResponseSchema = z.object({
46
46
  accessToken: z.string(),
47
47
  twreporterUserId: z.string(),
48
+ academyMemberId: z.string(),
48
49
  expiresAt: z.number()
49
50
  }).openapi('AccessTokenResponse');
50
51
  export const V1RevokeMemberCacheBodySchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"member.js","names":["z","internalServerErrorResponse","unauthorizedResponse","RestErrorBodySchema","V1CoursesLearningListResponseSchema","registry","V1MemberMeQuerySchema","object","refreshAccess","preprocess","v","undefined","Array","isArray","boolean","optional","openapi","V1AcademyPlanSchema","discriminatedUnion","type","literal","accessUntil","null","iso","datetime","nullable","V1MemberProfileSchema","id","string","email","name","twreporterUserId","hasAccess","plan","role","deprecated","description","createdAt","V1MemberProfileResponseSchema","V1AccessTokenResponseSchema","accessToken","expiresAt","number","V1RevokeMemberCacheBodySchema","V1RevokeMemberCacheOutcomeSchema","enum","V1RevokeMemberCacheResponseSchema","ok","outcome","registerPath","method","path","tags","responses","content","schema","request","query","body"],"sources":["../../src/schemas/member.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n internalServerErrorResponse,\n unauthorizedResponse,\n} from '../responses.js'\nimport { RestErrorBodySchema } from '../rest.js'\nimport { V1CoursesLearningListResponseSchema } from './course.js'\nimport { registry } from './registry.js'\n\nexport const V1MemberMeQuerySchema = z\n .object({\n refreshAccess: z\n .preprocess((v) => {\n if (v === undefined) return undefined\n if (Array.isArray(v)) return v[0]\n if (v === true || v === 'true' || v === '1') return true\n if (v === false || v === 'false' || v === '0') return false\n return v\n }, z.boolean())\n .optional(),\n })\n .openapi('MemberMeQuery')\n\nexport const V1AcademyPlanSchema = z\n .discriminatedUnion('type', [\n z.object({ type: z.literal('monthly'), accessUntil: z.null() }),\n z.object({\n type: z.literal('oneTime'),\n accessUntil: z.iso.datetime().nullable(),\n }),\n z.object({\n type: z.literal('staffPass'),\n accessUntil: z.null(),\n }),\n z.object({\n type: z.literal('publicWelfarePass'),\n accessUntil: z.iso.datetime().nullable(),\n }),\n z.object({ type: z.literal('none'), accessUntil: z.null() }),\n ])\n .openapi('AcademyPlan')\n\nexport const V1MemberProfileSchema = z\n .object({\n id: z.string(),\n email: z.string(),\n name: z.string(),\n twreporterUserId: z.string(),\n hasAccess: z.boolean(),\n plan: V1AcademyPlanSchema,\n role: z.string().nullable().openapi({\n deprecated: true,\n description: 'Legacy upstream TW Reporter role; use plan instead.',\n }),\n createdAt: z.iso.datetime().nullable().optional(),\n })\n .openapi('MemberProfile')\n\nexport const V1MemberProfileResponseSchema = V1MemberProfileSchema\n\nexport const V1AccessTokenResponseSchema = z\n .object({\n accessToken: z.string(),\n twreporterUserId: z.string(),\n expiresAt: z.number(),\n })\n .openapi('AccessTokenResponse')\n\nexport const V1RevokeMemberCacheBodySchema = z\n .object({\n email: z.email(),\n })\n .openapi('RevokeMemberCacheBody')\n\nexport const V1RevokeMemberCacheOutcomeSchema = z.enum(['revoked', 'not_found'])\n\nexport const V1RevokeMemberCacheResponseSchema = z\n .object({\n ok: z.literal(true),\n outcome: V1RevokeMemberCacheOutcomeSchema,\n })\n .openapi('RevokeMemberCacheResponse')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'post',\n path: '/auth/access-token',\n tags: ['Auth'],\n description:\n 'Exchange id_token cookie for a JWT access token. Creates the member on first login.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1AccessTokenResponseSchema },\n },\n },\n 400: {\n description: 'Bad request — missing id_token cookie',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — missing, invalid, or disallowed Origin',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/members/me',\n tags: ['Members'],\n description:\n 'Get the authenticated member profile. Set refreshAccess=true to bypass the MemberAccess cache and re-fetch roles from go-api.',\n request: {\n query: V1MemberMeQuerySchema,\n },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1MemberProfileResponseSchema },\n },\n },\n 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/members/me/learning-courses',\n tags: ['Members'],\n description:\n 'Authenticated my-learning list of published courses with watch history. Includes completion progress. unitTitle is the next incomplete lesson (CMS order asc), or the last lesson when all are complete. Sorted by the latest lesson progress date descending. Does not require membership hasAccess (free-lesson history included). Requires Bearer JWT.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesLearningListResponseSchema },\n },\n },\n 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/admin/members/revoke-cache',\n tags: ['Admin'],\n description:\n 'Invalidate MemberAccess cache for a member by email (clear checkedAt). Requires a Google OIDC ID token from an allowlisted caller. Terminal outcomes (revoked, not_found) always return 200 so Pub/Sub push can acknowledge delivery.',\n request: {\n body: {\n content: {\n 'application/json': { schema: V1RevokeMemberCacheBodySchema },\n },\n },\n },\n responses: {\n 200: {\n description: 'Request processed. outcome is revoked or not_found.',\n content: {\n 'application/json': { schema: V1RevokeMemberCacheResponseSchema },\n },\n },\n 400: {\n description: 'Invalid request body',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 401: {\n description: 'Unauthorized — missing or invalid GCP IAM token',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — valid token but caller not allowlisted',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"member.js","names":["z","internalServerErrorResponse","unauthorizedResponse","RestErrorBodySchema","V1CoursesLearningListResponseSchema","registry","V1MemberMeQuerySchema","object","refreshAccess","preprocess","v","undefined","Array","isArray","boolean","optional","openapi","V1AcademyPlanSchema","discriminatedUnion","type","literal","accessUntil","null","iso","datetime","nullable","V1MemberProfileSchema","id","string","email","name","twreporterUserId","hasAccess","plan","role","deprecated","description","createdAt","V1MemberProfileResponseSchema","V1AccessTokenResponseSchema","accessToken","academyMemberId","expiresAt","number","V1RevokeMemberCacheBodySchema","V1RevokeMemberCacheOutcomeSchema","enum","V1RevokeMemberCacheResponseSchema","ok","outcome","registerPath","method","path","tags","responses","content","schema","request","query","body"],"sources":["../../src/schemas/member.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n internalServerErrorResponse,\n unauthorizedResponse,\n} from '../responses.js'\nimport { RestErrorBodySchema } from '../rest.js'\nimport { V1CoursesLearningListResponseSchema } from './course.js'\nimport { registry } from './registry.js'\n\nexport const V1MemberMeQuerySchema = z\n .object({\n refreshAccess: z\n .preprocess((v) => {\n if (v === undefined) return undefined\n if (Array.isArray(v)) return v[0]\n if (v === true || v === 'true' || v === '1') return true\n if (v === false || v === 'false' || v === '0') return false\n return v\n }, z.boolean())\n .optional(),\n })\n .openapi('MemberMeQuery')\n\nexport const V1AcademyPlanSchema = z\n .discriminatedUnion('type', [\n z.object({ type: z.literal('monthly'), accessUntil: z.null() }),\n z.object({\n type: z.literal('oneTime'),\n accessUntil: z.iso.datetime().nullable(),\n }),\n z.object({\n type: z.literal('staffPass'),\n accessUntil: z.null(),\n }),\n z.object({\n type: z.literal('publicWelfarePass'),\n accessUntil: z.iso.datetime().nullable(),\n }),\n z.object({ type: z.literal('none'), accessUntil: z.null() }),\n ])\n .openapi('AcademyPlan')\n\nexport const V1MemberProfileSchema = z\n .object({\n id: z.string(),\n email: z.string(),\n name: z.string(),\n twreporterUserId: z.string(),\n hasAccess: z.boolean(),\n plan: V1AcademyPlanSchema,\n role: z.string().nullable().openapi({\n deprecated: true,\n description: 'Legacy upstream TW Reporter role; use plan instead.',\n }),\n createdAt: z.iso.datetime().nullable().optional(),\n })\n .openapi('MemberProfile')\n\nexport const V1MemberProfileResponseSchema = V1MemberProfileSchema\n\nexport const V1AccessTokenResponseSchema = z\n .object({\n accessToken: z.string(),\n twreporterUserId: z.string(),\n academyMemberId: z.string(),\n expiresAt: z.number(),\n })\n .openapi('AccessTokenResponse')\n\nexport const V1RevokeMemberCacheBodySchema = z\n .object({\n email: z.email(),\n })\n .openapi('RevokeMemberCacheBody')\n\nexport const V1RevokeMemberCacheOutcomeSchema = z.enum(['revoked', 'not_found'])\n\nexport const V1RevokeMemberCacheResponseSchema = z\n .object({\n ok: z.literal(true),\n outcome: V1RevokeMemberCacheOutcomeSchema,\n })\n .openapi('RevokeMemberCacheResponse')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'post',\n path: '/auth/access-token',\n tags: ['Auth'],\n description:\n 'Exchange id_token cookie for a JWT access token. Creates the member on first login.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1AccessTokenResponseSchema },\n },\n },\n 400: {\n description: 'Bad request — missing id_token cookie',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — missing, invalid, or disallowed Origin',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/members/me',\n tags: ['Members'],\n description:\n 'Get the authenticated member profile. Set refreshAccess=true to bypass the MemberAccess cache and re-fetch roles from go-api.',\n request: {\n query: V1MemberMeQuerySchema,\n },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1MemberProfileResponseSchema },\n },\n },\n 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/members/me/learning-courses',\n tags: ['Members'],\n description:\n 'Authenticated my-learning list of published courses with watch history. Includes completion progress. unitTitle is the next incomplete lesson (CMS order asc), or the last lesson when all are complete. Sorted by the latest lesson progress date descending. Does not require membership hasAccess (free-lesson history included). Requires Bearer JWT.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesLearningListResponseSchema },\n },\n },\n 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/admin/members/revoke-cache',\n tags: ['Admin'],\n description:\n 'Invalidate MemberAccess cache for a member by email (clear checkedAt). Requires a Google OIDC ID token from an allowlisted caller. Terminal outcomes (revoked, not_found) always return 200 so Pub/Sub push can acknowledge delivery.',\n request: {\n body: {\n content: {\n 'application/json': { schema: V1RevokeMemberCacheBodySchema },\n },\n },\n },\n responses: {\n 200: {\n description: 'Request processed. outcome is revoked or not_found.',\n content: {\n 'application/json': { schema: V1RevokeMemberCacheResponseSchema },\n },\n },\n 400: {\n description: 'Invalid request body',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 401: {\n description: 'Unauthorized — missing or invalid GCP IAM token',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — valid token but caller not allowlisted',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twreporter-academy/api-types",
3
- "version": "0.0.26",
3
+ "version": "0.0.27",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": [