@shadimakhoul/ggcoach 1.0.2 → 1.0.4
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/config/initExpress.ts +1 -4
- package/middleware/swagger.ts +2 -2
- package/middleware/validation.ts +44 -5
- package/package.json +17 -9
- package/tsconfig.json +4 -1
- package/utils/openapi.ts +139 -4
- package/dist/config/config.d.ts +0 -8
- package/dist/config/config.d.ts.map +0 -1
- package/dist/config/config.js +0 -11
- package/dist/config/config.js.map +0 -1
- package/dist/config/index.d.ts +0 -4
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -20
- package/dist/config/index.js.map +0 -1
- package/dist/config/initExpress.d.ts +0 -2
- package/dist/config/initExpress.d.ts.map +0 -1
- package/dist/config/initExpress.js +0 -29
- package/dist/config/initExpress.js.map +0 -1
- package/dist/config/redis.d.ts +0 -6
- package/dist/config/redis.d.ts.map +0 -1
- package/dist/config/redis.js +0 -32
- package/dist/config/redis.js.map +0 -1
- package/dist/config/swagger-ui.d.ts +0 -6
- package/dist/config/swagger-ui.d.ts.map +0 -1
- package/dist/config/swagger-ui.js +0 -88
- package/dist/config/swagger-ui.js.map +0 -1
- package/dist/config/swagger.d.ts +0 -9
- package/dist/config/swagger.d.ts.map +0 -1
- package/dist/config/swagger.js +0 -4406
- package/dist/config/swagger.js.map +0 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -21
- package/dist/index.js.map +0 -1
- package/dist/middleware/admin-auth.d.ts +0 -4
- package/dist/middleware/admin-auth.d.ts.map +0 -1
- package/dist/middleware/admin-auth.js +0 -55
- package/dist/middleware/admin-auth.js.map +0 -1
- package/dist/middleware/auth.d.ts +0 -4
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/middleware/auth.js +0 -85
- package/dist/middleware/auth.js.map +0 -1
- package/dist/middleware/cors.d.ts +0 -25
- package/dist/middleware/cors.d.ts.map +0 -1
- package/dist/middleware/cors.js +0 -49
- package/dist/middleware/cors.js.map +0 -1
- package/dist/middleware/errorHandler.d.ts +0 -3
- package/dist/middleware/errorHandler.d.ts.map +0 -1
- package/dist/middleware/errorHandler.js +0 -58
- package/dist/middleware/errorHandler.js.map +0 -1
- package/dist/middleware/index.d.ts +0 -9
- package/dist/middleware/index.d.ts.map +0 -1
- package/dist/middleware/index.js +0 -25
- package/dist/middleware/index.js.map +0 -1
- package/dist/middleware/internalAuth.d.ts +0 -4
- package/dist/middleware/internalAuth.d.ts.map +0 -1
- package/dist/middleware/internalAuth.js +0 -23
- package/dist/middleware/internalAuth.js.map +0 -1
- package/dist/middleware/rateLimiter.d.ts +0 -4
- package/dist/middleware/rateLimiter.d.ts.map +0 -1
- package/dist/middleware/rateLimiter.js +0 -24
- package/dist/middleware/rateLimiter.js.map +0 -1
- package/dist/middleware/swagger.d.ts +0 -16
- package/dist/middleware/swagger.d.ts.map +0 -1
- package/dist/middleware/swagger.js +0 -49
- package/dist/middleware/swagger.js.map +0 -1
- package/dist/middleware/validation.d.ts +0 -4
- package/dist/middleware/validation.d.ts.map +0 -1
- package/dist/middleware/validation.js +0 -24
- package/dist/middleware/validation.js.map +0 -1
- package/dist/types/admin-auth.d.ts +0 -44
- package/dist/types/admin-auth.d.ts.map +0 -1
- package/dist/types/admin-auth.js +0 -3
- package/dist/types/admin-auth.js.map +0 -1
- package/dist/types/auth.d.ts +0 -53
- package/dist/types/auth.d.ts.map +0 -1
- package/dist/types/auth.js +0 -3
- package/dist/types/auth.js.map +0 -1
- package/dist/types/enums/auth.d.ts +0 -7
- package/dist/types/enums/auth.d.ts.map +0 -1
- package/dist/types/enums/auth.js +0 -11
- package/dist/types/enums/auth.js.map +0 -1
- package/dist/types/enums/index.d.ts +0 -2
- package/dist/types/enums/index.d.ts.map +0 -1
- package/dist/types/enums/index.js +0 -18
- package/dist/types/enums/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -4
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -20
- package/dist/types/index.js.map +0 -1
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -20
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/jwt.d.ts +0 -5
- package/dist/utils/jwt.d.ts.map +0 -1
- package/dist/utils/jwt.js +0 -65
- package/dist/utils/jwt.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -6
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -69
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/openapi.d.ts +0 -9
- package/dist/utils/openapi.d.ts.map +0 -1
- package/dist/utils/openapi.js +0 -90
- package/dist/utils/openapi.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -12
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -108
- package/dist/utils/validation.js.map +0 -1
- package/logs/combined.log +0 -85311
- package/logs/error.log +0 -48868
package/config/initExpress.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import express from "express";
|
|
2
|
-
import dotenv from "dotenv";
|
|
3
2
|
import helmet from "helmet";
|
|
4
3
|
import morgan from "morgan";
|
|
5
4
|
import { corsMiddleware, generalRateLimiter } from "../middleware";
|
|
6
5
|
import { stream } from "../utils";
|
|
7
6
|
|
|
8
|
-
dotenv.config();
|
|
9
|
-
|
|
10
7
|
export function initExpress(isDevelopment: boolean) {
|
|
11
8
|
const app = express();
|
|
12
9
|
|
|
@@ -17,8 +14,8 @@ export function initExpress(isDevelopment: boolean) {
|
|
|
17
14
|
app.use(express.json({ limit: "10mb" }));
|
|
18
15
|
app.use(express.urlencoded({ extended: true, limit: "10mb" }));
|
|
19
16
|
|
|
20
|
-
app.use(morgan("dev", { stream } as any));
|
|
21
17
|
if (isDevelopment) {
|
|
18
|
+
app.use(morgan("dev", { stream } as any));
|
|
22
19
|
} else {
|
|
23
20
|
app.use(morgan("combined", { stream } as any));
|
|
24
21
|
}
|
package/middleware/swagger.ts
CHANGED
|
@@ -30,7 +30,7 @@ const resolveSpec = async (options: SwaggerSetupOptions): Promise<OpenApiSpec> =
|
|
|
30
30
|
return {};
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
export const setupSwagger = (
|
|
33
|
+
export const setupSwagger = (port: number, app: Express, options: SwaggerSetupOptions = {}) => {
|
|
34
34
|
const basePath = options.basePath ?? '/api-docs';
|
|
35
35
|
|
|
36
36
|
app.get(`${basePath}/swagger.json`, async (_req, res) => {
|
|
@@ -64,6 +64,6 @@ export const setupSwagger = (PORT: number, app: Express, options: SwaggerSetupOp
|
|
|
64
64
|
);
|
|
65
65
|
|
|
66
66
|
logger.info(
|
|
67
|
-
`📚 Swagger documentation available at: http://localhost:${
|
|
67
|
+
`📚 Swagger documentation available at: http://localhost:${port}${basePath}`
|
|
68
68
|
);
|
|
69
69
|
};
|
package/middleware/validation.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import { Request, Response, NextFunction } from
|
|
2
|
-
import Joi from
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
import Joi from "joi";
|
|
3
|
+
import { ZodSchema } from "zod";
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
type ValidationMiddleware = {
|
|
6
|
+
(req: Request, res: Response, next: NextFunction): void;
|
|
7
|
+
__schema?: Joi.ObjectSchema | ZodSchema;
|
|
8
|
+
__schemaType?: "joi" | "zod";
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const validateRequest = (schema: Joi.ObjectSchema): ValidationMiddleware => {
|
|
12
|
+
const middleware = ((req: Request, res: Response, next: NextFunction): void => {
|
|
6
13
|
const { error, value } = schema.validate(req.body, {
|
|
7
14
|
abortEarly: false,
|
|
8
15
|
stripUnknown: true
|
|
@@ -20,5 +27,37 @@ export const validateRequest = (schema: Joi.ObjectSchema) => {
|
|
|
20
27
|
|
|
21
28
|
req.body = value;
|
|
22
29
|
next();
|
|
23
|
-
};
|
|
30
|
+
}) as ValidationMiddleware;
|
|
31
|
+
|
|
32
|
+
middleware.__schema = schema;
|
|
33
|
+
middleware.__schemaType = "joi";
|
|
34
|
+
|
|
35
|
+
return middleware;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const validateRequestZod = (schema: ZodSchema): ValidationMiddleware => {
|
|
39
|
+
const middleware = ((req: Request, res: Response, next: NextFunction): void => {
|
|
40
|
+
const result = schema.safeParse(req.body);
|
|
41
|
+
|
|
42
|
+
if (!result.success) {
|
|
43
|
+
const errorMessages = result.error.issues.map((err) =>
|
|
44
|
+
`${err.path.join('.')}: ${err.message}`
|
|
45
|
+
);
|
|
46
|
+
res.status(400).json({
|
|
47
|
+
success: false,
|
|
48
|
+
message: 'Validation error',
|
|
49
|
+
errors: errorMessages
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
req.body = result.data;
|
|
55
|
+
next();
|
|
56
|
+
}) as ValidationMiddleware;
|
|
57
|
+
|
|
58
|
+
// Attach schema metadata for OpenAPI generation
|
|
59
|
+
middleware.__schema = schema;
|
|
60
|
+
middleware.__schemaType = 'zod';
|
|
61
|
+
|
|
62
|
+
return middleware;
|
|
24
63
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shadimakhoul/ggcoach",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Shared utilities and types for GGCoach microservices",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -13,21 +13,22 @@
|
|
|
13
13
|
"lint:fix": "eslint src/**/*.ts --fix"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"express-list-endpoints": "^6.0.0",
|
|
17
|
-
"redis": "^4.6.10",
|
|
18
|
-
"helmet": "^7.1.0",
|
|
19
|
-
"express-rate-limit": "^7.1.5",
|
|
20
|
-
"winston": "^3.11.0",
|
|
21
|
-
"dotenv": "^16.3.1",
|
|
22
16
|
"cors": "^2.8.5",
|
|
17
|
+
"dotenv": "^16.3.1",
|
|
23
18
|
"express": "^4.18.2",
|
|
19
|
+
"express-list-endpoints": "^6.0.0",
|
|
20
|
+
"express-rate-limit": "^7.1.5",
|
|
21
|
+
"helmet": "^7.1.0",
|
|
24
22
|
"joi": "^17.11.0",
|
|
25
23
|
"jsonwebtoken": "^9.0.2",
|
|
26
24
|
"morgan": "^1.10.0",
|
|
27
25
|
"mysql2": "^3.15.3",
|
|
26
|
+
"redis": "^4.6.10",
|
|
28
27
|
"swagger-jsdoc": "^6.2.8",
|
|
29
28
|
"swagger-ui-express": "^5.0.0",
|
|
30
|
-
"tsconfig-paths": "^4.2.0"
|
|
29
|
+
"tsconfig-paths": "^4.2.0",
|
|
30
|
+
"winston": "^3.11.0",
|
|
31
|
+
"zod": "^4.3.6"
|
|
31
32
|
},
|
|
32
33
|
"keywords": [
|
|
33
34
|
"shared",
|
|
@@ -38,6 +39,13 @@
|
|
|
38
39
|
"author": "Shadi Makhoul",
|
|
39
40
|
"license": "ISC",
|
|
40
41
|
"devDependencies": {
|
|
41
|
-
"@types/
|
|
42
|
+
"@types/cors": "^2.8.17",
|
|
43
|
+
"@types/express": "^4.17.21",
|
|
44
|
+
"@types/express-list-endpoints": "^6.0.0",
|
|
45
|
+
"@types/jsonwebtoken": "^9.0.2",
|
|
46
|
+
"@types/morgan": "^1.9.9",
|
|
47
|
+
"@types/node": "^20.10.6",
|
|
48
|
+
"@types/swagger-jsdoc": "^6.0.4",
|
|
49
|
+
"@types/swagger-ui-express": "^4.1.6"
|
|
42
50
|
}
|
|
43
51
|
}
|
package/tsconfig.json
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"extends": "../tsconfig.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
|
+
"target": "ES2020",
|
|
5
|
+
"moduleResolution": "node",
|
|
4
6
|
"outDir": "./dist",
|
|
5
7
|
"rootDir": "./",
|
|
6
|
-
"composite": false
|
|
8
|
+
"composite": false,
|
|
9
|
+
"esModuleInterop": true
|
|
7
10
|
},
|
|
8
11
|
"include": ["**/*.ts"],
|
|
9
12
|
"exclude": ["node_modules", "dist"]
|
package/utils/openapi.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Express } from 'express';
|
|
2
2
|
import listEndpoints from 'express-list-endpoints';
|
|
3
|
+
import { ZodSchema } from 'zod';
|
|
3
4
|
|
|
4
5
|
type OpenApiSpec = Record<string, unknown>;
|
|
5
6
|
type OpenApiPaths = Record<string, Record<string, unknown>>;
|
|
@@ -16,6 +17,8 @@ type Endpoint = {
|
|
|
16
17
|
middlewares: string[];
|
|
17
18
|
};
|
|
18
19
|
|
|
20
|
+
type SchemaMap = Record<string, { schema: ZodSchema; type: 'zod' }>;
|
|
21
|
+
|
|
19
22
|
const AUTH_MIDDLEWARES = new Set([
|
|
20
23
|
'authenticateToken',
|
|
21
24
|
'requireAdmin',
|
|
@@ -49,7 +52,8 @@ const normalizePath = (path: string): string => {
|
|
|
49
52
|
|
|
50
53
|
const buildPathsFromEndpoints = (
|
|
51
54
|
endpoints: Endpoint[],
|
|
52
|
-
tagResolver?: TagResolver
|
|
55
|
+
tagResolver?: TagResolver,
|
|
56
|
+
schemas?: SchemaMap
|
|
53
57
|
): OpenApiPaths => {
|
|
54
58
|
const paths: OpenApiPaths = {};
|
|
55
59
|
const allowedMethods = new Set(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']);
|
|
@@ -77,7 +81,7 @@ const buildPathsFromEndpoints = (
|
|
|
77
81
|
|
|
78
82
|
const requiresAuth = endpoint.middlewares.some((m) => AUTH_MIDDLEWARES.has(m));
|
|
79
83
|
|
|
80
|
-
|
|
84
|
+
const pathSpec: Record<string, unknown> = {
|
|
81
85
|
summary: `${method} ${path}`,
|
|
82
86
|
...(tags && tags.length > 0 ? { tags } : {}),
|
|
83
87
|
...(requiresAuth ? { security: [{ bearerAuth: [] }] } : {}),
|
|
@@ -87,6 +91,33 @@ const buildPathsFromEndpoints = (
|
|
|
87
91
|
},
|
|
88
92
|
},
|
|
89
93
|
};
|
|
94
|
+
|
|
95
|
+
// Add requestBody if schema exists
|
|
96
|
+
if (schemas) {
|
|
97
|
+
const schemaKey = `${methodKey}_${path}`;
|
|
98
|
+
const schemaData = schemas[schemaKey];
|
|
99
|
+
if (schemaData) {
|
|
100
|
+
let schemaObj: Record<string, unknown>;
|
|
101
|
+
|
|
102
|
+
if (schemaData.type === 'zod') {
|
|
103
|
+
schemaObj = zodToOpenApi(schemaData.schema as ZodSchema);
|
|
104
|
+
} else {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
pathSpec.requestBody = {
|
|
109
|
+
required: true,
|
|
110
|
+
content: {
|
|
111
|
+
'application/json': {
|
|
112
|
+
schema: schemaObj,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
paths[path][methodKey] = pathSpec;
|
|
120
|
+
|
|
90
121
|
});
|
|
91
122
|
});
|
|
92
123
|
|
|
@@ -114,8 +145,8 @@ export const buildOpenApiSpecFromExpress = (
|
|
|
114
145
|
): OpenApiSpec => {
|
|
115
146
|
const endpoints = listEndpoints(app) as Endpoint[];
|
|
116
147
|
const basePaths = getRecord(baseSpec.paths) as OpenApiPaths;
|
|
117
|
-
const
|
|
118
|
-
|
|
148
|
+
const schemas = extractSchemasFromApp(app);
|
|
149
|
+
const generatedPaths = buildPathsFromEndpoints(endpoints, options.tagResolver, schemas);
|
|
119
150
|
return {
|
|
120
151
|
...baseSpec,
|
|
121
152
|
paths: {
|
|
@@ -123,3 +154,107 @@ export const buildOpenApiSpecFromExpress = (
|
|
|
123
154
|
},
|
|
124
155
|
};
|
|
125
156
|
};
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
const zodToOpenApi = (schema: ZodSchema): Record<string, unknown> => {
|
|
160
|
+
const zodDesc = (schema as any)._def;
|
|
161
|
+
|
|
162
|
+
if (zodDesc.typeName === 'ZodObject') {
|
|
163
|
+
const shape = zodDesc.shape();
|
|
164
|
+
const result: Record<string, unknown> = {
|
|
165
|
+
type: 'object',
|
|
166
|
+
properties: {},
|
|
167
|
+
required: [],
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
Object.entries(shape).forEach(([key, val]: any) => {
|
|
171
|
+
const prop: Record<string, unknown> = {};
|
|
172
|
+
const valDef = val._def;
|
|
173
|
+
|
|
174
|
+
// Handle different Zod types
|
|
175
|
+
if (valDef.typeName === 'ZodString') {
|
|
176
|
+
prop.type = 'string';
|
|
177
|
+
if (valDef.checks) {
|
|
178
|
+
valDef.checks.forEach((check: any) => {
|
|
179
|
+
if (check.kind === 'email') prop.format = 'email';
|
|
180
|
+
if (check.kind === 'min') prop.minLength = check.value;
|
|
181
|
+
if (check.kind === 'max') prop.maxLength = check.value;
|
|
182
|
+
if (check.kind === 'url') prop.format = 'uri';
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
} else if (valDef.typeName === 'ZodNumber') {
|
|
186
|
+
prop.type = 'number';
|
|
187
|
+
} else if (valDef.typeName === 'ZodBoolean') {
|
|
188
|
+
prop.type = 'boolean';
|
|
189
|
+
} else {
|
|
190
|
+
prop.type = 'string';
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Check if required (not optional/nullable)
|
|
194
|
+
if (valDef.typeName !== 'ZodOptional' && valDef.typeName !== 'ZodNullable') {
|
|
195
|
+
(result.required as string[]).push(key);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
(result.properties as Record<string, unknown>)[key] = prop;
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return { type: 'object' };
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
const extractSchemasFromApp = (app: Express): SchemaMap => {
|
|
208
|
+
const schemas: SchemaMap = {};
|
|
209
|
+
|
|
210
|
+
const inspectLayer = (layer: any, path: string = ''): void => {
|
|
211
|
+
if (!layer) return;
|
|
212
|
+
|
|
213
|
+
const currentPath = path + (layer.regexp ? '' : layer.route?.path || '');
|
|
214
|
+
|
|
215
|
+
// Check if this is a middleware with an attached schema
|
|
216
|
+
if (layer.handle && typeof layer.handle === 'function') {
|
|
217
|
+
const handle = layer.handle as any;
|
|
218
|
+
if (handle.__schema && handle.__schemaType) {
|
|
219
|
+
const schemaKey = `${layer.method || 'use'}_${normalizePath(currentPath)}`;
|
|
220
|
+
schemas[schemaKey] = {
|
|
221
|
+
schema: handle.__schema,
|
|
222
|
+
type: handle.__schemaType,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Handle router chains
|
|
228
|
+
if (layer.handle?.stack) {
|
|
229
|
+
layer.handle.stack.forEach((sublayer: any) => {
|
|
230
|
+
inspectLayer(sublayer, currentPath);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Handle route handlers
|
|
235
|
+
if (layer.route && layer.route.stack) {
|
|
236
|
+
layer.route.stack.forEach((handler: any) => {
|
|
237
|
+
if (handler.handle && typeof handler.handle === 'function') {
|
|
238
|
+
const handle = handler.handle as any;
|
|
239
|
+
if (handle.__schema && handle.__schemaType) {
|
|
240
|
+
const method = handler.method || 'use';
|
|
241
|
+
const schemaKey = `${method}_${normalizePath(layer.route.path)}`;
|
|
242
|
+
schemas[schemaKey] = {
|
|
243
|
+
schema: handle.__schema,
|
|
244
|
+
type: handle.__schemaType,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
// Traverse the app's router stack
|
|
253
|
+
if (app._router && app._router.stack) {
|
|
254
|
+
app._router.stack.forEach((layer: any) => {
|
|
255
|
+
inspectLayer(layer);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return schemas;
|
|
260
|
+
};
|
package/dist/config/config.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;CAMlB,CAAC"}
|
package/dist/config/config.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.config = void 0;
|
|
4
|
-
exports.config = {
|
|
5
|
-
dev: process.env.NODE_ENV === 'dev',
|
|
6
|
-
jwtSecret: process.env.JWT_SECRET || 'default_jwt_secret',
|
|
7
|
-
redis: {
|
|
8
|
-
REDIS_URL: process.env.REDIS_URL || 'redis://redis:6379'
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../config/config.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG;IAClB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,KAAK;IACnC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,oBAAoB;IACzD,KAAK,EAAE;QACH,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,oBAAoB;KAC3D;CACJ,CAAC"}
|
package/dist/config/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../config/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
|
package/dist/config/index.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./initExpress"), exports);
|
|
18
|
-
__exportStar(require("./redis"), exports);
|
|
19
|
-
__exportStar(require("./swagger-ui"), exports);
|
|
20
|
-
//# sourceMappingURL=index.js.map
|
package/dist/config/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,0CAAwB;AACxB,+CAA6B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"initExpress.d.ts","sourceRoot":"","sources":["../../config/initExpress.ts"],"names":[],"mappings":"AASA,wBAAgB,WAAW,CAAC,aAAa,EAAE,OAAO,+CAiBjD"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.initExpress = initExpress;
|
|
7
|
-
const express_1 = __importDefault(require("express"));
|
|
8
|
-
const dotenv_1 = __importDefault(require("dotenv"));
|
|
9
|
-
const helmet_1 = __importDefault(require("helmet"));
|
|
10
|
-
const morgan_1 = __importDefault(require("morgan"));
|
|
11
|
-
const middleware_1 = require("../middleware");
|
|
12
|
-
const utils_1 = require("../utils");
|
|
13
|
-
dotenv_1.default.config();
|
|
14
|
-
function initExpress(isDevelopment) {
|
|
15
|
-
const app = (0, express_1.default)();
|
|
16
|
-
app.use((0, helmet_1.default)());
|
|
17
|
-
app.use(middleware_1.corsMiddleware);
|
|
18
|
-
app.use(middleware_1.generalRateLimiter);
|
|
19
|
-
app.use(express_1.default.json({ limit: "10mb" }));
|
|
20
|
-
app.use(express_1.default.urlencoded({ extended: true, limit: "10mb" }));
|
|
21
|
-
if (isDevelopment) {
|
|
22
|
-
app.use((0, morgan_1.default)("dev", { stream: utils_1.stream }));
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
app.use((0, morgan_1.default)("combined", { stream: utils_1.stream }));
|
|
26
|
-
}
|
|
27
|
-
return app;
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=initExpress.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"initExpress.js","sourceRoot":"","sources":["../../config/initExpress.ts"],"names":[],"mappings":";;;;;AASA,kCAiBC;AA1BD,sDAA8B;AAC9B,oDAA4B;AAC5B,oDAA4B;AAC5B,oDAA4B;AAC5B,8CAAmE;AACnE,oCAAoC;AAEpC,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,SAAgB,WAAW,CAAC,aAAsB;IAChD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IAEtB,GAAG,CAAC,GAAG,CAAC,IAAA,gBAAM,GAAE,CAAC,CAAC;IAClB,GAAG,CAAC,GAAG,CAAC,2BAAc,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,+BAAkB,CAAC,CAAC;IAE5B,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAE/D,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,IAAA,gBAAM,EAAC,KAAK,EAAE,EAAE,MAAM,EAAN,cAAM,EAAS,CAAC,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,IAAA,gBAAM,EAAC,UAAU,EAAE,EAAE,MAAM,EAAN,cAAM,EAAS,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/config/redis.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { createClient } from 'redis';
|
|
2
|
-
export type RedisClient = ReturnType<typeof createClient>;
|
|
3
|
-
export declare const initializeRedis: (REDIS_URL: string) => Promise<RedisClient>;
|
|
4
|
-
export declare const getRedisClient: () => RedisClient;
|
|
5
|
-
export declare const closeRedis: () => Promise<void>;
|
|
6
|
-
//# sourceMappingURL=redis.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../config/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAIrC,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAI1D,eAAO,MAAM,eAAe,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,WAAW,CAY5E,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,WAKjC,CAAC;AAEF,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,IAAI,CAK/C,CAAC"}
|
package/dist/config/redis.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.closeRedis = exports.getRedisClient = exports.initializeRedis = void 0;
|
|
4
|
-
const redis_1 = require("redis");
|
|
5
|
-
const utils_1 = require("../utils");
|
|
6
|
-
let redisClient = null;
|
|
7
|
-
const initializeRedis = async (REDIS_URL) => {
|
|
8
|
-
if (redisClient && redisClient.isOpen) {
|
|
9
|
-
return redisClient;
|
|
10
|
-
}
|
|
11
|
-
redisClient = (0, redis_1.createClient)({ url: REDIS_URL });
|
|
12
|
-
redisClient.on('error', (err) => utils_1.logger.error('Redis Client Error', err));
|
|
13
|
-
redisClient.on('connect', () => utils_1.logger.info('✅ Redis connected'));
|
|
14
|
-
await redisClient.connect();
|
|
15
|
-
return redisClient;
|
|
16
|
-
};
|
|
17
|
-
exports.initializeRedis = initializeRedis;
|
|
18
|
-
const getRedisClient = () => {
|
|
19
|
-
if (!redisClient || !redisClient.isOpen) {
|
|
20
|
-
throw new Error('Redis client not initialized');
|
|
21
|
-
}
|
|
22
|
-
return redisClient;
|
|
23
|
-
};
|
|
24
|
-
exports.getRedisClient = getRedisClient;
|
|
25
|
-
const closeRedis = async () => {
|
|
26
|
-
if (redisClient && redisClient.isOpen) {
|
|
27
|
-
await redisClient.quit();
|
|
28
|
-
redisClient = null;
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
exports.closeRedis = closeRedis;
|
|
32
|
-
//# sourceMappingURL=redis.js.map
|
package/dist/config/redis.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../config/redis.ts"],"names":[],"mappings":";;;AAAA,iCAAqC;AAErC,oCAAkC;AAIlC,IAAI,WAAW,GAAuB,IAAI,CAAC;AAEpC,MAAM,eAAe,GAAG,KAAK,EAAE,SAAiB,EAAwB,EAAE;IAC/E,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,WAAW,GAAG,IAAA,oBAAY,EAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAE/C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1E,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,cAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAElE,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAZW,QAAA,eAAe,mBAY1B;AAEK,MAAM,cAAc,GAAG,GAAgB,EAAE;IAC9C,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AALW,QAAA,cAAc,kBAKzB;AAEK,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;IAClD,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AALW,QAAA,UAAU,cAKrB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"swagger-ui.d.ts","sourceRoot":"","sources":["../../config/swagger-ui.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;;;CAmF5B,CAAC"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.swaggerUiOptions = void 0;
|
|
4
|
-
exports.swaggerUiOptions = {
|
|
5
|
-
customCss: `
|
|
6
|
-
/* Main background and text */
|
|
7
|
-
body {
|
|
8
|
-
background-color: #1a1a1a;
|
|
9
|
-
color: #f0f0f0 !important;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
.swagger-ui {
|
|
13
|
-
background-color: #1a1a1a;
|
|
14
|
-
color: #f0f0f0 !important;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/* Force ALL text to be white */
|
|
18
|
-
.swagger-ui *,
|
|
19
|
-
.swagger-ui .opblock-tag,
|
|
20
|
-
.swagger-ui .opblock .opblock-summary-operation-id,
|
|
21
|
-
.swagger-ui .opblock .opblock-summary-path,
|
|
22
|
-
.swagger-ui .opblock .opblock-summary-path span,
|
|
23
|
-
.swagger-ui .opblock .opblock-summary-description,
|
|
24
|
-
.swagger-ui .model-title,
|
|
25
|
-
.swagger-ui label,
|
|
26
|
-
.swagger-ui span,
|
|
27
|
-
.swagger-ui h1, .swagger-ui h2, .swagger-ui h3, .swagger-ui h4, .swagger-ui h5, .swagger-ui h6,
|
|
28
|
-
.swagger-ui .parameter__name,
|
|
29
|
-
.swagger-ui .parameter__type,
|
|
30
|
-
.swagger-ui table thead tr th,
|
|
31
|
-
.swagger-ui table tbody tr td,
|
|
32
|
-
.swagger-ui .response-col_status,
|
|
33
|
-
.swagger-ui .response-col_description,
|
|
34
|
-
.swagger-ui .tab li,
|
|
35
|
-
.swagger-ui section.models h4,
|
|
36
|
-
.swagger-ui section.models h5,
|
|
37
|
-
.swagger-ui .servers > label {
|
|
38
|
-
color: #f0f0f0 !important;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/* Override any SVGs or special elements */
|
|
42
|
-
.swagger-ui svg {
|
|
43
|
-
fill: #f0f0f0 !important;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.swagger-ui .scheme-container {
|
|
47
|
-
background-color: #1a1a1a;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
.swagger-ui .opblock .opblock-section-header {
|
|
51
|
-
background-color: #1a1a1a;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
.swagger-ui .dialog-ux .modal-ux {
|
|
55
|
-
background-color: #1a1a1a;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/* Operation blocks */
|
|
59
|
-
.swagger-ui .opblock {
|
|
60
|
-
background-color: #2d2d2d;
|
|
61
|
-
border-color: #444;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/* Input fields */
|
|
65
|
-
.swagger-ui input[type=text],
|
|
66
|
-
.swagger-ui textarea {
|
|
67
|
-
background-color: rgb(12, 12, 12);
|
|
68
|
-
color: white !important;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
.swagger-ui input,
|
|
72
|
-
.swagger-ui select,
|
|
73
|
-
.swagger-ui textarea {
|
|
74
|
-
background-color: #333;
|
|
75
|
-
color: white !important;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/* Code blocks */
|
|
79
|
-
.swagger-ui .highlight-code,
|
|
80
|
-
.swagger-ui .microlight {
|
|
81
|
-
background-color: rgb(69, 69, 68) !important;
|
|
82
|
-
color: #f8f8f2 !important;
|
|
83
|
-
}
|
|
84
|
-
`,
|
|
85
|
-
customSiteTitle: "GGCoach API Documentation",
|
|
86
|
-
customfavIcon: "/favicon.ico",
|
|
87
|
-
};
|
|
88
|
-
//# sourceMappingURL=swagger-ui.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"swagger-ui.js","sourceRoot":"","sources":["../../config/swagger-ui.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG;IAC9B,SAAS,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+ER;IACH,eAAe,EAAE,2BAA2B;IAC5C,aAAa,EAAE,cAAc;CAC9B,CAAC"}
|
package/dist/config/swagger.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Request, Response } from "express";
|
|
2
|
-
export declare const swaggerSpec: object;
|
|
3
|
-
export declare const swaggerUiOptions: {
|
|
4
|
-
customCss: string;
|
|
5
|
-
customSiteTitle: string;
|
|
6
|
-
customfavIcon: string;
|
|
7
|
-
};
|
|
8
|
-
export declare const swaggerHandler: (_req: Request, res: Response) => void;
|
|
9
|
-
//# sourceMappingURL=swagger.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../config/swagger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAquI5C,eAAO,MAAM,WAAW,QAAwB,CAAC;AAEjD,eAAO,MAAM,gBAAgB;;;;CAmF5B,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,OAAO,EAAE,KAAK,QAAQ,SAG1D,CAAC"}
|