@ajayjbtickets/common 1.0.9 → 1.0.10
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.mts +179 -0
- package/dist/index.d.ts +179 -10
- package/dist/index.js +524 -25
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +460 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +12 -5
- package/dist/config/config.d.ts +0 -10
- package/dist/config/config.js +0 -24
- package/dist/config/config.js.map +0 -1
- package/dist/constants/environments.d.ts +0 -5
- package/dist/constants/environments.js +0 -9
- package/dist/constants/environments.js.map +0 -1
- package/dist/core/ApiError.d.ts +0 -54
- package/dist/core/ApiError.js +0 -133
- package/dist/core/ApiError.js.map +0 -1
- package/dist/core/ApiResponse.d.ts +0 -83
- package/dist/core/ApiResponse.js +0 -140
- package/dist/core/ApiResponse.js.map +0 -1
- package/dist/core/Logger.d.ts +0 -2
- package/dist/core/Logger.js +0 -74
- package/dist/core/Logger.js.map +0 -1
- package/dist/middlewares/schemaValidator.d.ts +0 -4
- package/dist/middlewares/schemaValidator.js +0 -21
- package/dist/middlewares/schemaValidator.js.map +0 -1
- package/dist/middlewares/verifyToken.d.ts +0 -2
- package/dist/middlewares/verifyToken.js +0 -33
- package/dist/middlewares/verifyToken.js.map +0 -1
- package/dist/services/jwt.service.d.ts +0 -10
- package/dist/services/jwt.service.js +0 -26
- package/dist/services/jwt.service.js.map +0 -1
- package/dist/services/password.service.d.ts +0 -4
- package/dist/services/password.service.js +0 -32
- package/dist/services/password.service.js.map +0 -1
- package/dist/types/validation.d.ts +0 -6
- package/dist/types/validation.js +0 -11
- package/dist/types/validation.js.map +0 -1
- package/dist/utils/asyncHandler.d.ts +0 -4
- package/dist/utils/asyncHandler.js +0 -13
- package/dist/utils/asyncHandler.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,27 +1,526 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
for (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.ts
|
|
31
|
+
var index_exports = {};
|
|
32
|
+
__export(index_exports, {
|
|
33
|
+
AccessTokenError: () => AccessTokenError,
|
|
34
|
+
AccessTokenErrorResponse: () => AccessTokenErrorResponse,
|
|
35
|
+
ApiError: () => ApiError,
|
|
36
|
+
ApiResponse: () => ApiResponse,
|
|
37
|
+
AuthFailureError: () => AuthFailureError,
|
|
38
|
+
BadRequestError: () => BadRequestError,
|
|
39
|
+
BadRequestResponse: () => BadRequestResponse,
|
|
40
|
+
BadTokenError: () => BadTokenError,
|
|
41
|
+
BadTokenResponse: () => BadTokenResponse,
|
|
42
|
+
ENVIRONMENTS: () => ENVIRONMENTS,
|
|
43
|
+
ErrorType: () => ErrorType,
|
|
44
|
+
ForbiddenError: () => ForbiddenError,
|
|
45
|
+
ForbiddenResponse: () => ForbiddenResponse,
|
|
46
|
+
InternalError: () => InternalError,
|
|
47
|
+
InternalErrorResponse: () => InternalErrorResponse,
|
|
48
|
+
JwtService: () => JwtService,
|
|
49
|
+
NoDataError: () => NoDataError,
|
|
50
|
+
NoEntryError: () => NoEntryError,
|
|
51
|
+
NoFoundResponse: () => NoFoundResponse,
|
|
52
|
+
NotFoundError: () => NotFoundError,
|
|
53
|
+
Password: () => Password,
|
|
54
|
+
ResponseStatusCode: () => ResponseStatusCode,
|
|
55
|
+
StatusCode: () => StatusCode,
|
|
56
|
+
SuccessResponse: () => SuccessResponse,
|
|
57
|
+
TokenExpiredError: () => TokenExpiredError,
|
|
58
|
+
ValidationSource: () => ValidationSource,
|
|
59
|
+
asyncHandler: () => asyncHandler,
|
|
60
|
+
logger: () => logger,
|
|
61
|
+
schemaValidator: () => schemaValidator,
|
|
62
|
+
verifyToken: () => verifyToken
|
|
63
|
+
});
|
|
64
|
+
module.exports = __toCommonJS(index_exports);
|
|
65
|
+
|
|
66
|
+
// src/constants/environments.ts
|
|
67
|
+
var ENVIRONMENTS = {
|
|
68
|
+
production: "production",
|
|
69
|
+
development: "development",
|
|
70
|
+
testing: "testing"
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// src/core/ApiResponse.ts
|
|
74
|
+
var StatusCode = /* @__PURE__ */ ((StatusCode2) => {
|
|
75
|
+
StatusCode2["SUCCESS"] = "10000";
|
|
76
|
+
StatusCode2["FAILURE"] = "10001";
|
|
77
|
+
StatusCode2["RETRY"] = "10002";
|
|
78
|
+
StatusCode2["IN_VALID_ACCESS_TOKEN"] = "10003";
|
|
79
|
+
return StatusCode2;
|
|
80
|
+
})(StatusCode || {});
|
|
81
|
+
var ResponseStatusCode = /* @__PURE__ */ ((ResponseStatusCode2) => {
|
|
82
|
+
ResponseStatusCode2[ResponseStatusCode2["SUCCESS"] = 200] = "SUCCESS";
|
|
83
|
+
ResponseStatusCode2[ResponseStatusCode2["CREATED"] = 201] = "CREATED";
|
|
84
|
+
ResponseStatusCode2[ResponseStatusCode2["ACCEPTED"] = 202] = "ACCEPTED";
|
|
85
|
+
ResponseStatusCode2[ResponseStatusCode2["NO_CONTENT"] = 204] = "NO_CONTENT";
|
|
86
|
+
ResponseStatusCode2[ResponseStatusCode2["MOVED_PERMANENTLY"] = 301] = "MOVED_PERMANENTLY";
|
|
87
|
+
ResponseStatusCode2[ResponseStatusCode2["FOUND"] = 302] = "FOUND";
|
|
88
|
+
ResponseStatusCode2[ResponseStatusCode2["NOT_MODIFIED"] = 304] = "NOT_MODIFIED";
|
|
89
|
+
ResponseStatusCode2[ResponseStatusCode2["TEMPORARY_REDIRECT"] = 307] = "TEMPORARY_REDIRECT";
|
|
90
|
+
ResponseStatusCode2[ResponseStatusCode2["PERMANENT_REDIRECT"] = 308] = "PERMANENT_REDIRECT";
|
|
91
|
+
ResponseStatusCode2[ResponseStatusCode2["BAD_REQUEST"] = 400] = "BAD_REQUEST";
|
|
92
|
+
ResponseStatusCode2[ResponseStatusCode2["UNAUTHORIZED"] = 401] = "UNAUTHORIZED";
|
|
93
|
+
ResponseStatusCode2[ResponseStatusCode2["PAYMENT_REQUIRED"] = 402] = "PAYMENT_REQUIRED";
|
|
94
|
+
ResponseStatusCode2[ResponseStatusCode2["FORBIDDEN"] = 403] = "FORBIDDEN";
|
|
95
|
+
ResponseStatusCode2[ResponseStatusCode2["NOT_FOUND"] = 404] = "NOT_FOUND";
|
|
96
|
+
ResponseStatusCode2[ResponseStatusCode2["METHOD_NOT_ALLOWED"] = 405] = "METHOD_NOT_ALLOWED";
|
|
97
|
+
ResponseStatusCode2[ResponseStatusCode2["NOT_ACCEPTABLE"] = 406] = "NOT_ACCEPTABLE";
|
|
98
|
+
ResponseStatusCode2[ResponseStatusCode2["CONFLICT"] = 409] = "CONFLICT";
|
|
99
|
+
ResponseStatusCode2[ResponseStatusCode2["GONE"] = 410] = "GONE";
|
|
100
|
+
ResponseStatusCode2[ResponseStatusCode2["PAYLOAD_TOO_LARGE"] = 413] = "PAYLOAD_TOO_LARGE";
|
|
101
|
+
ResponseStatusCode2[ResponseStatusCode2["UNSUPPORTED_MEDIA_TYPE"] = 415] = "UNSUPPORTED_MEDIA_TYPE";
|
|
102
|
+
ResponseStatusCode2[ResponseStatusCode2["UNPROCESSABLE_ENTITY"] = 422] = "UNPROCESSABLE_ENTITY";
|
|
103
|
+
ResponseStatusCode2[ResponseStatusCode2["TOO_MANY_REQUESTS"] = 429] = "TOO_MANY_REQUESTS";
|
|
104
|
+
ResponseStatusCode2[ResponseStatusCode2["INTERNAL_ERROR"] = 500] = "INTERNAL_ERROR";
|
|
105
|
+
ResponseStatusCode2[ResponseStatusCode2["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED";
|
|
106
|
+
ResponseStatusCode2[ResponseStatusCode2["BAD_GATEWAY"] = 502] = "BAD_GATEWAY";
|
|
107
|
+
ResponseStatusCode2[ResponseStatusCode2["SERVICE_UNAVAILABLE"] = 503] = "SERVICE_UNAVAILABLE";
|
|
108
|
+
ResponseStatusCode2[ResponseStatusCode2["GATEWAY_TIMEOUT"] = 504] = "GATEWAY_TIMEOUT";
|
|
109
|
+
return ResponseStatusCode2;
|
|
110
|
+
})(ResponseStatusCode || {});
|
|
111
|
+
var ApiResponse = class {
|
|
112
|
+
message;
|
|
113
|
+
statusCode;
|
|
114
|
+
status;
|
|
115
|
+
constructor(status, message, statusCode) {
|
|
116
|
+
this.message = message;
|
|
117
|
+
this.status = status;
|
|
118
|
+
if (statusCode) {
|
|
119
|
+
this.statusCode = statusCode;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
prepare(res, response, headers = {}) {
|
|
123
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
124
|
+
res.append(key, value);
|
|
125
|
+
}
|
|
126
|
+
res.status(this.status).send(this.sanitize(response));
|
|
127
|
+
}
|
|
128
|
+
send(res, headers = {}) {
|
|
129
|
+
this.prepare(res, this, headers);
|
|
130
|
+
}
|
|
131
|
+
sanitize(response) {
|
|
132
|
+
const clone = {};
|
|
133
|
+
Object.assign(clone, response);
|
|
134
|
+
delete clone["statusCode"];
|
|
135
|
+
for (const key in clone) {
|
|
136
|
+
const typedKey = key;
|
|
137
|
+
if (clone[typedKey] === void 0) {
|
|
138
|
+
delete clone[typedKey];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return clone;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
var SuccessResponse = class extends ApiResponse {
|
|
145
|
+
constructor(responseStatusCode, message, data) {
|
|
146
|
+
super(responseStatusCode, message, "10000" /* SUCCESS */);
|
|
147
|
+
this.data = data;
|
|
148
|
+
this.data = data;
|
|
149
|
+
}
|
|
150
|
+
send(res) {
|
|
151
|
+
this.prepare(res, this, {});
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
var AccessTokenErrorResponse = class extends ApiResponse {
|
|
155
|
+
instruction = "refresh_token";
|
|
156
|
+
errors;
|
|
157
|
+
constructor(message, errors) {
|
|
158
|
+
super(
|
|
159
|
+
401 /* UNAUTHORIZED */,
|
|
160
|
+
message,
|
|
161
|
+
"10003" /* IN_VALID_ACCESS_TOKEN */
|
|
162
|
+
);
|
|
163
|
+
this.errors = errors || [];
|
|
164
|
+
}
|
|
165
|
+
send(res, headers = {}) {
|
|
166
|
+
headers.instruction = this.instruction;
|
|
167
|
+
this.prepare(res, this, headers);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
var BadTokenResponse = class extends ApiResponse {
|
|
171
|
+
errors;
|
|
172
|
+
constructor(message, errors) {
|
|
173
|
+
super(401 /* UNAUTHORIZED */, message, "10001" /* FAILURE */);
|
|
174
|
+
this.errors = errors || [];
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
var BadRequestResponse = class extends ApiResponse {
|
|
178
|
+
errors;
|
|
179
|
+
constructor(message, errors) {
|
|
180
|
+
super(400 /* BAD_REQUEST */, message, "10001" /* FAILURE */);
|
|
181
|
+
this.errors = errors || [];
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
var InternalErrorResponse = class extends ApiResponse {
|
|
185
|
+
errors;
|
|
186
|
+
constructor(message, errors) {
|
|
187
|
+
super(500 /* INTERNAL_ERROR */, message, "10001" /* FAILURE */);
|
|
188
|
+
this.errors = errors || [];
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
var NoFoundResponse = class extends ApiResponse {
|
|
192
|
+
errors;
|
|
193
|
+
constructor(message, errors) {
|
|
194
|
+
super(404 /* NOT_FOUND */, message, "10001" /* FAILURE */);
|
|
195
|
+
this.errors = errors || [];
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
var ForbiddenResponse = class extends ApiResponse {
|
|
199
|
+
errors;
|
|
200
|
+
constructor(message, errors) {
|
|
201
|
+
super(403 /* FORBIDDEN */, message, "10001" /* FAILURE */);
|
|
202
|
+
this.errors = errors || [];
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// src/config/config.ts
|
|
207
|
+
var import_config = require("dotenv/config");
|
|
208
|
+
var getConfig = () => {
|
|
209
|
+
return {
|
|
210
|
+
ENVIRONMENT: process.env.ENVIRONMENT,
|
|
211
|
+
LOG_DIR: process.env.LOG_DIR,
|
|
212
|
+
LOG_LEVEL: process.env.LOG_LEVEL,
|
|
213
|
+
SALT_ROUNDS: parseInt(process.env.SALT_ROUNDS),
|
|
214
|
+
JWT_KEY: process.env.JWT_KEY
|
|
215
|
+
};
|
|
216
|
+
};
|
|
217
|
+
var getSanitizedConfig = (config2) => {
|
|
218
|
+
for (const [key, value] of Object.entries(config2)) {
|
|
219
|
+
if (!value) {
|
|
220
|
+
throw new Error(`Missing key ${key} in config.env`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return config2;
|
|
224
|
+
};
|
|
225
|
+
var config = getConfig();
|
|
226
|
+
var sanitizedConfig = getSanitizedConfig(config);
|
|
227
|
+
|
|
228
|
+
// src/core/ApiError.ts
|
|
229
|
+
var ErrorType = /* @__PURE__ */ ((ErrorType2) => {
|
|
230
|
+
ErrorType2["BAD_TOKEN"] = "BadTokenError";
|
|
231
|
+
ErrorType2["TOKEN_EXPIRED"] = "TokenExpiredError";
|
|
232
|
+
ErrorType2["UNAUTHORIZED"] = "AuthFailureError";
|
|
233
|
+
ErrorType2["ACCESS_TOKEN"] = "AccessTokenError";
|
|
234
|
+
ErrorType2["INTERNAL"] = "InternalError";
|
|
235
|
+
ErrorType2["NOT_FOUND"] = "NotFoundError";
|
|
236
|
+
ErrorType2["NO_ENTRY"] = "NoEntryError";
|
|
237
|
+
ErrorType2["NO_DATA"] = "NoDataError";
|
|
238
|
+
ErrorType2["BAD_REQUEST"] = "BadRequestError";
|
|
239
|
+
ErrorType2["FORBIDDEN"] = "ForbiddenError";
|
|
240
|
+
return ErrorType2;
|
|
241
|
+
})(ErrorType || {});
|
|
242
|
+
var ApiError = class extends Error {
|
|
243
|
+
constructor(type, message = "Error", errors) {
|
|
244
|
+
super(type);
|
|
245
|
+
this.type = type;
|
|
246
|
+
this.message = message;
|
|
247
|
+
this.errors = errors;
|
|
248
|
+
this.type = type;
|
|
249
|
+
this.message = message;
|
|
250
|
+
this.errors = errors;
|
|
251
|
+
}
|
|
252
|
+
static handle(err, res) {
|
|
253
|
+
switch (err.type) {
|
|
254
|
+
case "BadTokenError" /* BAD_TOKEN */:
|
|
255
|
+
case "TokenExpiredError" /* TOKEN_EXPIRED */:
|
|
256
|
+
case "AuthFailureError" /* UNAUTHORIZED */:
|
|
257
|
+
new BadTokenResponse(err.message, err.errors).send(res);
|
|
258
|
+
break;
|
|
259
|
+
case "AccessTokenError" /* ACCESS_TOKEN */:
|
|
260
|
+
new AccessTokenErrorResponse(err.message, err.errors).send(res);
|
|
261
|
+
break;
|
|
262
|
+
case "InternalError" /* INTERNAL */:
|
|
263
|
+
new InternalErrorResponse(err.message, err.errors).send(res);
|
|
264
|
+
break;
|
|
265
|
+
case "NotFoundError" /* NOT_FOUND */:
|
|
266
|
+
case "NoEntryError" /* NO_ENTRY */:
|
|
267
|
+
case "NoDataError" /* NO_DATA */:
|
|
268
|
+
new NoFoundResponse(err.message, err.errors).send(res);
|
|
269
|
+
break;
|
|
270
|
+
case "BadRequestError" /* BAD_REQUEST */:
|
|
271
|
+
new BadRequestResponse(err.message, err.errors).send(res);
|
|
272
|
+
break;
|
|
273
|
+
case "ForbiddenError" /* FORBIDDEN */:
|
|
274
|
+
new ForbiddenResponse(err.message, err.errors).send(res);
|
|
275
|
+
break;
|
|
276
|
+
default:
|
|
277
|
+
let messsage = err.message;
|
|
278
|
+
messsage = sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production ? messsage : "Something went wrong!";
|
|
279
|
+
new InternalErrorResponse(messsage, err.errors).send(res);
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
var BadTokenError = class extends ApiError {
|
|
285
|
+
constructor(message = "Invalid token", errors = []) {
|
|
286
|
+
super("BadTokenError" /* BAD_TOKEN */, message, errors);
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
var TokenExpiredError = class extends ApiError {
|
|
290
|
+
constructor(message = "Token expired", errors = []) {
|
|
291
|
+
super("TokenExpiredError" /* TOKEN_EXPIRED */, message, errors);
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
var AuthFailureError = class extends ApiError {
|
|
295
|
+
constructor(message = "Invalid Credentials", errors = []) {
|
|
296
|
+
super("AuthFailureError" /* UNAUTHORIZED */, message, errors);
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
var AccessTokenError = class extends ApiError {
|
|
300
|
+
constructor(message = "Invalid access token", errors = []) {
|
|
301
|
+
super("AccessTokenError" /* ACCESS_TOKEN */, message, errors);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
var InternalError = class extends ApiError {
|
|
305
|
+
constructor(message = "Internal error", errors = []) {
|
|
306
|
+
message = sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production ? message : "Something went wrong!";
|
|
307
|
+
super("InternalError" /* INTERNAL */, message, errors);
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
var NotFoundError = class extends ApiError {
|
|
311
|
+
constructor(message = "Not found", errors = []) {
|
|
312
|
+
super("NotFoundError" /* NOT_FOUND */, message, errors);
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
var NoEntryError = class extends ApiError {
|
|
316
|
+
constructor(message = "Entry don't exists", errors = []) {
|
|
317
|
+
super("NoEntryError" /* NO_ENTRY */, message, errors);
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
var NoDataError = class extends ApiError {
|
|
321
|
+
constructor(message = "No data", errors = []) {
|
|
322
|
+
super("NoDataError" /* NO_DATA */, message, errors);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
var BadRequestError = class extends ApiError {
|
|
326
|
+
constructor(message = "Bad request", errors = []) {
|
|
327
|
+
super("BadRequestError" /* BAD_REQUEST */, message, errors);
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
var ForbiddenError = class extends ApiError {
|
|
331
|
+
constructor(message = "Permission denied", errors = []) {
|
|
332
|
+
super("ForbiddenError" /* FORBIDDEN */, message, errors);
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
// src/core/Logger.ts
|
|
337
|
+
var import_winston = __toESM(require("winston"));
|
|
338
|
+
var import_fs = __toESM(require("fs"));
|
|
339
|
+
var import_path = __toESM(require("path"));
|
|
340
|
+
var import_winston_daily_rotate_file = __toESM(require("winston-daily-rotate-file"));
|
|
341
|
+
var dir = sanitizedConfig.LOG_DIR;
|
|
342
|
+
if (!dir) {
|
|
343
|
+
dir = import_path.default.resolve("logs");
|
|
344
|
+
}
|
|
345
|
+
if (!import_fs.default.existsSync(dir)) {
|
|
346
|
+
import_fs.default.mkdirSync(dir);
|
|
347
|
+
}
|
|
348
|
+
var logfileRotateTransport = new import_winston_daily_rotate_file.default({
|
|
349
|
+
level: sanitizedConfig.LOG_LEVEL,
|
|
350
|
+
// @ts-ignore
|
|
351
|
+
filename: dir + "/%DATE%.log",
|
|
352
|
+
datePattern: "YYYY-MM-DD",
|
|
353
|
+
zippedArchive: true,
|
|
354
|
+
handleExceptions: true,
|
|
355
|
+
maxSize: "20m",
|
|
356
|
+
maxFiles: "14d",
|
|
357
|
+
format: import_winston.format.combine(
|
|
358
|
+
import_winston.format.errors({ stack: true }),
|
|
359
|
+
import_winston.format.timestamp(),
|
|
360
|
+
import_winston.format.json()
|
|
361
|
+
)
|
|
362
|
+
});
|
|
363
|
+
var consoleTransport = new import_winston.default.transports.Console({
|
|
364
|
+
level: process.env.LOG_LEVEL,
|
|
365
|
+
format: import_winston.format.combine(
|
|
366
|
+
import_winston.format.colorize({ all: true }),
|
|
367
|
+
import_winston.format.timestamp({
|
|
368
|
+
format: "YYYY-MM-DD hh:mm:ss.SSS A"
|
|
369
|
+
}),
|
|
370
|
+
import_winston.format.align(),
|
|
371
|
+
import_winston.format.printf(
|
|
372
|
+
(info) => `[${info.timestamp}] ${info.level}: ${info.message}`
|
|
373
|
+
)
|
|
374
|
+
)
|
|
375
|
+
});
|
|
376
|
+
var logger = import_winston.default.createLogger({
|
|
377
|
+
transports: [consoleTransport, logfileRotateTransport],
|
|
378
|
+
exceptionHandlers: [logfileRotateTransport],
|
|
379
|
+
exitOnError: false
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
// src/middlewares/schemaValidator.ts
|
|
383
|
+
var schemaValidator = (type, schema) => {
|
|
384
|
+
return (req, res, next) => {
|
|
385
|
+
const result = schema.safeParse(req[type]);
|
|
386
|
+
if (!result.success) {
|
|
387
|
+
const errors = Object.entries(result.error.flatten().fieldErrors).map(
|
|
388
|
+
([key, value]) => ({
|
|
389
|
+
field: key,
|
|
390
|
+
message: value
|
|
391
|
+
})
|
|
392
|
+
);
|
|
393
|
+
next(new BadRequestError("Bad request", errors));
|
|
394
|
+
} else {
|
|
395
|
+
next();
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
// src/middlewares/verifyToken.ts
|
|
401
|
+
var import_jsonwebtoken2 = __toESM(require("jsonwebtoken"));
|
|
402
|
+
|
|
403
|
+
// src/services/jwt.service.ts
|
|
404
|
+
var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
|
|
405
|
+
var JwtService = class {
|
|
406
|
+
static sign(payload, signOptions = {}) {
|
|
407
|
+
const token = import_jsonwebtoken.default.sign(
|
|
408
|
+
payload,
|
|
409
|
+
sanitizedConfig.JWT_KEY,
|
|
410
|
+
signOptions
|
|
411
|
+
);
|
|
412
|
+
return token;
|
|
413
|
+
}
|
|
414
|
+
static verify(token, verifyOptions) {
|
|
415
|
+
const decoded = import_jsonwebtoken.default.verify(
|
|
416
|
+
token,
|
|
417
|
+
sanitizedConfig.JWT_KEY,
|
|
418
|
+
verifyOptions
|
|
419
|
+
);
|
|
420
|
+
return decoded;
|
|
421
|
+
}
|
|
422
|
+
static generatePayload(user) {
|
|
423
|
+
return {
|
|
424
|
+
_id: user._id.toString(),
|
|
425
|
+
email: user.email
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
// src/middlewares/verifyToken.ts
|
|
431
|
+
var verifyToken = async (req, res, next) => {
|
|
432
|
+
try {
|
|
433
|
+
const { token } = req?.session;
|
|
434
|
+
if (!token) {
|
|
435
|
+
next(new BadTokenError("Authentication token is missing"));
|
|
436
|
+
}
|
|
437
|
+
const decoded = JwtService.verify(token);
|
|
438
|
+
req.user = decoded;
|
|
439
|
+
next();
|
|
440
|
+
} catch (error) {
|
|
441
|
+
if (error instanceof import_jsonwebtoken2.default.TokenExpiredError) {
|
|
442
|
+
next(new TokenExpiredError());
|
|
443
|
+
} else if (error instanceof import_jsonwebtoken2.default.JsonWebTokenError) {
|
|
444
|
+
next(new BadTokenError());
|
|
445
|
+
} else {
|
|
446
|
+
next(new BadTokenError());
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
// src/services/password.service.ts
|
|
452
|
+
var import_bcrypt = __toESM(require("bcrypt"));
|
|
453
|
+
var Password = class {
|
|
454
|
+
static hashPassword(password) {
|
|
455
|
+
return new Promise((resolve, reject) => {
|
|
456
|
+
import_bcrypt.default.hash(password, sanitizedConfig.SALT_ROUNDS, function(err, hash) {
|
|
457
|
+
if (err) {
|
|
458
|
+
reject(err.message);
|
|
459
|
+
}
|
|
460
|
+
resolve(hash);
|
|
461
|
+
});
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
static comparePassword(password, hashedPassword) {
|
|
465
|
+
return new Promise((resolve, reject) => {
|
|
466
|
+
import_bcrypt.default.compare(password, hashedPassword, function(err, result) {
|
|
467
|
+
if (err) {
|
|
468
|
+
reject(err.message);
|
|
469
|
+
}
|
|
470
|
+
resolve(result);
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
// src/types/validation.ts
|
|
477
|
+
var ValidationSource = /* @__PURE__ */ ((ValidationSource2) => {
|
|
478
|
+
ValidationSource2["BODY"] = "body";
|
|
479
|
+
ValidationSource2["HEADER"] = "headers";
|
|
480
|
+
ValidationSource2["QUERY"] = "query";
|
|
481
|
+
ValidationSource2["PARAM"] = "params";
|
|
482
|
+
return ValidationSource2;
|
|
483
|
+
})(ValidationSource || {});
|
|
484
|
+
|
|
485
|
+
// src/utils/asyncHandler.ts
|
|
486
|
+
var asyncHandler = (execution) => async (req, res, next) => {
|
|
487
|
+
try {
|
|
488
|
+
await execution(req, res, next);
|
|
489
|
+
} catch (err) {
|
|
490
|
+
next(err);
|
|
491
|
+
}
|
|
492
|
+
};
|
|
493
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
494
|
+
0 && (module.exports = {
|
|
495
|
+
AccessTokenError,
|
|
496
|
+
AccessTokenErrorResponse,
|
|
497
|
+
ApiError,
|
|
498
|
+
ApiResponse,
|
|
499
|
+
AuthFailureError,
|
|
500
|
+
BadRequestError,
|
|
501
|
+
BadRequestResponse,
|
|
502
|
+
BadTokenError,
|
|
503
|
+
BadTokenResponse,
|
|
504
|
+
ENVIRONMENTS,
|
|
505
|
+
ErrorType,
|
|
506
|
+
ForbiddenError,
|
|
507
|
+
ForbiddenResponse,
|
|
508
|
+
InternalError,
|
|
509
|
+
InternalErrorResponse,
|
|
510
|
+
JwtService,
|
|
511
|
+
NoDataError,
|
|
512
|
+
NoEntryError,
|
|
513
|
+
NoFoundResponse,
|
|
514
|
+
NotFoundError,
|
|
515
|
+
Password,
|
|
516
|
+
ResponseStatusCode,
|
|
517
|
+
StatusCode,
|
|
518
|
+
SuccessResponse,
|
|
519
|
+
TokenExpiredError,
|
|
520
|
+
ValidationSource,
|
|
521
|
+
asyncHandler,
|
|
522
|
+
logger,
|
|
523
|
+
schemaValidator,
|
|
524
|
+
verifyToken
|
|
525
|
+
});
|
|
27
526
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAwC;AACxC,kDAA+B;AAC/B,qDAAkC;AAClC,gDAA6B;AAC7B,gEAA6C;AAC7C,4DAAyC;AACzC,yDAAsC;AACtC,8DAA2C;AAC3C,qDAAkC;AAClC,uDAAoC"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants/environments.ts","../src/core/ApiResponse.ts","../src/config/config.ts","../src/core/ApiError.ts","../src/core/Logger.ts","../src/middlewares/schemaValidator.ts","../src/middlewares/verifyToken.ts","../src/services/jwt.service.ts","../src/services/password.service.ts","../src/types/validation.ts","../src/utils/asyncHandler.ts"],"sourcesContent":["export * from \"./constants/environments\"\nexport * from \"./core/ApiError\"\nexport * from \"./core/ApiResponse\"\nexport * from \"./core/Logger\"\nexport * from \"./middlewares/schemaValidator\"\nexport * from \"./middlewares/verifyToken\"\nexport * from \"./services/jwt.service\"\nexport * from \"./services/password.service\"\nexport * from \"./types/validation\"\nexport * from \"./utils/asyncHandler\"\n","export const ENVIRONMENTS = {\n production: \"production\",\n development: \"development\",\n testing: \"testing\",\n};\n","import { Response } from \"express\";\nimport { ErrorDetailType } from \"@/core/ApiError\";\n\nexport enum StatusCode {\n SUCCESS = \"10000\",\n FAILURE = \"10001\",\n RETRY = \"10002\",\n IN_VALID_ACCESS_TOKEN = \"10003\",\n}\n\nexport enum ResponseStatusCode {\n SUCCESS = 200,\n CREATED = 201,\n ACCEPTED = 202,\n NO_CONTENT = 204,\n\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n NOT_MODIFIED = 304,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n PAYMENT_REQUIRED = 402,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n NOT_ACCEPTABLE = 406,\n CONFLICT = 409,\n GONE = 410,\n PAYLOAD_TOO_LARGE = 413,\n UNSUPPORTED_MEDIA_TYPE = 415,\n UNPROCESSABLE_ENTITY = 422,\n TOO_MANY_REQUESTS = 429,\n\n INTERNAL_ERROR = 500,\n NOT_IMPLEMENTED = 501,\n BAD_GATEWAY = 502,\n SERVICE_UNAVAILABLE = 503,\n GATEWAY_TIMEOUT = 504,\n}\n\nexport abstract class ApiResponse {\n public message: string;\n public statusCode: string | undefined;\n public status: number;\n\n constructor(status: number, message: string, statusCode?: string) {\n this.message = message;\n this.status = status;\n if (statusCode) {\n this.statusCode = statusCode;\n }\n }\n\n public prepare<T extends ApiResponse>(\n res: Response,\n response: T,\n headers: { [key: string]: string } = {}\n ) {\n for (const [key, value] of Object.entries(headers)) {\n res.append(key, value);\n }\n res.status(this.status).send(this.sanitize(response));\n }\n\n public send(res: Response, headers: { [key: string]: string } = {}) {\n this.prepare<ApiResponse>(res, this, headers);\n }\n\n private sanitize<T extends ApiResponse>(response: T) {\n const clone = {} as T;\n Object.assign(clone, response);\n\n delete clone[\"statusCode\"];\n\n for (const key in clone) {\n const typedKey = key as keyof T;\n if (clone[typedKey] === undefined) {\n delete clone[typedKey];\n }\n }\n return clone;\n }\n}\n\nexport class SuccessResponse<T> extends ApiResponse {\n constructor(\n responseStatusCode:\n | ResponseStatusCode.SUCCESS\n | ResponseStatusCode.CREATED\n | ResponseStatusCode.ACCEPTED\n | ResponseStatusCode.NO_CONTENT,\n message: string,\n public data: T\n ) {\n super(responseStatusCode, message, StatusCode.SUCCESS);\n this.data = data;\n }\n\n send(res: Response) {\n this.prepare<SuccessResponse<T>>(res, this, {});\n }\n}\n\nexport class AccessTokenErrorResponse extends ApiResponse {\n protected instruction: string = \"refresh_token\";\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(\n ResponseStatusCode.UNAUTHORIZED,\n message,\n StatusCode.IN_VALID_ACCESS_TOKEN\n );\n this.errors = errors || [];\n }\n\n send(res: Response, headers: { [key: string]: string } = {}) {\n headers.instruction = this.instruction;\n this.prepare<AccessTokenErrorResponse>(res, this, headers);\n }\n}\n\nexport class BadTokenResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.UNAUTHORIZED, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class BadRequestResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.BAD_REQUEST, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class InternalErrorResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.INTERNAL_ERROR, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class NoFoundResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.NOT_FOUND, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n\nexport class ForbiddenResponse extends ApiResponse {\n public errors: ErrorDetailType[];\n\n constructor(message: string, errors: ErrorDetailType[]) {\n super(ResponseStatusCode.FORBIDDEN, message, StatusCode.FAILURE);\n this.errors = errors || [];\n }\n}\n","import \"dotenv/config\";\n\ninterface Env {\n ENVIRONMENT: string;\n LOG_DIR: string;\n LOG_LEVEL: string;\n SALT_ROUNDS: number;\n JWT_KEY: string;\n}\n\nconst getConfig = (): Env => {\n return {\n ENVIRONMENT: process.env.ENVIRONMENT,\n LOG_DIR: process.env.LOG_DIR,\n LOG_LEVEL: process.env.LOG_LEVEL,\n SALT_ROUNDS: parseInt(process.env.SALT_ROUNDS),\n JWT_KEY: process.env.JWT_KEY,\n };\n};\n\nconst getSanitizedConfig = (config: Env): Env => {\n for (const [key, value] of Object.entries(config)) {\n if (!value) {\n throw new Error(`Missing key ${key} in config.env`);\n }\n }\n\n return config;\n};\n\nconst config = getConfig();\nexport const sanitizedConfig = getSanitizedConfig(config);\n","import { Response } from \"express\";\n\nimport {\n AccessTokenErrorResponse,\n BadRequestResponse,\n BadTokenResponse,\n ForbiddenResponse,\n InternalErrorResponse,\n NoFoundResponse,\n} from \"@/core/ApiResponse\";\nimport { sanitizedConfig } from \"@/config/config\";\nimport { ENVIRONMENTS } from \"@/constants/environments\";\n\nexport enum ErrorType {\n BAD_TOKEN = \"BadTokenError\",\n TOKEN_EXPIRED = \"TokenExpiredError\",\n UNAUTHORIZED = \"AuthFailureError\",\n ACCESS_TOKEN = \"AccessTokenError\",\n INTERNAL = \"InternalError\",\n NOT_FOUND = \"NotFoundError\",\n NO_ENTRY = \"NoEntryError\",\n NO_DATA = \"NoDataError\",\n BAD_REQUEST = \"BadRequestError\",\n FORBIDDEN = \"ForbiddenError\",\n}\n\nexport type ErrorDetailType = {\n field: string | number;\n message?: (string | number)[];\n};\n\nexport abstract class ApiError extends Error {\n constructor(\n public type: ErrorType,\n public message: string = \"Error\",\n public errors: ErrorDetailType[]\n ) {\n super(type);\n this.type = type;\n this.message = message;\n this.errors = errors;\n }\n\n public static handle(err: ApiError, res: Response) {\n switch (err.type) {\n case ErrorType.BAD_TOKEN:\n case ErrorType.TOKEN_EXPIRED:\n case ErrorType.UNAUTHORIZED:\n new BadTokenResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.ACCESS_TOKEN:\n new AccessTokenErrorResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.INTERNAL:\n new InternalErrorResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.NOT_FOUND:\n case ErrorType.NO_ENTRY:\n case ErrorType.NO_DATA:\n new NoFoundResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.BAD_REQUEST:\n new BadRequestResponse(err.message, err.errors).send(res);\n break;\n case ErrorType.FORBIDDEN:\n new ForbiddenResponse(err.message, err.errors).send(res);\n break;\n default:\n let messsage = err.message;\n messsage =\n sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production\n ? messsage\n : \"Something went wrong!\";\n new InternalErrorResponse(messsage, err.errors).send(res);\n break;\n }\n }\n}\n\nexport class BadTokenError extends ApiError {\n constructor(\n message: string = \"Invalid token\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.BAD_TOKEN, message, errors);\n }\n}\n\nexport class TokenExpiredError extends ApiError {\n constructor(\n message: string = \"Token expired\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.TOKEN_EXPIRED, message, errors);\n }\n}\n\nexport class AuthFailureError extends ApiError {\n constructor(\n message: string = \"Invalid Credentials\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.UNAUTHORIZED, message, errors);\n }\n}\n\nexport class AccessTokenError extends ApiError {\n constructor(\n message: string = \"Invalid access token\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.ACCESS_TOKEN, message, errors);\n }\n}\nexport class InternalError extends ApiError {\n constructor(\n message: string = \"Internal error\",\n errors: ErrorDetailType[] = []\n ) {\n message =\n sanitizedConfig.ENVIRONMENT !== ENVIRONMENTS.production\n ? message\n : \"Something went wrong!\";\n super(ErrorType.INTERNAL, message, errors);\n }\n}\n\nexport class NotFoundError extends ApiError {\n constructor(message: string = \"Not found\", errors: ErrorDetailType[] = []) {\n super(ErrorType.NOT_FOUND, message, errors);\n }\n}\n\nexport class NoEntryError extends ApiError {\n constructor(\n message: string = \"Entry don't exists\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.NO_ENTRY, message, errors);\n }\n}\n\nexport class NoDataError extends ApiError {\n constructor(message: string = \"No data\", errors: ErrorDetailType[] = []) {\n super(ErrorType.NO_DATA, message, errors);\n }\n}\n\nexport class BadRequestError extends ApiError {\n constructor(message: string = \"Bad request\", errors: ErrorDetailType[] = []) {\n super(ErrorType.BAD_REQUEST, message, errors);\n }\n}\n\nexport class ForbiddenError extends ApiError {\n constructor(\n message: string = \"Permission denied\",\n errors: ErrorDetailType[] = []\n ) {\n super(ErrorType.FORBIDDEN, message, errors);\n }\n}\n","import winston, { format } from \"winston\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport DailyRotateFile from \"winston-daily-rotate-file\";\nimport { sanitizedConfig } from \"@/config/config\";\n\nlet dir = sanitizedConfig.LOG_DIR;\nif (!dir) {\n dir = path.resolve(\"logs\");\n}\n\nif (!fs.existsSync(dir)) {\n fs.mkdirSync(dir);\n}\n\nconst logfileRotateTransport = new DailyRotateFile({\n level: sanitizedConfig.LOG_LEVEL,\n // @ts-ignore\n filename: dir + \"/%DATE%.log\",\n datePattern: \"YYYY-MM-DD\",\n zippedArchive: true,\n handleExceptions: true,\n maxSize: \"20m\",\n maxFiles: \"14d\",\n format: format.combine(\n format.errors({ stack: true }),\n format.timestamp(),\n format.json()\n ),\n});\n\nconst consoleTransport = new winston.transports.Console({\n level: process.env.LOG_LEVEL,\n format: format.combine(\n format.colorize({ all: true }),\n format.timestamp({\n format: \"YYYY-MM-DD hh:mm:ss.SSS A\",\n }),\n format.align(),\n format.printf(\n (info) => `[${info.timestamp}] ${info.level}: ${info.message}`\n )\n ),\n});\n\nexport const logger = winston.createLogger({\n transports: [consoleTransport, logfileRotateTransport],\n exceptionHandlers: [logfileRotateTransport],\n exitOnError: false,\n});\n","import { Request, Response, NextFunction } from \"express\";\nimport { ZodSchema } from \"zod\";\n\nimport { BadRequestError } from \"@/core/ApiError\";\nimport { ValidationSource } from \"@/types/validation\";\n\nexport const schemaValidator = (type: ValidationSource, schema: ZodSchema) => {\n return (req: Request, res: Response, next: NextFunction) => {\n const result = schema.safeParse(req[type]);\n\n if (!result.success) {\n const errors = Object.entries(result.error.flatten().fieldErrors).map(\n ([key, value]) => ({\n field: key,\n message: value,\n })\n );\n next(new BadRequestError(\"Bad request\", errors));\n } else {\n next();\n }\n };\n};\n\n","import jsonwebtoken from \"jsonwebtoken\";\nimport { Request, Response, NextFunction } from \"express\";\n\nimport { BadTokenError, TokenExpiredError } from \"@/core/ApiError\";\nimport { JwtPayload, JwtService } from \"@/services/jwt.service\";\n\nexport const verifyToken = async (\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n try {\n const { token } = req?.session;\n if (!token) {\n next(new BadTokenError(\"Authentication token is missing\"));\n }\n\n const decoded = JwtService.verify(token) as JwtPayload;\n\n req.user = decoded;\n next();\n } catch (error) {\n if (error instanceof jsonwebtoken.TokenExpiredError) {\n next(new TokenExpiredError());\n } else if (error instanceof jsonwebtoken.JsonWebTokenError) {\n next(new BadTokenError());\n } else {\n next(new BadTokenError());\n }\n }\n};\n","import { sanitizedConfig } from \"@/config/config\";\nimport jsonwebtoken, { SignOptions, VerifyOptions } from \"jsonwebtoken\";\n\nexport interface JwtPayload {\n _id: string;\n email: string;\n}\n\nexport class JwtService {\n static sign(\n payload: string | Buffer | object,\n signOptions: SignOptions = {}\n ): string {\n const token = jsonwebtoken.sign(\n payload,\n sanitizedConfig.JWT_KEY,\n signOptions\n );\n return token;\n }\n\n static verify(token: string, verifyOptions?: VerifyOptions) {\n const decoded = jsonwebtoken.verify(\n token,\n sanitizedConfig.JWT_KEY,\n verifyOptions\n );\n return decoded;\n }\n\n static generatePayload<T extends JwtPayload>(user: T): T {\n return {\n _id: user._id.toString(),\n email: user.email,\n } as T;\n }\n}\n","import { sanitizedConfig } from \"@/config/config\";\nimport bcrypt from \"bcrypt\";\n\nexport class Password {\n static hashPassword(password: string): Promise<string> {\n return new Promise((resolve, reject) => {\n bcrypt.hash(password, sanitizedConfig.SALT_ROUNDS, function (err, hash) {\n if (err) {\n reject(err.message);\n }\n resolve(hash);\n });\n });\n }\n\n static comparePassword(\n password: string,\n hashedPassword: string\n ): Promise<string | boolean> {\n return new Promise((resolve, reject) => {\n bcrypt.compare(password, hashedPassword, function (err, result) {\n if (err) {\n reject(err.message);\n }\n resolve(result);\n });\n });\n }\n}\n\n","export enum ValidationSource {\n BODY = 'body',\n HEADER = 'headers',\n QUERY = 'query',\n PARAM = 'params',\n }","import { Request, Response, NextFunction } from \"express\";\n\ntype AsyncFunction = (\n req: Request,\n res: Response,\n next: NextFunction\n) => Promise<any>;\n\nexport const asyncHandler =\n (execution: AsyncFunction) =>\n async (req: Request, res: Response, next: NextFunction) => {\n try {\n await execution(req, res, next);\n } catch (err) {\n next(err);\n }\n };\n"],"mappings":"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","names":["StatusCode","ResponseStatusCode","config","ErrorType","path","fs","DailyRotateFile","winston","import_jsonwebtoken","jsonwebtoken","jsonwebtoken","bcrypt","ValidationSource"]}
|