-
Notifications
You must be signed in to change notification settings - Fork 69
Expand file tree
/
Copy pathgateway-utils.ts
More file actions
122 lines (102 loc) · 3.48 KB
/
gateway-utils.ts
File metadata and controls
122 lines (102 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import type {Request, Response} from '@gravity-ui/expresskit';
import type {ApiServiceActionConfig, GetAuthHeaders} from '@gravity-ui/gateway';
import type {AppContext} from '@gravity-ui/nodekit';
import type z from 'zod';
import {AuthHeader} from '../constants';
export const getAuthHeadersNone = () => undefined;
export function createAction<TOutput, TParams = undefined, TTransformed = TOutput>(
config: ApiServiceActionConfig<AppContext, Request, Response, TOutput, TParams, TTransformed>,
) {
return config;
}
type TypedActionSchema = {
paramsSchema?: z.ZodType;
resultSchema: z.ZodType;
};
const VALIDATION_SCHEMA_KEY = Symbol('$schema');
const registerValidationSchema = <T extends object>(value: T, schema: TypedActionSchema): T => {
Object.defineProperty(value, VALIDATION_SCHEMA_KEY, {
value: schema,
configurable: true,
});
return value;
};
export const hasValidationSchema = (
value: object,
): value is {[VALIDATION_SCHEMA_KEY]: TypedActionSchema} => {
return Object.prototype.hasOwnProperty.call(value, VALIDATION_SCHEMA_KEY);
};
export const getValidationSchema = (value: object): TypedActionSchema | null => {
return hasValidationSchema(value) ? value[VALIDATION_SCHEMA_KEY] : null;
};
export const createTypedAction = <TOutput, TParams, TTransformed = TOutput>(
schema: {
resultSchema: z.ZodType<TOutput>;
paramsSchema?: z.ZodType<TParams>;
transformedSchema?: z.ZodType<TTransformed>;
},
actionConfig: ApiServiceActionConfig<
AppContext,
Request,
Response,
NoInfer<TOutput>,
NoInfer<TParams>,
NoInfer<TTransformed>
>,
) => {
const schemaValidationObject = {
paramsSchema: schema.paramsSchema,
resultSchema: schema.transformedSchema ?? schema.resultSchema,
};
return registerValidationSchema(actionConfig, schemaValidationObject);
};
export const createExtendedTypedAction =
<TConfigOutput, TConfigParams, TConfigTransformed = TConfigOutput>(
actionConfig: ApiServiceActionConfig<
AppContext,
Request,
Response,
TConfigOutput,
TConfigParams,
TConfigTransformed
>,
) =>
<TResult extends TConfigTransformed, TParams extends TConfigParams>(schema: {
resultSchema: z.ZodType<TResult>;
paramsSchema: z.ZodType<TParams>;
}) => {
const schemaValidationObject = {
paramsSchema: schema.paramsSchema,
resultSchema: schema.resultSchema,
};
return registerValidationSchema(
actionConfig as unknown as ApiServiceActionConfig<
AppContext,
Request,
Response,
TConfigOutput,
TParams,
TResult
>,
schemaValidationObject,
);
};
type AuthArgsData = {
accessToken?: string;
};
export const getAuthArgs = (req: Request, _res: Response): AuthArgsData => {
return {
accessToken: req.ctx.get('user')?.accessToken,
};
};
const createGetAuthHeaders: () => GetAuthHeaders<AuthArgsData> = () => (params) => {
const {authArgs} = params;
const resultHeaders = {};
if (authArgs?.accessToken) {
Object.assign(resultHeaders, {
[AuthHeader.Authorization]: `Bearer ${authArgs.accessToken}`,
});
}
return resultHeaders;
};
export const getAuthHeaders: GetAuthHeaders<AuthArgsData> = createGetAuthHeaders();