@twreporter-academy/api-types 0.0.5 → 0.0.7
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/openapi.d.ts +2 -0
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +2 -0
- package/dist/openapi.js.map +1 -1
- package/dist/schemas/activity.d.ts +19 -0
- package/dist/schemas/activity.d.ts.map +1 -0
- package/dist/schemas/activity.js +51 -0
- package/dist/schemas/activity.js.map +1 -0
- package/dist/schemas/course.d.ts +24 -0
- package/dist/schemas/course.d.ts.map +1 -1
- package/dist/schemas/course.js +28 -1
- package/dist/schemas/course.js.map +1 -1
- package/dist/schemas/member.d.ts +3 -0
- package/dist/schemas/member.d.ts.map +1 -1
- package/dist/schemas/member.js +13 -1
- package/dist/schemas/member.js.map +1 -1
- package/dist/schemas/post.d.ts +17 -0
- package/dist/schemas/post.d.ts.map +1 -0
- package/dist/schemas/post.js +50 -0
- package/dist/schemas/post.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export * from './api-variables.js';
|
|
2
2
|
export * from './openapi.js';
|
|
3
3
|
export * from './rest.js';
|
|
4
|
+
export * from './schemas/activity.js';
|
|
4
5
|
export * from './schemas/course.js';
|
|
5
6
|
export * from './schemas/lesson-progress.js';
|
|
6
7
|
export * from './schemas/member.js';
|
|
8
|
+
export * from './schemas/post.js';
|
|
7
9
|
export * from './schemas/tag.js';
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export * from './api-variables.js';
|
|
2
2
|
export * from './openapi.js';
|
|
3
3
|
export * from './rest.js';
|
|
4
|
+
export * from './schemas/activity.js';
|
|
4
5
|
export * from './schemas/course.js';
|
|
5
6
|
export * from './schemas/lesson-progress.js';
|
|
6
7
|
export * from './schemas/member.js';
|
|
8
|
+
export * from './schemas/post.js';
|
|
7
9
|
export * from './schemas/tag.js';
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from './api-variables.js'\nexport * from './openapi.js'\nexport * from './rest.js'\nexport * from './schemas/course.js'\nexport * from './schemas/lesson-progress.js'\nexport * from './schemas/member.js'\nexport * from './schemas/tag.js'\n"],"mappings":"AAAA,cAAc,oBAAoB;AAClC,cAAc,cAAc;AAC5B,cAAc,WAAW;AACzB,cAAc,qBAAqB;AACnC,cAAc,8BAA8B;AAC5C,cAAc,qBAAqB;AACnC,cAAc,kBAAkB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from './api-variables.js'\nexport * from './openapi.js'\nexport * from './rest.js'\nexport * from './schemas/activity.js'\nexport * from './schemas/course.js'\nexport * from './schemas/lesson-progress.js'\nexport * from './schemas/member.js'\nexport * from './schemas/post.js'\nexport * from './schemas/tag.js'\n"],"mappings":"AAAA,cAAc,oBAAoB;AAClC,cAAc,cAAc;AAC5B,cAAc,WAAW;AACzB,cAAc,uBAAuB;AACrC,cAAc,qBAAqB;AACnC,cAAc,8BAA8B;AAC5C,cAAc,qBAAqB;AACnC,cAAc,mBAAmB;AACjC,cAAc,kBAAkB","ignoreList":[]}
|
package/dist/openapi.d.ts
CHANGED
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,qBAAqB,CAAA;AAC5B,OAAO,qBAAqB,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;AAa1B,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAcjC"}
|
package/dist/openapi.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// Side-effect imports: ensure OpenAPI paths are registered before generation.
|
|
2
|
+
import './schemas/activity.js';
|
|
2
3
|
import './schemas/course.js';
|
|
3
4
|
import './schemas/member.js';
|
|
5
|
+
import './schemas/post.js';
|
|
4
6
|
import { OpenApiGeneratorV3 } from '@asteasolutions/zod-to-openapi';
|
|
5
7
|
import { registry } from './schemas/registry.js';
|
|
6
8
|
const openApiRootTags = [{
|
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/course.js'\nimport './schemas/member.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 { name: 'Tags', description: 'Tag metadata and course feeds by slug.' },\n { name: 'Courses', description: 'Course metadata and classroom detail.' },\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,qBAAqB;AAC5B,OAAO,qBAAqB;
|
|
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'\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 { name: 'Tags', description: 'Tag metadata and course feeds by slug.' },\n { name: 'Courses', description: 'Course metadata and classroom detail.' },\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;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;EAAED,IAAI,EAAE,MAAM;EAAEC,WAAW,EAAE;AAAyC,CAAC,EACvE;EAAED,IAAI,EAAE,SAAS;EAAEC,WAAW,EAAE;AAAwC,CAAC,CACjE;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":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const V1ActivitiesListQuerySchema: z.ZodObject<{
|
|
3
|
+
take: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
export declare const V1HeaderActivityItemSchema: z.ZodObject<{
|
|
6
|
+
title: z.ZodString;
|
|
7
|
+
imageUrl: z.ZodNullable<z.ZodString>;
|
|
8
|
+
href: z.ZodString;
|
|
9
|
+
featured: z.ZodBoolean;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export declare const V1ActivitiesListResponseSchema: z.ZodObject<{
|
|
12
|
+
activities: z.ZodArray<z.ZodObject<{
|
|
13
|
+
title: z.ZodString;
|
|
14
|
+
imageUrl: z.ZodNullable<z.ZodString>;
|
|
15
|
+
href: z.ZodString;
|
|
16
|
+
featured: z.ZodBoolean;
|
|
17
|
+
}, z.core.$strip>>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/schemas/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,2BAA2B;;iBAEtC,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;iBAOP,CAAA;AAEhC,eAAO,MAAM,8BAA8B;;;;;;;iBAIP,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { RestErrorBodySchema } from '../rest.js';
|
|
3
|
+
import { registry } from './registry.js';
|
|
4
|
+
export const V1ActivitiesListQuerySchema = z.object({
|
|
5
|
+
take: z.coerce.number().int().min(1).max(10).optional()
|
|
6
|
+
});
|
|
7
|
+
export const V1HeaderActivityItemSchema = z.object({
|
|
8
|
+
title: z.string(),
|
|
9
|
+
imageUrl: z.string().nullable(),
|
|
10
|
+
href: z.string(),
|
|
11
|
+
featured: z.boolean()
|
|
12
|
+
}).openapi('HeaderActivityItem');
|
|
13
|
+
export const V1ActivitiesListResponseSchema = z.object({
|
|
14
|
+
activities: z.array(V1HeaderActivityItemSchema)
|
|
15
|
+
}).openapi('ActivitiesListResponse');
|
|
16
|
+
registry.registerPath({
|
|
17
|
+
method: 'get',
|
|
18
|
+
path: '/v1/activities',
|
|
19
|
+
tags: ['Activities'],
|
|
20
|
+
description: 'Latest activities for header.',
|
|
21
|
+
request: {
|
|
22
|
+
query: V1ActivitiesListQuerySchema
|
|
23
|
+
},
|
|
24
|
+
responses: {
|
|
25
|
+
200: {
|
|
26
|
+
description: 'Success',
|
|
27
|
+
content: {
|
|
28
|
+
'application/json': {
|
|
29
|
+
schema: V1ActivitiesListResponseSchema
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
400: {
|
|
34
|
+
description: 'Invalid request',
|
|
35
|
+
content: {
|
|
36
|
+
'application/json': {
|
|
37
|
+
schema: RestErrorBodySchema
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
500: {
|
|
42
|
+
description: 'Internal server error',
|
|
43
|
+
content: {
|
|
44
|
+
'application/json': {
|
|
45
|
+
schema: RestErrorBodySchema
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +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","tags","description","request","query","responses","content","schema"],"sources":["../../src/schemas/activity.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { RestErrorBodySchema } from '../rest.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\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"],"mappings":"AAAA,SAASA,CAAC,QAAQ,KAAK;AAEvB,SAASC,mBAAmB,QAAQ,YAAY;AAChD,SAASC,QAAQ,QAAQ,eAAe;AAExC,OAAO,MAAMC,2BAA2B,GAAGH,CAAC,CAACI,MAAM,CAAC;EAClDC,IAAI,EAAEL,CAAC,CAACM,MAAM,CAACC,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC;AACxD,CAAC,CAAC;AAEF,OAAO,MAAMC,0BAA0B,GAAGZ,CAAC,CACxCI,MAAM,CAAC;EACNS,KAAK,EAAEb,CAAC,CAACc,MAAM,CAAC,CAAC;EACjBC,QAAQ,EAAEf,CAAC,CAACc,MAAM,CAAC,CAAC,CAACE,QAAQ,CAAC,CAAC;EAC/BC,IAAI,EAAEjB,CAAC,CAACc,MAAM,CAAC,CAAC;EAChBI,QAAQ,EAAElB,CAAC,CAACmB,OAAO,CAAC;AACtB,CAAC,CAAC,CACDC,OAAO,CAAC,oBAAoB,CAAC;AAEhC,OAAO,MAAMC,8BAA8B,GAAGrB,CAAC,CAC5CI,MAAM,CAAC;EACNkB,UAAU,EAAEtB,CAAC,CAACuB,KAAK,CAACX,0BAA0B;AAChD,CAAC,CAAC,CACDQ,OAAO,CAAC,wBAAwB,CAAC;AAEpClB,QAAQ,CAACsB,YAAY,CAAC;EACpBC,MAAM,EAAE,KAAK;EACbC,IAAI,EAAE,gBAAgB;EACtBC,IAAI,EAAE,CAAC,YAAY,CAAC;EACpBC,WAAW,EAAE,+BAA+B;EAC5CC,OAAO,EAAE;IAAEC,KAAK,EAAE3B;EAA4B,CAAC;EAC/C4B,SAAS,EAAE;IACT,GAAG,EAAE;MACHH,WAAW,EAAE,SAAS;MACtBI,OAAO,EAAE;QACP,kBAAkB,EAAE;UAAEC,MAAM,EAAEZ;QAA+B;MAC/D;IACF,CAAC;IACD,GAAG,EAAE;MACHO,WAAW,EAAE,iBAAiB;MAC9BI,OAAO,EAAE;QAAE,kBAAkB,EAAE;UAAEC,MAAM,EAAEhC;QAAoB;MAAE;IACjE,CAAC;IACD,GAAG,EAAE;MACH2B,WAAW,EAAE,uBAAuB;MACpCI,OAAO,EAAE;QAAE,kBAAkB,EAAE;UAAEC,MAAM,EAAEhC;QAAoB;MAAE;IACjE;EACF;AACF,CAAC,CAAC","ignoreList":[]}
|
package/dist/schemas/course.d.ts
CHANGED
|
@@ -51,6 +51,30 @@ export declare const V1CourseStatusSchema: z.ZodEnum<{
|
|
|
51
51
|
published: "published";
|
|
52
52
|
coming_soon: "coming_soon";
|
|
53
53
|
}>;
|
|
54
|
+
export declare const V1HeaderCourseBadgeSchema: z.ZodEnum<{
|
|
55
|
+
new: "new";
|
|
56
|
+
wip: "wip";
|
|
57
|
+
}>;
|
|
58
|
+
export declare const V1HeaderCourseItemSchema: z.ZodObject<{
|
|
59
|
+
slug: z.ZodString;
|
|
60
|
+
title: z.ZodString;
|
|
61
|
+
description: z.ZodString;
|
|
62
|
+
badge: z.ZodOptional<z.ZodEnum<{
|
|
63
|
+
new: "new";
|
|
64
|
+
wip: "wip";
|
|
65
|
+
}>>;
|
|
66
|
+
}, z.core.$strip>;
|
|
67
|
+
export declare const V1CoursesListResponseSchema: z.ZodObject<{
|
|
68
|
+
courses: z.ZodArray<z.ZodObject<{
|
|
69
|
+
slug: z.ZodString;
|
|
70
|
+
title: z.ZodString;
|
|
71
|
+
description: z.ZodString;
|
|
72
|
+
badge: z.ZodOptional<z.ZodEnum<{
|
|
73
|
+
new: "new";
|
|
74
|
+
wip: "wip";
|
|
75
|
+
}>>;
|
|
76
|
+
}, z.core.$strip>>;
|
|
77
|
+
}, z.core.$strip>;
|
|
54
78
|
export declare const V1CourseBySlugResponseSchema: z.ZodObject<{
|
|
55
79
|
slug: z.ZodString;
|
|
56
80
|
title: 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;AAOvB,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;;;;;;;iBASP,CAAA;AAE9B,eAAO,MAAM,sBAAsB;;;;;iBAQP,CAAA;AAE5B,eAAO,MAAM,4BAA4B;;;;;;iBAQP,CAAA;AAElC,eAAO,MAAM,oBAAoB;;;EAAuC,CAAA;AAExE,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBf,CAAA"}
|
|
1
|
+
{"version":3,"file":"course.d.ts","sourceRoot":"","sources":["../../src/schemas/course.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAOvB,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;;;;;;;iBASP,CAAA;AAE9B,eAAO,MAAM,sBAAsB;;;;;iBAQP,CAAA;AAE5B,eAAO,MAAM,4BAA4B;;;;;;iBAQP,CAAA;AAElC,eAAO,MAAM,oBAAoB;;;EAAuC,CAAA;AAExE,eAAO,MAAM,yBAAyB;;;EAAyB,CAAA;AAE/D,eAAO,MAAM,wBAAwB;;;;;;;;iBAOP,CAAA;AAE9B,eAAO,MAAM,2BAA2B;;;;;;;;;;iBAIP,CAAA;AAEjC,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBf,CAAA"}
|
package/dist/schemas/course.js
CHANGED
|
@@ -37,7 +37,7 @@ export const V1CourseResourceSchema = z.object({
|
|
|
37
37
|
id: z.string(),
|
|
38
38
|
title: z.string(),
|
|
39
39
|
description: z.string(),
|
|
40
|
-
/** GCS file URL
|
|
40
|
+
/** GCS file URL; empty when no PDF uploaded */
|
|
41
41
|
downloadUrl: z.string()
|
|
42
42
|
}).openapi('CourseResource');
|
|
43
43
|
export const V1CourseFurtherReadingSchema = z.object({
|
|
@@ -48,6 +48,16 @@ export const V1CourseFurtherReadingSchema = z.object({
|
|
|
48
48
|
url: z.string()
|
|
49
49
|
}).openapi('CourseFurtherReading');
|
|
50
50
|
export const V1CourseStatusSchema = z.enum(['published', 'coming_soon']);
|
|
51
|
+
export const V1HeaderCourseBadgeSchema = z.enum(['new', 'wip']);
|
|
52
|
+
export const V1HeaderCourseItemSchema = z.object({
|
|
53
|
+
slug: z.string(),
|
|
54
|
+
title: z.string(),
|
|
55
|
+
description: z.string(),
|
|
56
|
+
badge: V1HeaderCourseBadgeSchema.optional()
|
|
57
|
+
}).openapi('HeaderCourseItem');
|
|
58
|
+
export const V1CoursesListResponseSchema = z.object({
|
|
59
|
+
courses: z.array(V1HeaderCourseItemSchema)
|
|
60
|
+
}).openapi('CoursesListResponse');
|
|
51
61
|
export const V1CourseBySlugResponseSchema = z.object({
|
|
52
62
|
slug: z.string(),
|
|
53
63
|
title: z.string(),
|
|
@@ -77,6 +87,23 @@ const internalServerErrorResponse = {
|
|
|
77
87
|
}
|
|
78
88
|
}
|
|
79
89
|
};
|
|
90
|
+
registry.registerPath({
|
|
91
|
+
method: 'get',
|
|
92
|
+
path: '/v1/courses',
|
|
93
|
+
tags: ['Courses'],
|
|
94
|
+
description: 'Header course list.',
|
|
95
|
+
responses: {
|
|
96
|
+
200: {
|
|
97
|
+
description: 'Success',
|
|
98
|
+
content: {
|
|
99
|
+
'application/json': {
|
|
100
|
+
schema: V1CoursesListResponseSchema
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
...internalServerErrorResponse
|
|
105
|
+
}
|
|
106
|
+
});
|
|
80
107
|
registry.registerPath({
|
|
81
108
|
method: 'get',
|
|
82
109
|
path: '/v1/courses/{slug}/meta',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"course.js","names":["z","RestErrorBodySchema","V1LessonProgressSchema","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","videoId","durationSeconds","isFree","progress","optional","openapi","V1CourseInstructorSchema","name","bio","avatarUrl","V1CourseResourceSchema","description","downloadUrl","V1CourseFurtherReadingSchema","excerpt","thumbnailUrl","url","V1CourseStatusSchema","enum","V1CourseBySlugResponseSchema","subtitle","summary","status","tags","previewVideoId","lessons","instructors","resources","furtherReading","internalServerErrorResponse","content","schema","registerPath","method","path","request","params","responses"],"sources":["../../src/schemas/course.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { RestErrorBodySchema } from '../rest.js'\nimport { V1LessonProgressSchema } from './lesson-progress.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 /** Cloudflare stream id for this lesson; null when not yet set */\n videoId: z.string().nullable(),\n /** Video length in seconds (from CMS); null when not yet set */\n durationSeconds: z.number().int().nullable(),\n /** CMS 免費試看 flag; playback access is decided by user role (out of scope here) */\n isFree: z.boolean(),\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 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 avatarUrl: z.string().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 with ?download=true; 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 thumbnailUrl: z.string().nullable(),\n url: z.string(),\n })\n .openapi('CourseFurtherReading')\n\nexport const V1CourseStatusSchema = z.enum(['published', 'coming_soon'])\n\nexport const V1CourseBySlugResponseSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n description: JsonValueSchema.nullable(),\n /** published: full payload; coming_soon: lessons/resources/furtherReading/previewVideoId stripped */\n status: V1CourseStatusSchema,\n tags: z.array(z.string()),\n /** Trial/preview stream only; null when unconfigured or course is coming_soon */\n previewVideoId: 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('CourseDetail')\n\n// --- OpenAPI path registration ---\n\nconst internalServerErrorResponse = {\n 500: {\n description: 'Internal server error',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n} as const\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":"AAAA,SAASA,CAAC,QAAQ,KAAK;AAEvB,SAASC,mBAAmB,QAAQ,YAAY;AAChD,SAASC,sBAAsB,QAAQ,sBAAsB;AAC7D,SAASC,QAAQ,QAAQ,eAAe;AACxC,SAASC,qBAAqB,QAAQ,UAAU;AAUhD,OAAO,MAAMC,eAAqC,GAAGL,CAAC,CAACM,KAAK,CAAC,CAC3DN,CAAC,CAACO,MAAM,CAAC,CAAC,EACVP,CAAC,CAACQ,MAAM,CAAC,CAAC,EACVR,CAAC,CAACS,OAAO,CAAC,CAAC,EACXT,CAAC,CAACU,IAAI,CAAC,CAAC,EACRV,CAAC,CAACW,KAAK,CAACX,CAAC,CAACY,OAAO,CAAC,CAAC,CAAC,EACpBZ,CAAC,CAACa,MAAM,CAACb,CAAC,CAACO,MAAM,CAAC,CAAC,EAAEP,CAAC,CAACY,OAAO,CAAC,CAAC,CAAC,CAClC,CAAC;AAEF,OAAO,MAAME,4BAA4B,GAAGd,CAAC,CAACe,MAAM,CAAC;EACnDC,IAAI,EAAEhB,CAAC,CAACO,MAAM,CAAC,CAAC,CAACU,GAAG,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,GAAG;AACjC,CAAC,CAAC;AAEF,OAAO,MAAMC,gCAAgC,GAAGnB,CAAC,CAACe,MAAM,CAAC;EACvDK,OAAO,EAAEpB,CAAC,CAACO,MAAM,CAAC,CAAC;EACnBc,aAAa,EAAErB,CAAC,CAACO,MAAM,CAAC,CAAC;EACzBe,OAAO,EAAElB,qBAAqB,CAACmB,QAAQ,CAAC;AAC1C,CAAC,CAAC;AAEF,OAAO,MAAMC,oBAAoB,GAAGxB,CAAC,CAClCe,MAAM,CAAC;EACNU,EAAE,EAAEzB,CAAC,CAACO,MAAM,CAAC,CAAC;EACdmB,KAAK,EAAE1B,CAAC,CAACQ,MAAM,CAAC,CAAC,CAACmB,GAAG,CAAC,CAAC;EACvBC,KAAK,EAAE5B,CAAC,CAACO,MAAM,CAAC,CAAC;EACjB;EACAsB,OAAO,EAAE7B,CAAC,CAACO,MAAM,CAAC,CAAC,CAACgB,QAAQ,CAAC,CAAC;EAC9B;EACAO,eAAe,EAAE9B,CAAC,CAACQ,MAAM,CAAC,CAAC,CAACmB,GAAG,CAAC,CAAC,CAACJ,QAAQ,CAAC,CAAC;EAC5C;EACAQ,MAAM,EAAE/B,CAAC,CAACS,OAAO,CAAC,CAAC;EACnB;EACAuB,QAAQ,EAAE9B,sBAAsB,CAACqB,QAAQ,CAAC,CAAC,CAACU,QAAQ,CAAC;AACvD,CAAC,CAAC,CACDC,OAAO,CAAC,cAAc,CAAC;AAE1B,OAAO,MAAMC,wBAAwB,GAAGnC,CAAC,CACtCe,MAAM,CAAC;EACNU,EAAE,EAAEzB,CAAC,CAACO,MAAM,CAAC,CAAC;EACdS,IAAI,EAAEhB,CAAC,CAACO,MAAM,CAAC,CAAC;EAChB6B,IAAI,EAAEpC,CAAC,CAACO,MAAM,CAAC,CAAC;EAChBqB,KAAK,EAAE5B,CAAC,CAACO,MAAM,CAAC,CAAC;EACjB8B,GAAG,EAAErC,CAAC,CAACO,MAAM,CAAC,CAAC;EACf+B,SAAS,EAAEtC,CAAC,CAACO,MAAM,CAAC,CAAC,CAACgB,QAAQ,CAAC;AACjC,CAAC,CAAC,CACDW,OAAO,CAAC,kBAAkB,CAAC;AAE9B,OAAO,MAAMK,sBAAsB,GAAGvC,CAAC,CACpCe,MAAM,CAAC;EACNU,EAAE,EAAEzB,CAAC,CAACO,MAAM,CAAC,CAAC;EACdqB,KAAK,EAAE5B,CAAC,CAACO,MAAM,CAAC,CAAC;EACjBiC,WAAW,EAAExC,CAAC,CAACO,MAAM,CAAC,CAAC;EACvB;EACAkC,WAAW,EAAEzC,CAAC,CAACO,MAAM,CAAC;AACxB,CAAC,CAAC,CACD2B,OAAO,CAAC,gBAAgB,CAAC;AAE5B,OAAO,MAAMQ,4BAA4B,GAAG1C,CAAC,CAC1Ce,MAAM,CAAC;EACNU,EAAE,EAAEzB,CAAC,CAACO,MAAM,CAAC,CAAC;EACdqB,KAAK,EAAE5B,CAAC,CAACO,MAAM,CAAC,CAAC;EACjBoC,OAAO,EAAE3C,CAAC,CAACO,MAAM,CAAC,CAAC;EACnBqC,YAAY,EAAE5C,CAAC,CAACO,MAAM,CAAC,CAAC,CAACgB,QAAQ,CAAC,CAAC;EACnCsB,GAAG,EAAE7C,CAAC,CAACO,MAAM,CAAC;AAChB,CAAC,CAAC,CACD2B,OAAO,CAAC,sBAAsB,CAAC;AAElC,OAAO,MAAMY,oBAAoB,GAAG9C,CAAC,CAAC+C,IAAI,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAExE,OAAO,MAAMC,4BAA4B,GAAGhD,CAAC,CAC1Ce,MAAM,CAAC;EACNC,IAAI,EAAEhB,CAAC,CAACO,MAAM,CAAC,CAAC;EAChBqB,KAAK,EAAE5B,CAAC,CAACO,MAAM,CAAC,CAAC;EACjB0C,QAAQ,EAAEjD,CAAC,CAACO,MAAM,CAAC,CAAC;EACpB2C,OAAO,EAAElD,CAAC,CAACO,MAAM,CAAC,CAAC;EACnBiC,WAAW,EAAEnC,eAAe,CAACkB,QAAQ,CAAC,CAAC;EACvC;EACA4B,MAAM,EAAEL,oBAAoB;EAC5BM,IAAI,EAAEpD,CAAC,CAACW,KAAK,CAACX,CAAC,CAACO,MAAM,CAAC,CAAC,CAAC;EACzB;EACA8C,cAAc,EAAErD,CAAC,CAACO,MAAM,CAAC,CAAC,CAACgB,QAAQ,CAAC,CAAC;EACrC+B,OAAO,EAAEtD,CAAC,CAACW,KAAK,CAACa,oBAAoB,CAAC;EACtC+B,WAAW,EAAEvD,CAAC,CAACW,KAAK,CAACwB,wBAAwB,CAAC;EAC9CqB,SAAS,EAAExD,CAAC,CAACW,KAAK,CAAC4B,sBAAsB,CAAC;EAC1CkB,cAAc,EAAEzD,CAAC,CAACW,KAAK,CAAC+B,4BAA4B;AACtD,CAAC,CAAC,CACDR,OAAO,CAAC,cAAc,CAAC;;AAE1B;;AAEA,MAAMwB,2BAA2B,GAAG;EAClC,GAAG,EAAE;IACHlB,WAAW,EAAE,uBAAuB;IACpCmB,OAAO,EAAE;MAAE,kBAAkB,EAAE;QAAEC,MAAM,EAAE3D;MAAoB;IAAE;EACjE;AACF,CAAU;AAEVE,QAAQ,CAAC0D,YAAY,CAAC;EACpBC,MAAM,EAAE,KAAK;EACbC,IAAI,EAAE,yBAAyB;EAC/BX,IAAI,EAAE,CAAC,SAAS,CAAC;EACjBZ,WAAW,EAAE,gCAAgC;EAC7CwB,OAAO,EAAE;IAAEC,MAAM,EAAEnD;EAA6B,CAAC;EACjDoD,SAAS,EAAE;IACT,GAAG,EAAE;MACH1B,WAAW,EAAE,SAAS;MACtBmB,OAAO,EAAE;QACP,kBAAkB,EAAE;UAAEC,MAAM,EAAEzC;QAAiC;MACjE;IACF,CAAC;IACD,GAAG,EAAE;MACHqB,WAAW,EAAE,aAAa;MAC1BmB,OAAO,EAAE;QAAE,kBAAkB,EAAE;UAAEC,MAAM,EAAE3D;QAAoB;MAAE;IACjE,CAAC;IACD,GAAG,EAAE;MACHuC,WAAW,EAAE,kBAAkB;MAC/BmB,OAAO,EAAE;QAAE,kBAAkB,EAAE;UAAEC,MAAM,EAAE3D;QAAoB;MAAE;IACjE,CAAC;IACD,GAAGyD;EACL;AACF,CAAC,CAAC;AAEFvD,QAAQ,CAAC0D,YAAY,CAAC;EACpBC,MAAM,EAAE,KAAK;EACbC,IAAI,EAAE,oBAAoB;EAC1BX,IAAI,EAAE,CAAC,SAAS,CAAC;EACjBZ,WAAW,EACT,8MAA8M;EAChNwB,OAAO,EAAE;IAAEC,MAAM,EAAEnD;EAA6B,CAAC;EACjDoD,SAAS,EAAE;IACT,GAAG,EAAE;MACH1B,WAAW,EAAE,SAAS;MACtBmB,OAAO,EAAE;QACP,kBAAkB,EAAE;UAAEC,MAAM,EAAEZ;QAA6B;MAC7D;IACF,CAAC;IACD,GAAG,EAAE;MACHR,WAAW,EAAE,aAAa;MAC1BmB,OAAO,EAAE;QAAE,kBAAkB,EAAE;UAAEC,MAAM,EAAE3D;QAAoB;MAAE;IACjE,CAAC;IACD,GAAG,EAAE;MACHuC,WAAW,EAAE,kBAAkB;MAC/BmB,OAAO,EAAE;QAAE,kBAAkB,EAAE;UAAEC,MAAM,EAAE3D;QAAoB;MAAE;IACjE,CAAC;IACD,GAAGyD;EACL;AACF,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"course.js","names":["z","RestErrorBodySchema","V1LessonProgressSchema","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","videoId","durationSeconds","isFree","progress","optional","openapi","V1CourseInstructorSchema","name","bio","avatarUrl","V1CourseResourceSchema","description","downloadUrl","V1CourseFurtherReadingSchema","excerpt","thumbnailUrl","url","V1CourseStatusSchema","enum","V1HeaderCourseBadgeSchema","V1HeaderCourseItemSchema","badge","V1CoursesListResponseSchema","courses","V1CourseBySlugResponseSchema","subtitle","summary","status","tags","previewVideoId","lessons","instructors","resources","furtherReading","internalServerErrorResponse","content","schema","registerPath","method","path","responses","request","params"],"sources":["../../src/schemas/course.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { RestErrorBodySchema } from '../rest.js'\nimport { V1LessonProgressSchema } from './lesson-progress.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 /** Cloudflare stream id for this lesson; null when not yet set */\n videoId: z.string().nullable(),\n /** Video length in seconds (from CMS); null when not yet set */\n durationSeconds: z.number().int().nullable(),\n /** CMS 免費試看 flag; playback access is decided by user role (out of scope here) */\n isFree: z.boolean(),\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 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 avatarUrl: z.string().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 thumbnailUrl: z.string().nullable(),\n url: z.string(),\n })\n .openapi('CourseFurtherReading')\n\nexport const V1CourseStatusSchema = z.enum(['published', 'coming_soon'])\n\nexport const V1HeaderCourseBadgeSchema = z.enum(['new', 'wip'])\n\nexport const V1HeaderCourseItemSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n description: 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 V1CourseBySlugResponseSchema = z\n .object({\n slug: z.string(),\n title: z.string(),\n subtitle: z.string(),\n summary: z.string(),\n description: JsonValueSchema.nullable(),\n /** published: full payload; coming_soon: lessons/resources/furtherReading/previewVideoId stripped */\n status: V1CourseStatusSchema,\n tags: z.array(z.string()),\n /** Trial/preview stream only; null when unconfigured or course is coming_soon */\n previewVideoId: 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('CourseDetail')\n\n// --- OpenAPI path registration ---\n\nconst internalServerErrorResponse = {\n 500: {\n description: 'Internal server error',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n} as const\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/{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":[]}
|
package/dist/schemas/member.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
export declare const V1MemberMeQuerySchema: z.ZodObject<{
|
|
3
|
+
refreshAccess: z.ZodOptional<z.ZodPreprocess<z.ZodBoolean>>;
|
|
4
|
+
}, z.core.$strip>;
|
|
2
5
|
export declare const V1MemberProfileSchema: z.ZodObject<{
|
|
3
6
|
id: z.ZodString;
|
|
4
7
|
email: z.ZodString;
|
|
@@ -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;AAKvB,eAAO,MAAM,qBAAqB;;;;;;;iBASP,CAAA;AAE3B,eAAO,MAAM,6BAA6B;;;;;;;iBAAwB,CAAA;AAElE,eAAO,MAAM,2BAA2B;;;;iBAMP,CAAA"}
|
|
1
|
+
{"version":3,"file":"member.d.ts","sourceRoot":"","sources":["../../src/schemas/member.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,qBAAqB;;iBAYP,CAAA;AAE3B,eAAO,MAAM,qBAAqB;;;;;;;iBASP,CAAA;AAE3B,eAAO,MAAM,6BAA6B;;;;;;;iBAAwB,CAAA;AAElE,eAAO,MAAM,2BAA2B;;;;iBAMP,CAAA"}
|
package/dist/schemas/member.js
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { RestErrorBodySchema } from '../rest.js';
|
|
3
3
|
import { registry } from './registry.js';
|
|
4
|
+
export const V1MemberMeQuerySchema = z.object({
|
|
5
|
+
refreshAccess: z.preprocess(v => {
|
|
6
|
+
if (v === undefined) return undefined;
|
|
7
|
+
if (Array.isArray(v)) return v[0];
|
|
8
|
+
if (v === true || v === 'true' || v === '1') return true;
|
|
9
|
+
if (v === false || v === 'false' || v === '0') return false;
|
|
10
|
+
return v;
|
|
11
|
+
}, z.boolean()).optional()
|
|
12
|
+
}).openapi('MemberMeQuery');
|
|
4
13
|
export const V1MemberProfileSchema = z.object({
|
|
5
14
|
id: z.string(),
|
|
6
15
|
email: z.string(),
|
|
@@ -76,7 +85,10 @@ registry.registerPath({
|
|
|
76
85
|
method: 'get',
|
|
77
86
|
path: '/v1/members/me',
|
|
78
87
|
tags: ['Members'],
|
|
79
|
-
description: 'Get the authenticated member profile.',
|
|
88
|
+
description: 'Get the authenticated member profile. Set refreshAccess=true to bypass the MemberAccess cache and re-fetch roles from go-api.',
|
|
89
|
+
request: {
|
|
90
|
+
query: V1MemberMeQuerySchema
|
|
91
|
+
},
|
|
80
92
|
responses: {
|
|
81
93
|
200: {
|
|
82
94
|
description: 'Success',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"member.js","names":["z","RestErrorBodySchema","registry","
|
|
1
|
+
{"version":3,"file":"member.js","names":["z","RestErrorBodySchema","registry","V1MemberMeQuerySchema","object","refreshAccess","preprocess","v","undefined","Array","isArray","boolean","optional","openapi","V1MemberProfileSchema","id","string","email","name","twreporterUserId","hasAccess","createdAt","iso","datetime","nullable","V1MemberProfileResponseSchema","V1AccessTokenResponseSchema","accessToken","expiresAt","number","unauthorizedResponse","description","content","schema","internalServerErrorResponse","registerPath","method","path","tags","responses","request","query"],"sources":["../../src/schemas/member.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { RestErrorBodySchema } from '../rest.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 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 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\n// --- OpenAPI path registration ---\n\nconst unauthorizedResponse = {\n 401: {\n description: 'Unauthorized — missing or invalid JWT',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n} as const\n\nconst internalServerErrorResponse = {\n 500: {\n description: 'Internal server error',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n} as const\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"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const V1PostsListQuerySchema: z.ZodObject<{
|
|
3
|
+
take: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
export declare const V1HeaderPostItemSchema: z.ZodObject<{
|
|
6
|
+
title: z.ZodString;
|
|
7
|
+
imageUrl: z.ZodNullable<z.ZodString>;
|
|
8
|
+
href: z.ZodString;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export declare const V1PostsListResponseSchema: z.ZodObject<{
|
|
11
|
+
posts: z.ZodArray<z.ZodObject<{
|
|
12
|
+
title: z.ZodString;
|
|
13
|
+
imageUrl: z.ZodNullable<z.ZodString>;
|
|
14
|
+
href: z.ZodString;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
//# sourceMappingURL=post.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/schemas/post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,sBAAsB;;iBAEjC,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;iBAMP,CAAA;AAE5B,eAAO,MAAM,yBAAyB;;;;;;iBAIP,CAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { RestErrorBodySchema } from '../rest.js';
|
|
3
|
+
import { registry } from './registry.js';
|
|
4
|
+
export const V1PostsListQuerySchema = z.object({
|
|
5
|
+
take: z.coerce.number().int().min(1).max(10).optional()
|
|
6
|
+
});
|
|
7
|
+
export const V1HeaderPostItemSchema = z.object({
|
|
8
|
+
title: z.string(),
|
|
9
|
+
imageUrl: z.string().nullable(),
|
|
10
|
+
href: z.string()
|
|
11
|
+
}).openapi('HeaderPostItem');
|
|
12
|
+
export const V1PostsListResponseSchema = z.object({
|
|
13
|
+
posts: z.array(V1HeaderPostItemSchema)
|
|
14
|
+
}).openapi('PostsListResponse');
|
|
15
|
+
registry.registerPath({
|
|
16
|
+
method: 'get',
|
|
17
|
+
path: '/v1/posts',
|
|
18
|
+
tags: ['Posts'],
|
|
19
|
+
description: 'Latest posts for header.',
|
|
20
|
+
request: {
|
|
21
|
+
query: V1PostsListQuerySchema
|
|
22
|
+
},
|
|
23
|
+
responses: {
|
|
24
|
+
200: {
|
|
25
|
+
description: 'Success',
|
|
26
|
+
content: {
|
|
27
|
+
'application/json': {
|
|
28
|
+
schema: V1PostsListResponseSchema
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
400: {
|
|
33
|
+
description: 'Invalid request',
|
|
34
|
+
content: {
|
|
35
|
+
'application/json': {
|
|
36
|
+
schema: RestErrorBodySchema
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
500: {
|
|
41
|
+
description: 'Internal server error',
|
|
42
|
+
content: {
|
|
43
|
+
'application/json': {
|
|
44
|
+
schema: RestErrorBodySchema
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.js","names":["z","RestErrorBodySchema","registry","V1PostsListQuerySchema","object","take","coerce","number","int","min","max","optional","V1HeaderPostItemSchema","title","string","imageUrl","nullable","href","openapi","V1PostsListResponseSchema","posts","array","registerPath","method","path","tags","description","request","query","responses","content","schema"],"sources":["../../src/schemas/post.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { RestErrorBodySchema } from '../rest.js'\nimport { registry } from './registry.js'\n\nexport const V1PostsListQuerySchema = z.object({\n take: z.coerce.number().int().min(1).max(10).optional(),\n})\n\nexport const V1HeaderPostItemSchema = z\n .object({\n title: z.string(),\n imageUrl: z.string().nullable(),\n href: z.string(),\n })\n .openapi('HeaderPostItem')\n\nexport const V1PostsListResponseSchema = z\n .object({\n posts: z.array(V1HeaderPostItemSchema),\n })\n .openapi('PostsListResponse')\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/posts',\n tags: ['Posts'],\n description: 'Latest posts for header.',\n request: { query: V1PostsListQuerySchema },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1PostsListResponseSchema },\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"],"mappings":"AAAA,SAASA,CAAC,QAAQ,KAAK;AAEvB,SAASC,mBAAmB,QAAQ,YAAY;AAChD,SAASC,QAAQ,QAAQ,eAAe;AAExC,OAAO,MAAMC,sBAAsB,GAAGH,CAAC,CAACI,MAAM,CAAC;EAC7CC,IAAI,EAAEL,CAAC,CAACM,MAAM,CAACC,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC;AACxD,CAAC,CAAC;AAEF,OAAO,MAAMC,sBAAsB,GAAGZ,CAAC,CACpCI,MAAM,CAAC;EACNS,KAAK,EAAEb,CAAC,CAACc,MAAM,CAAC,CAAC;EACjBC,QAAQ,EAAEf,CAAC,CAACc,MAAM,CAAC,CAAC,CAACE,QAAQ,CAAC,CAAC;EAC/BC,IAAI,EAAEjB,CAAC,CAACc,MAAM,CAAC;AACjB,CAAC,CAAC,CACDI,OAAO,CAAC,gBAAgB,CAAC;AAE5B,OAAO,MAAMC,yBAAyB,GAAGnB,CAAC,CACvCI,MAAM,CAAC;EACNgB,KAAK,EAAEpB,CAAC,CAACqB,KAAK,CAACT,sBAAsB;AACvC,CAAC,CAAC,CACDM,OAAO,CAAC,mBAAmB,CAAC;AAE/BhB,QAAQ,CAACoB,YAAY,CAAC;EACpBC,MAAM,EAAE,KAAK;EACbC,IAAI,EAAE,WAAW;EACjBC,IAAI,EAAE,CAAC,OAAO,CAAC;EACfC,WAAW,EAAE,0BAA0B;EACvCC,OAAO,EAAE;IAAEC,KAAK,EAAEzB;EAAuB,CAAC;EAC1C0B,SAAS,EAAE;IACT,GAAG,EAAE;MACHH,WAAW,EAAE,SAAS;MACtBI,OAAO,EAAE;QACP,kBAAkB,EAAE;UAAEC,MAAM,EAAEZ;QAA0B;MAC1D;IACF,CAAC;IACD,GAAG,EAAE;MACHO,WAAW,EAAE,iBAAiB;MAC9BI,OAAO,EAAE;QAAE,kBAAkB,EAAE;UAAEC,MAAM,EAAE9B;QAAoB;MAAE;IACjE,CAAC;IACD,GAAG,EAAE;MACHyB,WAAW,EAAE,uBAAuB;MACpCI,OAAO,EAAE;QAAE,kBAAkB,EAAE;UAAEC,MAAM,EAAE9B;QAAoB;MAAE;IACjE;EACF;AACF,CAAC,CAAC","ignoreList":[]}
|