@twreporter-academy/api-types 0.0.19 → 0.0.21
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/schemas/member.d.ts
CHANGED
|
@@ -2,14 +2,45 @@ import { z } from 'zod';
|
|
|
2
2
|
export declare const V1MemberMeQuerySchema: z.ZodObject<{
|
|
3
3
|
refreshAccess: z.ZodOptional<z.ZodPreprocess<z.ZodBoolean>>;
|
|
4
4
|
}, z.core.$strip>;
|
|
5
|
+
export declare const V1AcademyPlanSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
|
+
type: z.ZodLiteral<"monthly">;
|
|
7
|
+
accessUntil: z.ZodNull;
|
|
8
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
9
|
+
type: z.ZodLiteral<"oneTime">;
|
|
10
|
+
accessUntil: z.ZodNullable<z.ZodISODateTime>;
|
|
11
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
12
|
+
type: z.ZodLiteral<"staffPass">;
|
|
13
|
+
accessUntil: z.ZodNull;
|
|
14
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
15
|
+
type: z.ZodLiteral<"publicWelfarePass">;
|
|
16
|
+
accessUntil: z.ZodNullable<z.ZodISODateTime>;
|
|
17
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
18
|
+
type: z.ZodLiteral<"none">;
|
|
19
|
+
accessUntil: z.ZodNull;
|
|
20
|
+
}, z.core.$strip>], "type">;
|
|
5
21
|
export declare const V1MemberProfileSchema: z.ZodObject<{
|
|
6
22
|
id: z.ZodString;
|
|
7
23
|
email: z.ZodString;
|
|
8
24
|
name: z.ZodString;
|
|
9
25
|
twreporterUserId: z.ZodString;
|
|
10
26
|
hasAccess: z.ZodBoolean;
|
|
27
|
+
plan: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
28
|
+
type: z.ZodLiteral<"monthly">;
|
|
29
|
+
accessUntil: z.ZodNull;
|
|
30
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
31
|
+
type: z.ZodLiteral<"oneTime">;
|
|
32
|
+
accessUntil: z.ZodNullable<z.ZodISODateTime>;
|
|
33
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
34
|
+
type: z.ZodLiteral<"staffPass">;
|
|
35
|
+
accessUntil: z.ZodNull;
|
|
36
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
37
|
+
type: z.ZodLiteral<"publicWelfarePass">;
|
|
38
|
+
accessUntil: z.ZodNullable<z.ZodISODateTime>;
|
|
39
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
40
|
+
type: z.ZodLiteral<"none">;
|
|
41
|
+
accessUntil: z.ZodNull;
|
|
42
|
+
}, z.core.$strip>], "type">;
|
|
11
43
|
role: z.ZodNullable<z.ZodString>;
|
|
12
|
-
expiredAt: z.ZodNullable<z.ZodISODateTime>;
|
|
13
44
|
createdAt: z.ZodOptional<z.ZodNullable<z.ZodISODateTime>>;
|
|
14
45
|
}, z.core.$strip>;
|
|
15
46
|
export declare const V1MemberProfileResponseSchema: z.ZodObject<{
|
|
@@ -18,8 +49,23 @@ export declare const V1MemberProfileResponseSchema: z.ZodObject<{
|
|
|
18
49
|
name: z.ZodString;
|
|
19
50
|
twreporterUserId: z.ZodString;
|
|
20
51
|
hasAccess: z.ZodBoolean;
|
|
52
|
+
plan: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
53
|
+
type: z.ZodLiteral<"monthly">;
|
|
54
|
+
accessUntil: z.ZodNull;
|
|
55
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
56
|
+
type: z.ZodLiteral<"oneTime">;
|
|
57
|
+
accessUntil: z.ZodNullable<z.ZodISODateTime>;
|
|
58
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
59
|
+
type: z.ZodLiteral<"staffPass">;
|
|
60
|
+
accessUntil: z.ZodNull;
|
|
61
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
62
|
+
type: z.ZodLiteral<"publicWelfarePass">;
|
|
63
|
+
accessUntil: z.ZodNullable<z.ZodISODateTime>;
|
|
64
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
65
|
+
type: z.ZodLiteral<"none">;
|
|
66
|
+
accessUntil: z.ZodNull;
|
|
67
|
+
}, z.core.$strip>], "type">;
|
|
21
68
|
role: z.ZodNullable<z.ZodString>;
|
|
22
|
-
expiredAt: z.ZodNullable<z.ZodISODateTime>;
|
|
23
69
|
createdAt: z.ZodOptional<z.ZodNullable<z.ZodISODateTime>>;
|
|
24
70
|
}, z.core.$strip>;
|
|
25
71
|
export declare const V1AccessTokenResponseSchema: z.ZodObject<{
|
|
@@ -33,14 +79,12 @@ export declare const V1RevokeMemberCacheBodySchema: z.ZodObject<{
|
|
|
33
79
|
export declare const V1RevokeMemberCacheOutcomeSchema: z.ZodEnum<{
|
|
34
80
|
not_found: "not_found";
|
|
35
81
|
revoked: "revoked";
|
|
36
|
-
manual_grant: "manual_grant";
|
|
37
82
|
}>;
|
|
38
83
|
export declare const V1RevokeMemberCacheResponseSchema: z.ZodObject<{
|
|
39
84
|
ok: z.ZodLiteral<true>;
|
|
40
85
|
outcome: z.ZodEnum<{
|
|
41
86
|
not_found: "not_found";
|
|
42
87
|
revoked: "revoked";
|
|
43
|
-
manual_grant: "manual_grant";
|
|
44
88
|
}>;
|
|
45
89
|
}, z.core.$strip>;
|
|
46
90
|
//# 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;AAUvB,eAAO,MAAM,qBAAqB;;iBAYP,CAAA;AAE3B,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"member.d.ts","sourceRoot":"","sources":["../../src/schemas/member.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAUvB,eAAO,MAAM,qBAAqB;;iBAYP,CAAA;AAE3B,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;2BAiBP,CAAA;AAEzB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBAcP,CAAA;AAE3B,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;iBAAwB,CAAA;AAElE,eAAO,MAAM,2BAA2B;;;;iBAMP,CAAA;AAEjC,eAAO,MAAM,6BAA6B;;iBAIP,CAAA;AAEnC,eAAO,MAAM,gCAAgC;;;EAAmC,CAAA;AAEhF,eAAO,MAAM,iCAAiC;;;;;;iBAKP,CAAA"}
|
package/dist/schemas/member.js
CHANGED
|
@@ -12,14 +12,33 @@ export const V1MemberMeQuerySchema = z.object({
|
|
|
12
12
|
return v;
|
|
13
13
|
}, z.boolean()).optional()
|
|
14
14
|
}).openapi('MemberMeQuery');
|
|
15
|
+
export const V1AcademyPlanSchema = z.discriminatedUnion('type', [z.object({
|
|
16
|
+
type: z.literal('monthly'),
|
|
17
|
+
accessUntil: z.null()
|
|
18
|
+
}), z.object({
|
|
19
|
+
type: z.literal('oneTime'),
|
|
20
|
+
accessUntil: z.iso.datetime().nullable()
|
|
21
|
+
}), z.object({
|
|
22
|
+
type: z.literal('staffPass'),
|
|
23
|
+
accessUntil: z.null()
|
|
24
|
+
}), z.object({
|
|
25
|
+
type: z.literal('publicWelfarePass'),
|
|
26
|
+
accessUntil: z.iso.datetime().nullable()
|
|
27
|
+
}), z.object({
|
|
28
|
+
type: z.literal('none'),
|
|
29
|
+
accessUntil: z.null()
|
|
30
|
+
})]).openapi('AcademyPlan');
|
|
15
31
|
export const V1MemberProfileSchema = z.object({
|
|
16
32
|
id: z.string(),
|
|
17
33
|
email: z.string(),
|
|
18
34
|
name: z.string(),
|
|
19
35
|
twreporterUserId: z.string(),
|
|
20
36
|
hasAccess: z.boolean(),
|
|
21
|
-
|
|
22
|
-
|
|
37
|
+
plan: V1AcademyPlanSchema,
|
|
38
|
+
role: z.string().nullable().openapi({
|
|
39
|
+
deprecated: true,
|
|
40
|
+
description: 'Legacy upstream TW Reporter role; use plan instead.'
|
|
41
|
+
}),
|
|
23
42
|
createdAt: z.iso.datetime().nullable().optional()
|
|
24
43
|
}).openapi('MemberProfile');
|
|
25
44
|
export const V1MemberProfileResponseSchema = V1MemberProfileSchema;
|
|
@@ -31,7 +50,7 @@ export const V1AccessTokenResponseSchema = z.object({
|
|
|
31
50
|
export const V1RevokeMemberCacheBodySchema = z.object({
|
|
32
51
|
email: z.email()
|
|
33
52
|
}).openapi('RevokeMemberCacheBody');
|
|
34
|
-
export const V1RevokeMemberCacheOutcomeSchema = z.enum(['revoked', 'not_found'
|
|
53
|
+
export const V1RevokeMemberCacheOutcomeSchema = z.enum(['revoked', 'not_found']);
|
|
35
54
|
export const V1RevokeMemberCacheResponseSchema = z.object({
|
|
36
55
|
ok: z.literal(true),
|
|
37
56
|
outcome: V1RevokeMemberCacheOutcomeSchema
|
|
@@ -132,7 +151,7 @@ registry.registerPath({
|
|
|
132
151
|
method: 'post',
|
|
133
152
|
path: '/v1/admin/members/revoke-cache',
|
|
134
153
|
tags: ['Admin'],
|
|
135
|
-
description: 'Invalidate MemberAccess cache for a member by email (clear checkedAt). Requires a Google OIDC ID token from an allowlisted caller. Terminal outcomes (revoked, not_found
|
|
154
|
+
description: 'Invalidate MemberAccess cache for a member by email (clear checkedAt). Requires a Google OIDC ID token from an allowlisted caller. Terminal outcomes (revoked, not_found) always return 200 so Pub/Sub push can acknowledge delivery.',
|
|
136
155
|
request: {
|
|
137
156
|
body: {
|
|
138
157
|
content: {
|
|
@@ -144,7 +163,7 @@ registry.registerPath({
|
|
|
144
163
|
},
|
|
145
164
|
responses: {
|
|
146
165
|
200: {
|
|
147
|
-
description: 'Request processed. outcome is revoked
|
|
166
|
+
description: 'Request processed. outcome is revoked or not_found.',
|
|
148
167
|
content: {
|
|
149
168
|
'application/json': {
|
|
150
169
|
schema: V1RevokeMemberCacheResponseSchema
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"member.js","names":["z","internalServerErrorResponse","unauthorizedResponse","RestErrorBodySchema","V1CoursesLearningListResponseSchema","registry","V1MemberMeQuerySchema","object","refreshAccess","preprocess","v","undefined","Array","isArray","boolean","optional","openapi","V1MemberProfileSchema","id","string","email","name","twreporterUserId","hasAccess","role","nullable","expiredAt","iso","datetime","createdAt","V1MemberProfileResponseSchema","V1AccessTokenResponseSchema","accessToken","expiresAt","number","V1RevokeMemberCacheBodySchema","V1RevokeMemberCacheOutcomeSchema","enum","V1RevokeMemberCacheResponseSchema","ok","literal","outcome","registerPath","method","path","tags","description","responses","content","schema","request","query","body"],"sources":["../../src/schemas/member.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n internalServerErrorResponse,\n unauthorizedResponse,\n} from '../responses.js'\nimport { RestErrorBodySchema } from '../rest.js'\nimport { V1CoursesLearningListResponseSchema } from './course.js'\nimport { registry } from './registry.js'\n\nexport const V1MemberMeQuerySchema = z\n .object({\n refreshAccess: z\n .preprocess((v) => {\n if (v === undefined) return undefined\n if (Array.isArray(v)) return v[0]\n if (v === true || v === 'true' || v === '1') return true\n if (v === false || v === 'false' || v === '0') return false\n return v\n }, z.boolean())\n .optional(),\n })\n .openapi('MemberMeQuery')\n\nexport const 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 role: z.string().nullable(),\n expiredAt: z.iso.datetime().nullable(),\n createdAt: z.iso.datetime().nullable().optional(),\n })\n .openapi('MemberProfile')\n\nexport const V1MemberProfileResponseSchema = V1MemberProfileSchema\n\nexport const V1AccessTokenResponseSchema = z\n .object({\n accessToken: z.string(),\n twreporterUserId: z.string(),\n expiresAt: z.number(),\n })\n .openapi('AccessTokenResponse')\n\nexport const V1RevokeMemberCacheBodySchema = z\n .object({\n email: z.email(),\n })\n .openapi('RevokeMemberCacheBody')\n\nexport const V1RevokeMemberCacheOutcomeSchema = z.enum([\n 'revoked',\n 'not_found',\n 'manual_grant',\n])\n\nexport const V1RevokeMemberCacheResponseSchema = z\n .object({\n ok: z.literal(true),\n outcome: V1RevokeMemberCacheOutcomeSchema,\n })\n .openapi('RevokeMemberCacheResponse')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'post',\n path: '/auth/access-token',\n tags: ['Auth'],\n description:\n 'Exchange id_token cookie for a JWT access token. Creates the member on first login.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1AccessTokenResponseSchema },\n },\n },\n 400: {\n description: 'Bad request — missing id_token cookie',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — missing, invalid, or disallowed Origin',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/members/me',\n tags: ['Members'],\n description:\n 'Get the authenticated member profile. Set refreshAccess=true to bypass the MemberAccess cache and re-fetch roles from go-api.',\n request: {\n query: V1MemberMeQuerySchema,\n },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1MemberProfileResponseSchema },\n },\n },\n 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/members/me/learning-courses',\n tags: ['Members'],\n description:\n 'Authenticated my-learning list of published courses with watch history. Includes completion progress. unitTitle is the next incomplete lesson (CMS order asc), or the last lesson when all are complete. Sorted: new badge by launchAt desc, then others by launchAt desc. Does not require membership hasAccess (free-lesson history included). Requires Bearer JWT.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesLearningListResponseSchema },\n },\n },\n 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/admin/members/revoke-cache',\n tags: ['Admin'],\n description:\n 'Invalidate MemberAccess cache for a member by email (clear checkedAt). Requires a Google OIDC ID token from an allowlisted caller. Terminal outcomes (revoked, not_found, manual_grant) always return 200 so Pub/Sub push can acknowledge delivery.',\n request: {\n body: {\n content: {\n 'application/json': { schema: V1RevokeMemberCacheBodySchema },\n },\n },\n },\n responses: {\n 200: {\n description:\n 'Request processed. outcome is revoked, not_found, or manual_grant.',\n content: {\n 'application/json': { schema: V1RevokeMemberCacheResponseSchema },\n },\n },\n 400: {\n description: 'Invalid request body',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 401: {\n description: 'Unauthorized — missing or invalid GCP IAM token',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — valid token but caller not allowlisted',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"member.js","names":["z","internalServerErrorResponse","unauthorizedResponse","RestErrorBodySchema","V1CoursesLearningListResponseSchema","registry","V1MemberMeQuerySchema","object","refreshAccess","preprocess","v","undefined","Array","isArray","boolean","optional","openapi","V1AcademyPlanSchema","discriminatedUnion","type","literal","accessUntil","null","iso","datetime","nullable","V1MemberProfileSchema","id","string","email","name","twreporterUserId","hasAccess","plan","role","deprecated","description","createdAt","V1MemberProfileResponseSchema","V1AccessTokenResponseSchema","accessToken","expiresAt","number","V1RevokeMemberCacheBodySchema","V1RevokeMemberCacheOutcomeSchema","enum","V1RevokeMemberCacheResponseSchema","ok","outcome","registerPath","method","path","tags","responses","content","schema","request","query","body"],"sources":["../../src/schemas/member.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport {\n internalServerErrorResponse,\n unauthorizedResponse,\n} from '../responses.js'\nimport { RestErrorBodySchema } from '../rest.js'\nimport { V1CoursesLearningListResponseSchema } from './course.js'\nimport { registry } from './registry.js'\n\nexport const V1MemberMeQuerySchema = z\n .object({\n refreshAccess: z\n .preprocess((v) => {\n if (v === undefined) return undefined\n if (Array.isArray(v)) return v[0]\n if (v === true || v === 'true' || v === '1') return true\n if (v === false || v === 'false' || v === '0') return false\n return v\n }, z.boolean())\n .optional(),\n })\n .openapi('MemberMeQuery')\n\nexport const V1AcademyPlanSchema = z\n .discriminatedUnion('type', [\n z.object({ type: z.literal('monthly'), accessUntil: z.null() }),\n z.object({\n type: z.literal('oneTime'),\n accessUntil: z.iso.datetime().nullable(),\n }),\n z.object({\n type: z.literal('staffPass'),\n accessUntil: z.null(),\n }),\n z.object({\n type: z.literal('publicWelfarePass'),\n accessUntil: z.iso.datetime().nullable(),\n }),\n z.object({ type: z.literal('none'), accessUntil: z.null() }),\n ])\n .openapi('AcademyPlan')\n\nexport const V1MemberProfileSchema = z\n .object({\n id: z.string(),\n email: z.string(),\n name: z.string(),\n twreporterUserId: z.string(),\n hasAccess: z.boolean(),\n plan: V1AcademyPlanSchema,\n role: z.string().nullable().openapi({\n deprecated: true,\n description: 'Legacy upstream TW Reporter role; use plan instead.',\n }),\n createdAt: z.iso.datetime().nullable().optional(),\n })\n .openapi('MemberProfile')\n\nexport const V1MemberProfileResponseSchema = V1MemberProfileSchema\n\nexport const V1AccessTokenResponseSchema = z\n .object({\n accessToken: z.string(),\n twreporterUserId: z.string(),\n expiresAt: z.number(),\n })\n .openapi('AccessTokenResponse')\n\nexport const V1RevokeMemberCacheBodySchema = z\n .object({\n email: z.email(),\n })\n .openapi('RevokeMemberCacheBody')\n\nexport const V1RevokeMemberCacheOutcomeSchema = z.enum(['revoked', 'not_found'])\n\nexport const V1RevokeMemberCacheResponseSchema = z\n .object({\n ok: z.literal(true),\n outcome: V1RevokeMemberCacheOutcomeSchema,\n })\n .openapi('RevokeMemberCacheResponse')\n\n// --- OpenAPI path registration ---\n\nregistry.registerPath({\n method: 'post',\n path: '/auth/access-token',\n tags: ['Auth'],\n description:\n 'Exchange id_token cookie for a JWT access token. Creates the member on first login.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1AccessTokenResponseSchema },\n },\n },\n 400: {\n description: 'Bad request — missing id_token cookie',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — missing, invalid, or disallowed Origin',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/members/me',\n tags: ['Members'],\n description:\n 'Get the authenticated member profile. Set refreshAccess=true to bypass the MemberAccess cache and re-fetch roles from go-api.',\n request: {\n query: V1MemberMeQuerySchema,\n },\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1MemberProfileResponseSchema },\n },\n },\n 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/members/me/learning-courses',\n tags: ['Members'],\n description:\n 'Authenticated my-learning list of published courses with watch history. Includes completion progress. unitTitle is the next incomplete lesson (CMS order asc), or the last lesson when all are complete. Sorted: new badge by launchAt desc, then others by launchAt desc. Does not require membership hasAccess (free-lesson history included). Requires Bearer JWT.',\n responses: {\n 200: {\n description: 'Success',\n content: {\n 'application/json': { schema: V1CoursesLearningListResponseSchema },\n },\n },\n 404: {\n description: 'Member not found',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...unauthorizedResponse,\n ...internalServerErrorResponse,\n },\n})\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/admin/members/revoke-cache',\n tags: ['Admin'],\n description:\n 'Invalidate MemberAccess cache for a member by email (clear checkedAt). Requires a Google OIDC ID token from an allowlisted caller. Terminal outcomes (revoked, not_found) always return 200 so Pub/Sub push can acknowledge delivery.',\n request: {\n body: {\n content: {\n 'application/json': { schema: V1RevokeMemberCacheBodySchema },\n },\n },\n },\n responses: {\n 200: {\n description: 'Request processed. outcome is revoked or not_found.',\n content: {\n 'application/json': { schema: V1RevokeMemberCacheResponseSchema },\n },\n },\n 400: {\n description: 'Invalid request body',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 401: {\n description: 'Unauthorized — missing or invalid GCP IAM token',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n 403: {\n description: 'Forbidden — valid token but caller not allowlisted',\n content: { 'application/json': { schema: RestErrorBodySchema } },\n },\n ...internalServerErrorResponse,\n },\n})\n"],"mappings":"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","ignoreList":[]}
|