@twreporter-academy/api-types 0.0.7 → 0.0.8
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 +3 -0
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +3 -0
- package/dist/openapi.js.map +1 -1
- package/dist/schemas/member.d.ts +6 -0
- package/dist/schemas/member.d.ts.map +1 -1
- package/dist/schemas/member.js +72 -0
- package/dist/schemas/member.js.map +1 -1
- package/package.json +1 -1
package/dist/openapi.d.ts
CHANGED
|
@@ -9,6 +9,9 @@ export declare function getOpenApiDocument(): {
|
|
|
9
9
|
} | {
|
|
10
10
|
readonly name: "Members";
|
|
11
11
|
readonly description: "Authenticated member profile.";
|
|
12
|
+
} | {
|
|
13
|
+
readonly name: "Admin";
|
|
14
|
+
readonly description: "Privileged operations requiring GCP IAM authentication.";
|
|
12
15
|
} | {
|
|
13
16
|
readonly name: "Tags";
|
|
14
17
|
readonly description: "Tag metadata and course feeds by slug.";
|
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;
|
|
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;AAiB1B,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;EAcjC"}
|
package/dist/openapi.js
CHANGED
|
@@ -11,6 +11,9 @@ const openApiRootTags = [{
|
|
|
11
11
|
}, {
|
|
12
12
|
name: 'Members',
|
|
13
13
|
description: 'Authenticated member profile.'
|
|
14
|
+
}, {
|
|
15
|
+
name: 'Admin',
|
|
16
|
+
description: 'Privileged operations requiring GCP IAM authentication.'
|
|
14
17
|
}, {
|
|
15
18
|
name: 'Tags',
|
|
16
19
|
description: 'Tag metadata and course feeds by slug.'
|
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'\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":[]}
|
|
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 {\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] 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;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,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":[]}
|
package/dist/schemas/member.d.ts
CHANGED
|
@@ -23,4 +23,10 @@ export declare const V1AccessTokenResponseSchema: z.ZodObject<{
|
|
|
23
23
|
twreporterUserId: z.ZodString;
|
|
24
24
|
expiresAt: z.ZodNumber;
|
|
25
25
|
}, z.core.$strip>;
|
|
26
|
+
export declare const V1RevokeMemberCacheBodySchema: z.ZodObject<{
|
|
27
|
+
email: z.ZodEmail;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
export declare const V1RevokeMemberCacheResponseSchema: z.ZodObject<{
|
|
30
|
+
ok: z.ZodLiteral<true>;
|
|
31
|
+
}, z.core.$strip>;
|
|
26
32
|
//# sourceMappingURL=member.d.ts.map
|
|
@@ -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;;iBAYP,CAAA;AAE3B,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;AAEjC,eAAO,MAAM,6BAA6B;;iBAIP,CAAA;AAEnC,eAAO,MAAM,iCAAiC;;iBAIP,CAAA"}
|
package/dist/schemas/member.js
CHANGED
|
@@ -24,6 +24,12 @@ export const V1AccessTokenResponseSchema = z.object({
|
|
|
24
24
|
twreporterUserId: z.string(),
|
|
25
25
|
expiresAt: z.number()
|
|
26
26
|
}).openapi('AccessTokenResponse');
|
|
27
|
+
export const V1RevokeMemberCacheBodySchema = z.object({
|
|
28
|
+
email: z.email()
|
|
29
|
+
}).openapi('RevokeMemberCacheBody');
|
|
30
|
+
export const V1RevokeMemberCacheResponseSchema = z.object({
|
|
31
|
+
ok: z.literal(true)
|
|
32
|
+
}).openapi('RevokeMemberCacheResponse');
|
|
27
33
|
|
|
28
34
|
// --- OpenAPI path registration ---
|
|
29
35
|
|
|
@@ -110,4 +116,70 @@ registry.registerPath({
|
|
|
110
116
|
...internalServerErrorResponse
|
|
111
117
|
}
|
|
112
118
|
});
|
|
119
|
+
registry.registerPath({
|
|
120
|
+
method: 'post',
|
|
121
|
+
path: '/v1/admin/members/revoke-cache',
|
|
122
|
+
tags: ['Admin'],
|
|
123
|
+
description: 'Invalidate MemberAccess cache for a member by email (clear checkedAt). Requires a Google OIDC ID token from an allowlisted caller. Manual grants return 409.',
|
|
124
|
+
request: {
|
|
125
|
+
body: {
|
|
126
|
+
content: {
|
|
127
|
+
'application/json': {
|
|
128
|
+
schema: V1RevokeMemberCacheBodySchema
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
responses: {
|
|
134
|
+
200: {
|
|
135
|
+
description: 'Cache invalidated (or already absent)',
|
|
136
|
+
content: {
|
|
137
|
+
'application/json': {
|
|
138
|
+
schema: V1RevokeMemberCacheResponseSchema
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
400: {
|
|
143
|
+
description: 'Invalid request body',
|
|
144
|
+
content: {
|
|
145
|
+
'application/json': {
|
|
146
|
+
schema: RestErrorBodySchema
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
401: {
|
|
151
|
+
description: 'Unauthorized — missing or invalid GCP IAM token',
|
|
152
|
+
content: {
|
|
153
|
+
'application/json': {
|
|
154
|
+
schema: RestErrorBodySchema
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
403: {
|
|
159
|
+
description: 'Forbidden — valid token but caller not allowlisted',
|
|
160
|
+
content: {
|
|
161
|
+
'application/json': {
|
|
162
|
+
schema: RestErrorBodySchema
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
404: {
|
|
167
|
+
description: 'Member not found',
|
|
168
|
+
content: {
|
|
169
|
+
'application/json': {
|
|
170
|
+
schema: RestErrorBodySchema
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
409: {
|
|
175
|
+
description: 'Conflict — member has a manual grant',
|
|
176
|
+
content: {
|
|
177
|
+
'application/json': {
|
|
178
|
+
schema: RestErrorBodySchema
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
...internalServerErrorResponse
|
|
183
|
+
}
|
|
184
|
+
});
|
|
113
185
|
//# sourceMappingURL=member.js.map
|
|
@@ -1 +1 @@
|
|
|
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":"AAAA,SAASA,CAAC,QAAQ,KAAK;AAEvB,SAASC,mBAAmB,QAAQ,YAAY;AAChD,SAASC,QAAQ,QAAQ,eAAe;AAExC,OAAO,MAAMC,qBAAqB,GAAGH,CAAC,CACnCI,MAAM,CAAC;EACNC,aAAa,EAAEL,CAAC,CACbM,UAAU,CAAEC,CAAC,IAAK;IACjB,IAAIA,CAAC,KAAKC,SAAS,EAAE,OAAOA,SAAS;IACrC,IAAIC,KAAK,CAACC,OAAO,CAACH,CAAC,CAAC,EAAE,OAAOA,CAAC,CAAC,CAAC,CAAC;IACjC,IAAIA,CAAC,KAAK,IAAI,IAAIA,CAAC,KAAK,MAAM,IAAIA,CAAC,KAAK,GAAG,EAAE,OAAO,IAAI;IACxD,IAAIA,CAAC,KAAK,KAAK,IAAIA,CAAC,KAAK,OAAO,IAAIA,CAAC,KAAK,GAAG,EAAE,OAAO,KAAK;IAC3D,OAAOA,CAAC;EACV,CAAC,EAAEP,CAAC,CAACW,OAAO,CAAC,CAAC,CAAC,CACdC,QAAQ,CAAC;AACd,CAAC,CAAC,CACDC,OAAO,CAAC,eAAe,CAAC;AAE3B,OAAO,MAAMC,qBAAqB,GAAGd,CAAC,CACnCI,MAAM,CAAC;EACNW,EAAE,EAAEf,CAAC,CAACgB,MAAM,CAAC,CAAC;EACdC,KAAK,EAAEjB,CAAC,CAACgB,MAAM,CAAC,CAAC;EACjBE,IAAI,EAAElB,CAAC,CAACgB,MAAM,CAAC,CAAC;EAChBG,gBAAgB,EAAEnB,CAAC,CAACgB,MAAM,CAAC,CAAC;EAC5BI,SAAS,EAAEpB,CAAC,CAACW,OAAO,CAAC,CAAC;EACtBU,SAAS,EAAErB,CAAC,CAACsB,GAAG,CAACC,QAAQ,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,CAACZ,QAAQ,CAAC;AAClD,CAAC,CAAC,CACDC,OAAO,CAAC,eAAe,CAAC;AAE3B,OAAO,MAAMY,6BAA6B,GAAGX,qBAAqB;AAElE,OAAO,MAAMY,2BAA2B,GAAG1B,CAAC,CACzCI,MAAM,CAAC;EACNuB,WAAW,EAAE3B,CAAC,CAACgB,MAAM,CAAC,CAAC;EACvBG,gBAAgB,EAAEnB,CAAC,CAACgB,MAAM,CAAC,CAAC;EAC5BY,SAAS,EAAE5B,CAAC,CAAC6B,MAAM,CAAC;AACtB,CAAC,CAAC,CACDhB,OAAO,CAAC,qBAAqB,CAAC
|
|
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","V1RevokeMemberCacheBodySchema","V1RevokeMemberCacheResponseSchema","ok","literal","unauthorizedResponse","description","content","schema","internalServerErrorResponse","registerPath","method","path","tags","responses","request","query","body"],"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\nexport const V1RevokeMemberCacheBodySchema = z\n .object({\n email: z.email(),\n })\n .openapi('RevokeMemberCacheBody')\n\nexport const V1RevokeMemberCacheResponseSchema = z\n .object({\n ok: z.literal(true),\n })\n .openapi('RevokeMemberCacheResponse')\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\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. Manual grants return 409.',\n request: {\n body: {\n content: {\n 'application/json': { schema: V1RevokeMemberCacheBodySchema },\n },\n },\n },\n responses: {\n 200: {\n description: 'Cache invalidated (or already absent)',\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 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 409: {\n description: 'Conflict — member has a manual grant',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
|