@twreporter-academy/api-types 0.0.24 → 0.0.26
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.
- package/dist/openapi.d.ts +6 -0
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +6 -0
- package/dist/openapi.js.map +1 -1
- package/dist/schemas/activity.d.ts +42 -0
- package/dist/schemas/activity.d.ts.map +1 -1
- package/dist/schemas/activity.js +34 -0
- package/dist/schemas/activity.js.map +1 -1
- package/dist/schemas/course.d.ts.map +1 -1
- package/dist/schemas/course.js +40 -4
- package/dist/schemas/course.js.map +1 -1
- package/package.json +1 -1
package/dist/openapi.d.ts
CHANGED
|
@@ -19,6 +19,12 @@ export declare function getOpenApiDocument(): {
|
|
|
19
19
|
} | {
|
|
20
20
|
readonly name: "Courses";
|
|
21
21
|
readonly description: "Course metadata and classroom detail.";
|
|
22
|
+
} | {
|
|
23
|
+
readonly name: "Posts";
|
|
24
|
+
readonly description: "Header posts and the public post catalog.";
|
|
25
|
+
} | {
|
|
26
|
+
readonly name: "Activities";
|
|
27
|
+
readonly description: "Header activities and the public activity catalog.";
|
|
22
28
|
} | {
|
|
23
29
|
readonly name: "Home";
|
|
24
30
|
readonly description: "Home page data including posts, activities, and courses.";
|
package/dist/openapi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AACA,OAAO,uBAAuB,CAAA;AAC9B,OAAO,qBAAqB,CAAA;AAC5B,OAAO,qBAAqB,CAAA;AAC5B,OAAO,mBAAmB,CAAA;AAC1B,OAAO,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AACA,OAAO,uBAAuB,CAAA;AAC9B,OAAO,qBAAqB,CAAA;AAC5B,OAAO,qBAAqB,CAAA;AAC5B,OAAO,mBAAmB,CAAA;AAC1B,OAAO,mBAAmB,CAAA;AA0B1B,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcjC"}
|
package/dist/openapi.js
CHANGED
|
@@ -21,6 +21,12 @@ const openApiRootTags = [{
|
|
|
21
21
|
}, {
|
|
22
22
|
name: 'Courses',
|
|
23
23
|
description: 'Course metadata and classroom detail.'
|
|
24
|
+
}, {
|
|
25
|
+
name: 'Posts',
|
|
26
|
+
description: 'Header posts and the public post catalog.'
|
|
27
|
+
}, {
|
|
28
|
+
name: 'Activities',
|
|
29
|
+
description: 'Header activities and the public activity catalog.'
|
|
24
30
|
}, {
|
|
25
31
|
name: 'Home',
|
|
26
32
|
description: 'Home page data including posts, activities, and courses.'
|
package/dist/openapi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","names":["OpenApiGeneratorV3","registry","openApiRootTags","name","description","getOpenApiDocument","generator","definitions","generateDocument","openapi","info","title","version","tags"],"sources":["../src/openapi.ts"],"sourcesContent":["// Side-effect imports: ensure OpenAPI paths are registered before generation.\nimport './schemas/activity.js'\nimport './schemas/course.js'\nimport './schemas/member.js'\nimport './schemas/post.js'\nimport './schemas/home.js'\n\nimport { OpenApiGeneratorV3 } from '@asteasolutions/zod-to-openapi'\n\nimport { registry } from './schemas/registry.js'\n\nconst openApiRootTags = [\n { name: 'Auth', description: 'Token exchange and session management.' },\n { name: 'Members', description: 'Authenticated member profile.' },\n {\n name: 'Admin',\n description: 'Privileged operations requiring GCP IAM authentication.',\n },\n { name: 'Tags', description: 'Tag metadata and course feeds by slug.' },\n { name: 'Courses', description: 'Course metadata and classroom detail.' },\n {\n name: 'Home',\n description: 'Home page data including posts, activities, and courses.',\n },\n] as const\n\nexport function getOpenApiDocument() {\n const generator = new OpenApiGeneratorV3(registry.definitions)\n return {\n ...generator.generateDocument({\n openapi: '3.0.3',\n info: {\n title: 'TWReporter Academy API',\n version: '0.0.1',\n description:\n 'Academy content API. Serves tag metadata, course feeds, and classroom detail.',\n },\n }),\n tags: [...openApiRootTags],\n }\n}\n"],"mappings":"AAAA;AACA,OAAO,uBAAuB;AAC9B,OAAO,qBAAqB;AAC5B,OAAO,qBAAqB;AAC5B,OAAO,mBAAmB;AAC1B,OAAO,mBAAmB;AAE1B,SAASA,kBAAkB,QAAQ,gCAAgC;AAEnE,SAASC,QAAQ,QAAQ,uBAAuB;AAEhD,MAAMC,eAAe,GAAG,CACtB;EAAEC,IAAI,EAAE,MAAM;EAAEC,WAAW,EAAE;AAAyC,CAAC,EACvE;EAAED,IAAI,EAAE,SAAS;EAAEC,WAAW,EAAE;AAAgC,CAAC,EACjE;EACED,IAAI,EAAE,OAAO;EACbC,WAAW,EAAE;AACf,CAAC,EACD;EAAED,IAAI,EAAE,MAAM;EAAEC,WAAW,EAAE;AAAyC,CAAC,EACvE;EAAED,IAAI,EAAE,SAAS;EAAEC,WAAW,EAAE;AAAwC,CAAC,EACzE;EACED,IAAI,EAAE,MAAM;EACZC,WAAW,EAAE;AACf,CAAC,CACO;AAEV,OAAO,SAASC,kBAAkBA,CAAA,EAAG;EACnC,MAAMC,SAAS,GAAG,IAAIN,kBAAkB,CAACC,QAAQ,CAACM,WAAW,CAAC;EAC9D,OAAO;IACL,GAAGD,SAAS,CAACE,gBAAgB,CAAC;MAC5BC,OAAO,EAAE,OAAO;MAChBC,IAAI,EAAE;QACJC,KAAK,EAAE,wBAAwB;QAC/BC,OAAO,EAAE,OAAO;QAChBR,WAAW,EACT;MACJ;IACF,CAAC,CAAC;IACFS,IAAI,EAAE,CAAC,GAAGX,eAAe;EAC3B,CAAC;AACH","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"openapi.js","names":["OpenApiGeneratorV3","registry","openApiRootTags","name","description","getOpenApiDocument","generator","definitions","generateDocument","openapi","info","title","version","tags"],"sources":["../src/openapi.ts"],"sourcesContent":["// Side-effect imports: ensure OpenAPI paths are registered before generation.\nimport './schemas/activity.js'\nimport './schemas/course.js'\nimport './schemas/member.js'\nimport './schemas/post.js'\nimport './schemas/home.js'\n\nimport { OpenApiGeneratorV3 } from '@asteasolutions/zod-to-openapi'\n\nimport { registry } from './schemas/registry.js'\n\nconst openApiRootTags = [\n { name: 'Auth', description: 'Token exchange and session management.' },\n { name: 'Members', description: 'Authenticated member profile.' },\n {\n name: 'Admin',\n description: 'Privileged operations requiring GCP IAM authentication.',\n },\n { name: 'Tags', description: 'Tag metadata and course feeds by slug.' },\n { name: 'Courses', description: 'Course metadata and classroom detail.' },\n { name: 'Posts', description: 'Header posts and the public post catalog.' },\n {\n name: 'Activities',\n description: 'Header activities and the public activity catalog.',\n },\n {\n name: 'Home',\n description: 'Home page data including posts, activities, and courses.',\n },\n] as const\n\nexport function getOpenApiDocument() {\n const generator = new OpenApiGeneratorV3(registry.definitions)\n return {\n ...generator.generateDocument({\n openapi: '3.0.3',\n info: {\n title: 'TWReporter Academy API',\n version: '0.0.1',\n description:\n 'Academy content API. Serves tag metadata, course feeds, and classroom detail.',\n },\n }),\n tags: [...openApiRootTags],\n }\n}\n"],"mappings":"AAAA;AACA,OAAO,uBAAuB;AAC9B,OAAO,qBAAqB;AAC5B,OAAO,qBAAqB;AAC5B,OAAO,mBAAmB;AAC1B,OAAO,mBAAmB;AAE1B,SAASA,kBAAkB,QAAQ,gCAAgC;AAEnE,SAASC,QAAQ,QAAQ,uBAAuB;AAEhD,MAAMC,eAAe,GAAG,CACtB;EAAEC,IAAI,EAAE,MAAM;EAAEC,WAAW,EAAE;AAAyC,CAAC,EACvE;EAAED,IAAI,EAAE,SAAS;EAAEC,WAAW,EAAE;AAAgC,CAAC,EACjE;EACED,IAAI,EAAE,OAAO;EACbC,WAAW,EAAE;AACf,CAAC,EACD;EAAED,IAAI,EAAE,MAAM;EAAEC,WAAW,EAAE;AAAyC,CAAC,EACvE;EAAED,IAAI,EAAE,SAAS;EAAEC,WAAW,EAAE;AAAwC,CAAC,EACzE;EAAED,IAAI,EAAE,OAAO;EAAEC,WAAW,EAAE;AAA4C,CAAC,EAC3E;EACED,IAAI,EAAE,YAAY;EAClBC,WAAW,EAAE;AACf,CAAC,EACD;EACED,IAAI,EAAE,MAAM;EACZC,WAAW,EAAE;AACf,CAAC,CACO;AAEV,OAAO,SAASC,kBAAkBA,CAAA,EAAG;EACnC,MAAMC,SAAS,GAAG,IAAIN,kBAAkB,CAACC,QAAQ,CAACM,WAAW,CAAC;EAC9D,OAAO;IACL,GAAGD,SAAS,CAACE,gBAAgB,CAAC;MAC5BC,OAAO,EAAE,OAAO;MAChBC,IAAI,EAAE;QACJC,KAAK,EAAE,wBAAwB;QAC/BC,OAAO,EAAE,OAAO;QAChBR,WAAW,EACT;MACJ;IACF,CAAC,CAAC;IACFS,IAAI,EAAE,CAAC,GAAGX,eAAe;EAC3B,CAAC;AACH","ignoreList":[]}
|
|
@@ -16,4 +16,46 @@ export declare const V1ActivitiesListResponseSchema: z.ZodObject<{
|
|
|
16
16
|
featured: z.ZodBoolean;
|
|
17
17
|
}, z.core.$strip>>;
|
|
18
18
|
}, z.core.$strip>;
|
|
19
|
+
export declare const V1ActivityCatalogItemSchema: z.ZodObject<{
|
|
20
|
+
title: z.ZodString;
|
|
21
|
+
description: z.ZodString;
|
|
22
|
+
link: z.ZodString;
|
|
23
|
+
image: z.ZodNullable<z.ZodObject<{
|
|
24
|
+
title: z.ZodString;
|
|
25
|
+
resized: z.ZodObject<{
|
|
26
|
+
tiny: z.ZodString;
|
|
27
|
+
small: z.ZodString;
|
|
28
|
+
medium: z.ZodString;
|
|
29
|
+
large: z.ZodString;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
}, z.core.$strip>>;
|
|
32
|
+
badgeText: z.ZodString;
|
|
33
|
+
buttonText: z.ZodString;
|
|
34
|
+
tags: z.ZodArray<z.ZodObject<{
|
|
35
|
+
slug: z.ZodString;
|
|
36
|
+
name: z.ZodString;
|
|
37
|
+
}, z.core.$strip>>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
export declare const V1ActivitiesCatalogResponseSchema: z.ZodObject<{
|
|
40
|
+
activities: z.ZodArray<z.ZodObject<{
|
|
41
|
+
title: z.ZodString;
|
|
42
|
+
description: z.ZodString;
|
|
43
|
+
link: z.ZodString;
|
|
44
|
+
image: z.ZodNullable<z.ZodObject<{
|
|
45
|
+
title: z.ZodString;
|
|
46
|
+
resized: z.ZodObject<{
|
|
47
|
+
tiny: z.ZodString;
|
|
48
|
+
small: z.ZodString;
|
|
49
|
+
medium: z.ZodString;
|
|
50
|
+
large: z.ZodString;
|
|
51
|
+
}, z.core.$strip>;
|
|
52
|
+
}, z.core.$strip>>;
|
|
53
|
+
badgeText: z.ZodString;
|
|
54
|
+
buttonText: z.ZodString;
|
|
55
|
+
tags: z.ZodArray<z.ZodObject<{
|
|
56
|
+
slug: z.ZodString;
|
|
57
|
+
name: z.ZodString;
|
|
58
|
+
}, z.core.$strip>>;
|
|
59
|
+
}, z.core.$strip>>;
|
|
60
|
+
}, z.core.$strip>;
|
|
19
61
|
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/schemas/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/schemas/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,eAAO,MAAM,2BAA2B;;iBAEtC,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;iBAOP,CAAA;AAEhC,eAAO,MAAM,8BAA8B;;;;;;;iBAIP,CAAA;AAEpC,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;iBAEP,CAAA;AAEjC,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;iBAIP,CAAA"}
|
package/dist/schemas/activity.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { RestErrorBodySchema } from '../rest.js';
|
|
3
|
+
import { V1HomeActivityCardSchema } from './home.js';
|
|
3
4
|
import { registry } from './registry.js';
|
|
4
5
|
export const V1ActivitiesListQuerySchema = z.object({
|
|
5
6
|
take: z.coerce.number().int().min(1).max(10).optional()
|
|
@@ -13,6 +14,15 @@ export const V1HeaderActivityItemSchema = z.object({
|
|
|
13
14
|
export const V1ActivitiesListResponseSchema = z.object({
|
|
14
15
|
activities: z.array(V1HeaderActivityItemSchema)
|
|
15
16
|
}).openapi('ActivitiesListResponse');
|
|
17
|
+
export const V1ActivityCatalogItemSchema = V1HomeActivityCardSchema.extend({
|
|
18
|
+
tags: z.array(z.object({
|
|
19
|
+
slug: z.string(),
|
|
20
|
+
name: z.string()
|
|
21
|
+
}))
|
|
22
|
+
}).openapi('ActivityCatalogItem');
|
|
23
|
+
export const V1ActivitiesCatalogResponseSchema = z.object({
|
|
24
|
+
activities: z.array(V1ActivityCatalogItemSchema)
|
|
25
|
+
}).openapi('ActivitiesCatalogResponse');
|
|
16
26
|
registry.registerPath({
|
|
17
27
|
method: 'get',
|
|
18
28
|
path: '/v1/activities',
|
|
@@ -48,4 +58,28 @@ registry.registerPath({
|
|
|
48
58
|
}
|
|
49
59
|
}
|
|
50
60
|
});
|
|
61
|
+
registry.registerPath({
|
|
62
|
+
method: 'get',
|
|
63
|
+
path: '/v1/activities/catalog',
|
|
64
|
+
tags: ['Activities'],
|
|
65
|
+
description: 'Public activity catalog.',
|
|
66
|
+
responses: {
|
|
67
|
+
200: {
|
|
68
|
+
description: 'Success',
|
|
69
|
+
content: {
|
|
70
|
+
'application/json': {
|
|
71
|
+
schema: V1ActivitiesCatalogResponseSchema
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
500: {
|
|
76
|
+
description: 'Internal server error',
|
|
77
|
+
content: {
|
|
78
|
+
'application/json': {
|
|
79
|
+
schema: RestErrorBodySchema
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
51
85
|
//# sourceMappingURL=activity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","names":["z","RestErrorBodySchema","registry","V1ActivitiesListQuerySchema","object","take","coerce","number","int","min","max","optional","V1HeaderActivityItemSchema","title","string","imageUrl","nullable","href","featured","boolean","openapi","V1ActivitiesListResponseSchema","activities","array","registerPath","method","path","
|
|
1
|
+
{"version":3,"file":"activity.js","names":["z","RestErrorBodySchema","V1HomeActivityCardSchema","registry","V1ActivitiesListQuerySchema","object","take","coerce","number","int","min","max","optional","V1HeaderActivityItemSchema","title","string","imageUrl","nullable","href","featured","boolean","openapi","V1ActivitiesListResponseSchema","activities","array","V1ActivityCatalogItemSchema","extend","tags","slug","name","V1ActivitiesCatalogResponseSchema","registerPath","method","path","description","request","query","responses","content","schema"],"sources":["../../src/schemas/activity.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { RestErrorBodySchema } from '../rest.js'\nimport { V1HomeActivityCardSchema } from './home.js'\nimport { registry } from './registry.js'\n\nexport const V1ActivitiesListQuerySchema = z.object({\n take: z.coerce.number().int().min(1).max(10).optional(),\n})\n\nexport const V1HeaderActivityItemSchema = z\n .object({\n title: z.string(),\n imageUrl: z.string().nullable(),\n href: z.string(),\n featured: z.boolean(),\n })\n .openapi('HeaderActivityItem')\n\nexport const V1ActivitiesListResponseSchema = z\n .object({\n activities: z.array(V1HeaderActivityItemSchema),\n })\n .openapi('ActivitiesListResponse')\n\nexport const V1ActivityCatalogItemSchema = V1HomeActivityCardSchema.extend({\n tags: z.array(z.object({ slug: z.string(), name: z.string() })),\n}).openapi('ActivityCatalogItem')\n\nexport const V1ActivitiesCatalogResponseSchema = z\n .object({\n activities: z.array(V1ActivityCatalogItemSchema),\n })\n .openapi('ActivitiesCatalogResponse')\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/activities',\n tags: ['Activities'],\n description: 'Latest activities for header.',\n request: { query: V1ActivitiesListQuerySchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1ActivitiesListResponseSchema },\n },\n },\n 400: {\n description: 'Invalid request',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 500: {\n description: 'Internal server error',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/activities/catalog',\n tags: ['Activities'],\n description: 'Public activity catalog.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1ActivitiesCatalogResponseSchema },\n },\n },\n 500: {\n description: 'Internal server error',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n },\n})\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -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;
|
|
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"}
|
package/dist/schemas/course.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { internalServerErrorResponse } from '../responses.js';
|
|
2
|
+
import { internalServerErrorResponse, unauthorizedResponse } from '../responses.js';
|
|
3
3
|
import { RestErrorBodySchema } from '../rest.js';
|
|
4
4
|
import { CloudflareStreamVideoSchema } from './cloudflare-stream.js';
|
|
5
5
|
import { V1LessonProgressSchema } from './lesson-progress.js';
|
|
@@ -131,11 +131,10 @@ export const V1CourseBySlugResponseSchema = z.object({
|
|
|
131
131
|
summary: z.string(),
|
|
132
132
|
launchAt: z.iso.datetime().nullable(),
|
|
133
133
|
estimatedDurationMinutes: z.number().int().nullable(),
|
|
134
|
+
/** Null when unset or the Lexical document has no content */
|
|
134
135
|
description: JsonValueSchema.nullable(),
|
|
135
|
-
/** published: full payload; coming_soon: lessons/resources/furtherReading/previewVideoId stripped */
|
|
136
136
|
status: V1CourseStatusSchema,
|
|
137
137
|
tags: z.array(V1CourseTagSchema),
|
|
138
|
-
/** Trial/preview stream only; null when unconfigured or course is coming_soon */
|
|
139
138
|
trialVideos: z.array(CloudflareStreamVideoSchema).nullable(),
|
|
140
139
|
lessonsMeta: z.array(V1CourseLessonMetaSchema),
|
|
141
140
|
instructors: z.array(V1CourseInstructorSchema),
|
|
@@ -216,11 +215,48 @@ registry.registerPath({
|
|
|
216
215
|
...internalServerErrorResponse
|
|
217
216
|
}
|
|
218
217
|
});
|
|
218
|
+
registry.registerPath({
|
|
219
|
+
method: 'get',
|
|
220
|
+
path: '/v1/courses/{slug}/classroom',
|
|
221
|
+
tags: ['Courses'],
|
|
222
|
+
description: '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.',
|
|
223
|
+
request: {
|
|
224
|
+
params: V1CourseSlugPathParamsSchema
|
|
225
|
+
},
|
|
226
|
+
responses: {
|
|
227
|
+
200: {
|
|
228
|
+
description: 'Success',
|
|
229
|
+
content: {
|
|
230
|
+
'application/json': {
|
|
231
|
+
schema: V1ClassroomBySlugResponseSchema
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
400: {
|
|
236
|
+
description: 'Bad request',
|
|
237
|
+
content: {
|
|
238
|
+
'application/json': {
|
|
239
|
+
schema: RestErrorBodySchema
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
404: {
|
|
244
|
+
description: 'Course not found',
|
|
245
|
+
content: {
|
|
246
|
+
'application/json': {
|
|
247
|
+
schema: RestErrorBodySchema
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
...unauthorizedResponse,
|
|
252
|
+
...internalServerErrorResponse
|
|
253
|
+
}
|
|
254
|
+
});
|
|
219
255
|
registry.registerPath({
|
|
220
256
|
method: 'get',
|
|
221
257
|
path: '/v1/courses/{slug}',
|
|
222
258
|
tags: ['Courses'],
|
|
223
|
-
description: '
|
|
259
|
+
description: 'Public course landing page. Includes Lexical description, trial videos, lesson metadata, instructors, and hero media.',
|
|
224
260
|
request: {
|
|
225
261
|
params: V1CourseSlugPathParamsSchema
|
|
226
262
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"course.js","names":["z","internalServerErrorResponse","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 { internalServerErrorResponse } 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 description: JsonValueSchema.nullable(),\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 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}',\n tags: ['Courses'],\n description:\n 'Full course detail for the classroom page. When status is coming_soon, lessons, resources, furtherReading, and previewVideoId are empty/null while title, description, tags, and instructors remain visible.',\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 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":[]}
|