@deplois/api 0.0.0-stage → 0.0.2

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.
Files changed (56) hide show
  1. package/README.md +176 -2
  2. package/dist/api.module.d.ts +10 -0
  3. package/dist/api.module.js +58 -0
  4. package/dist/controller/session.controller.d.ts +30 -0
  5. package/dist/controller/session.controller.js +115 -0
  6. package/dist/create-api.d.ts +16 -0
  7. package/dist/create-api.js +113 -0
  8. package/dist/database/client.d.ts +6 -0
  9. package/dist/database/client.js +29 -0
  10. package/dist/database/identity.store.d.ts +12 -0
  11. package/dist/database/identity.store.js +91 -0
  12. package/dist/database/index.d.ts +5 -0
  13. package/dist/database/index.js +21 -0
  14. package/dist/database/metadata.d.ts +1 -0
  15. package/dist/database/metadata.js +21 -0
  16. package/dist/database/session.entity.d.ts +11 -0
  17. package/dist/database/session.entity.js +62 -0
  18. package/dist/database/user.entity.d.ts +10 -0
  19. package/dist/database/user.entity.js +54 -0
  20. package/dist/identity/identity.plugin.d.ts +31 -0
  21. package/dist/identity/identity.plugin.js +161 -0
  22. package/dist/identity/identity.service.d.ts +33 -0
  23. package/dist/identity/identity.service.js +36 -0
  24. package/dist/identity/interface.d.ts +49 -0
  25. package/dist/identity/interface.js +2 -0
  26. package/dist/index.d.ts +19 -0
  27. package/dist/index.js +40 -0
  28. package/dist/interface.d.ts +20 -0
  29. package/dist/interface.js +2 -0
  30. package/dist/options.d.ts +23 -0
  31. package/dist/options.js +4 -0
  32. package/dist/session.module.d.ts +2 -0
  33. package/dist/session.module.js +18 -0
  34. package/dist/system/decorator/raw-response.decorator.d.ts +2 -0
  35. package/dist/system/decorator/raw-response.decorator.js +7 -0
  36. package/dist/system/error/app.exception.d.ts +6 -0
  37. package/dist/system/error/app.exception.js +12 -0
  38. package/dist/system/error/error-code.enum.d.ts +11 -0
  39. package/dist/system/error/error-code.enum.js +15 -0
  40. package/dist/system/error/error.plugin.d.ts +14 -0
  41. package/dist/system/error/error.plugin.js +108 -0
  42. package/dist/system/filter/http-exception.filter.d.ts +9 -0
  43. package/dist/system/filter/http-exception.filter.js +49 -0
  44. package/dist/system/guard/session.guard.d.ts +13 -0
  45. package/dist/system/guard/session.guard.js +64 -0
  46. package/dist/system/guard/user.guard.d.ts +13 -0
  47. package/dist/system/guard/user.guard.js +46 -0
  48. package/dist/system/interceptor/response.interceptor.d.ts +9 -0
  49. package/dist/system/interceptor/response.interceptor.js +44 -0
  50. package/dist/system/logger/file.logger.d.ts +38 -0
  51. package/dist/system/logger/file.logger.js +116 -0
  52. package/dist/system/logger/request.logger.d.ts +25 -0
  53. package/dist/system/logger/request.logger.js +99 -0
  54. package/dist/system/pipe/body-validation.pipe.d.ts +7 -0
  55. package/dist/system/pipe/body-validation.pipe.js +71 -0
  56. package/package.json +63 -4
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.errorPlugin = void 0;
21
+ __exportStar(require("./api.module"), exports);
22
+ __exportStar(require("./options"), exports);
23
+ __exportStar(require("./interface"), exports);
24
+ __exportStar(require("./system/error/app.exception"), exports);
25
+ __exportStar(require("./system/error/error-code.enum"), exports);
26
+ var error_plugin_1 = require("./system/error/error.plugin");
27
+ Object.defineProperty(exports, "errorPlugin", { enumerable: true, get: function () { return __importDefault(error_plugin_1).default; } });
28
+ __exportStar(require("./system/filter/http-exception.filter"), exports);
29
+ __exportStar(require("./system/interceptor/response.interceptor"), exports);
30
+ __exportStar(require("./system/pipe/body-validation.pipe"), exports);
31
+ __exportStar(require("./system/logger/request.logger"), exports);
32
+ __exportStar(require("./system/guard/session.guard"), exports);
33
+ __exportStar(require("./system/decorator/raw-response.decorator"), exports);
34
+ __exportStar(require("./identity/interface"), exports);
35
+ __exportStar(require("./identity/identity.plugin"), exports);
36
+ __exportStar(require("./identity/identity.service"), exports);
37
+ __exportStar(require("./system/guard/user.guard"), exports);
38
+ __exportStar(require("./session.module"), exports);
39
+ __exportStar(require("./create-api"), exports);
40
+ __exportStar(require("./system/logger/file.logger"), exports);
@@ -0,0 +1,20 @@
1
+ export interface ErrorObject {
2
+ code: string;
3
+ message: string;
4
+ }
5
+ export type APIResponse<T = unknown> = {
6
+ success: true;
7
+ data: T;
8
+ error: null;
9
+ } | {
10
+ success: false;
11
+ data: null;
12
+ error: ErrorObject;
13
+ };
14
+ export type PluginResult<T> = {
15
+ success: true;
16
+ data: T;
17
+ } | {
18
+ success: false;
19
+ error: Error;
20
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,23 @@
1
+ import type { ModuleMetadata, FactoryProvider } from '@nestjs/common';
2
+ import type { createIdentityPlugins } from './identity/identity.plugin';
3
+ import type { Request } from 'express';
4
+ import type { HTTPLog } from './system/logger/request.logger';
5
+ export declare const API_OPTIONS: unique symbol;
6
+ export interface APIOptions {
7
+ validation?: boolean;
8
+ exposeInternalErrors?: boolean;
9
+ logging?: false | {
10
+ bodies?: boolean;
11
+ redact?: string[];
12
+ write?: (entry: HTTPLog) => void | Promise<void>;
13
+ };
14
+ onError?: (error: unknown, requestId: string) => void | Promise<void>;
15
+ identity?: ReturnType<typeof createIdentityPlugins>;
16
+ session?: {
17
+ resolve: (token: string, request: Request) => Promise<unknown | null>;
18
+ };
19
+ }
20
+ export interface APIAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
21
+ inject?: FactoryProvider['inject'];
22
+ useFactory: (...dependencies: any[]) => APIOptions | Promise<APIOptions>;
23
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.API_OPTIONS = void 0;
4
+ exports.API_OPTIONS = Symbol('API_OPTIONS');
@@ -0,0 +1,2 @@
1
+ export declare class SessionModule {
2
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SessionModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const session_controller_1 = require("./controller/session.controller");
12
+ // Import explicitly to expose the /session HTTP endpoints.
13
+ let SessionModule = class SessionModule {
14
+ };
15
+ exports.SessionModule = SessionModule;
16
+ exports.SessionModule = SessionModule = __decorate([
17
+ (0, common_1.Module)({ controllers: [session_controller_1.SessionController] })
18
+ ], SessionModule);
@@ -0,0 +1,2 @@
1
+ export declare const RAW_RESPONSE: unique symbol;
2
+ export declare const RawResponse: () => import("@nestjs/common").CustomDecorator<typeof RAW_RESPONSE>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RawResponse = exports.RAW_RESPONSE = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.RAW_RESPONSE = Symbol('RAW_RESPONSE');
6
+ const RawResponse = () => (0, common_1.SetMetadata)(exports.RAW_RESPONSE, true);
7
+ exports.RawResponse = RawResponse;
@@ -0,0 +1,6 @@
1
+ import { HttpException, HttpExceptionOptions } from '@nestjs/common';
2
+ import { ErrorObject } from '../../interface';
3
+ export declare class AppException extends HttpException {
4
+ error: ErrorObject;
5
+ constructor(error: ErrorObject, statusCode?: number, options?: HttpExceptionOptions);
6
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppException = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ class AppException extends common_1.HttpException {
6
+ error;
7
+ constructor(error, statusCode = common_1.HttpStatus.BAD_REQUEST, options) {
8
+ super(error, statusCode, options);
9
+ this.error = error;
10
+ }
11
+ }
12
+ exports.AppException = AppException;
@@ -0,0 +1,11 @@
1
+ export declare enum ErrorCode {
2
+ expired_session = "EXPIRED_SESSION",
3
+ wrong_parameter = "WRONG_PARAMETER",
4
+ invalid_request = "INVALID_REQUEST",
5
+ unauthorized = "UNAUTHORIZED",
6
+ forbidden = "FORBIDDEN",
7
+ not_found = "NOT_FOUND",
8
+ conflict = "CONFLICT",
9
+ too_many_requests = "TOO_MANY_REQUESTS",
10
+ internal_server_error = "INTERNAL_SERVER_ERROR"
11
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorCode = void 0;
4
+ var ErrorCode;
5
+ (function (ErrorCode) {
6
+ ErrorCode["expired_session"] = "EXPIRED_SESSION";
7
+ ErrorCode["wrong_parameter"] = "WRONG_PARAMETER";
8
+ ErrorCode["invalid_request"] = "INVALID_REQUEST";
9
+ ErrorCode["unauthorized"] = "UNAUTHORIZED";
10
+ ErrorCode["forbidden"] = "FORBIDDEN";
11
+ ErrorCode["not_found"] = "NOT_FOUND";
12
+ ErrorCode["conflict"] = "CONFLICT";
13
+ ErrorCode["too_many_requests"] = "TOO_MANY_REQUESTS";
14
+ ErrorCode["internal_server_error"] = "INTERNAL_SERVER_ERROR";
15
+ })(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
@@ -0,0 +1,14 @@
1
+ import { HttpExceptionOptions } from '@nestjs/common';
2
+ import { AppException } from './app.exception';
3
+ import { ErrorObject } from '../../interface';
4
+ declare const _default: {
5
+ pluginName: string;
6
+ createErrorObject: (code: string, message: string) => ErrorObject;
7
+ createException: (code: string, message: string, statusCode?: number, options?: HttpExceptionOptions) => AppException;
8
+ getStatusCode: (exception: unknown) => number;
9
+ fromUnknown: (exception: unknown, exposeInternalErrors?: boolean) => {
10
+ statusCode: number;
11
+ error: ErrorObject;
12
+ };
13
+ };
14
+ export default _default;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@nestjs/common");
4
+ const app_exception_1 = require("./app.exception");
5
+ const error_code_enum_1 = require("./error-code.enum");
6
+ exports.default = {
7
+ pluginName: 'error.plugin',
8
+ createErrorObject: (code, message) => {
9
+ return {
10
+ code: code,
11
+ message: message
12
+ };
13
+ },
14
+ createException: (code, message, statusCode = common_1.HttpStatus.BAD_REQUEST, options) => {
15
+ return new app_exception_1.AppException({
16
+ code: code,
17
+ message: message
18
+ }, statusCode, options);
19
+ },
20
+ getStatusCode: (exception) => {
21
+ if (exception instanceof common_1.HttpException) {
22
+ return exception.getStatus();
23
+ }
24
+ return common_1.HttpStatus.INTERNAL_SERVER_ERROR;
25
+ },
26
+ fromUnknown: (exception, exposeInternalErrors = false) => {
27
+ if (exception instanceof app_exception_1.AppException) {
28
+ return {
29
+ statusCode: exception.getStatus(),
30
+ error: exception.error
31
+ };
32
+ }
33
+ if (exception instanceof common_1.HttpException) {
34
+ const response = exception.getResponse();
35
+ if (typeof response == 'object'
36
+ && response != null
37
+ && 'code' in response
38
+ && 'message' in response) {
39
+ return {
40
+ statusCode: exception.getStatus(),
41
+ error: {
42
+ code: String(response.code),
43
+ message: String(response.message)
44
+ }
45
+ };
46
+ }
47
+ const message = typeof response == 'string'
48
+ ? response
49
+ : (typeof response == 'object'
50
+ && response != null
51
+ && 'message' in response
52
+ ? Array.isArray(response.message)
53
+ ? response.message.join(', ')
54
+ : String(response.message)
55
+ : 'Request failed.');
56
+ return {
57
+ statusCode: exception.getStatus(),
58
+ error: {
59
+ code: mapHttpStatusCode(exception.getStatus()),
60
+ message: message
61
+ }
62
+ };
63
+ }
64
+ if (exception instanceof Error) {
65
+ return {
66
+ statusCode: common_1.HttpStatus.INTERNAL_SERVER_ERROR,
67
+ error: {
68
+ code: error_code_enum_1.ErrorCode.internal_server_error,
69
+ message: exposeInternalErrors ? exception.message : 'An internal server error occurred.'
70
+ }
71
+ };
72
+ }
73
+ if (typeof exception == 'string') {
74
+ return {
75
+ statusCode: common_1.HttpStatus.INTERNAL_SERVER_ERROR,
76
+ error: {
77
+ code: error_code_enum_1.ErrorCode.internal_server_error,
78
+ message: exposeInternalErrors ? exception : 'An internal server error occurred.'
79
+ }
80
+ };
81
+ }
82
+ return {
83
+ statusCode: common_1.HttpStatus.INTERNAL_SERVER_ERROR,
84
+ error: {
85
+ code: error_code_enum_1.ErrorCode.internal_server_error,
86
+ message: 'An internal server error occurred.'
87
+ }
88
+ };
89
+ }
90
+ };
91
+ function mapHttpStatusCode(statusCode) {
92
+ switch (statusCode) {
93
+ case common_1.HttpStatus.BAD_REQUEST:
94
+ return error_code_enum_1.ErrorCode.invalid_request;
95
+ case common_1.HttpStatus.UNAUTHORIZED:
96
+ return error_code_enum_1.ErrorCode.unauthorized;
97
+ case common_1.HttpStatus.FORBIDDEN:
98
+ return error_code_enum_1.ErrorCode.forbidden;
99
+ case common_1.HttpStatus.NOT_FOUND:
100
+ return error_code_enum_1.ErrorCode.not_found;
101
+ case common_1.HttpStatus.CONFLICT:
102
+ return error_code_enum_1.ErrorCode.conflict;
103
+ case common_1.HttpStatus.TOO_MANY_REQUESTS:
104
+ return error_code_enum_1.ErrorCode.too_many_requests;
105
+ default:
106
+ return error_code_enum_1.ErrorCode.internal_server_error;
107
+ }
108
+ }
@@ -0,0 +1,9 @@
1
+ import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
+ import { APIOptions } from '../../options';
3
+ import { RequestLogger } from '../logger/request.logger';
4
+ export declare class HTTPExceptionFilter implements ExceptionFilter {
5
+ private readonly options;
6
+ private readonly logger;
7
+ constructor(options: APIOptions, logger: RequestLogger);
8
+ catch(exception: unknown, host: ArgumentsHost): void;
9
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.HTTPExceptionFilter = void 0;
19
+ const common_1 = require("@nestjs/common");
20
+ const options_1 = require("../../options");
21
+ const error_plugin_1 = __importDefault(require("../error/error.plugin"));
22
+ const request_logger_1 = require("../logger/request.logger");
23
+ let HTTPExceptionFilter = class HTTPExceptionFilter {
24
+ options;
25
+ logger;
26
+ constructor(options, logger) {
27
+ this.options = options;
28
+ this.logger = logger;
29
+ }
30
+ catch(exception, host) {
31
+ if (host.getType() !== 'http')
32
+ throw exception;
33
+ const request = host.switchToHttp().getRequest();
34
+ const response = host.switchToHttp().getResponse();
35
+ this.logger.error(request, exception);
36
+ if (response.headersSent)
37
+ return;
38
+ const result = error_plugin_1.default.fromUnknown(exception, this.options.exposeInternalErrors);
39
+ const body = { success: false, data: null, error: result.error };
40
+ this.logger.response(request, body);
41
+ response.status(result.statusCode).json(body);
42
+ }
43
+ };
44
+ exports.HTTPExceptionFilter = HTTPExceptionFilter;
45
+ exports.HTTPExceptionFilter = HTTPExceptionFilter = __decorate([
46
+ (0, common_1.Catch)(),
47
+ __param(0, (0, common_1.Inject)(options_1.API_OPTIONS)),
48
+ __metadata("design:paramtypes", [Object, request_logger_1.RequestLogger])
49
+ ], HTTPExceptionFilter);
@@ -0,0 +1,13 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import type { Request } from 'express';
3
+ import { APIOptions } from '../../options';
4
+ export type SessionRequest<T = unknown> = Request & {
5
+ session: T;
6
+ };
7
+ export declare function getBearerToken(authorization?: string): string | null;
8
+ export declare class SessionGuard implements CanActivate {
9
+ private readonly options;
10
+ private readonly resolutions;
11
+ constructor(options: APIOptions);
12
+ canActivate(context: ExecutionContext): Promise<boolean>;
13
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.SessionGuard = void 0;
19
+ exports.getBearerToken = getBearerToken;
20
+ const common_1 = require("@nestjs/common");
21
+ const options_1 = require("../../options");
22
+ const error_plugin_1 = __importDefault(require("../error/error.plugin"));
23
+ function getBearerToken(authorization) {
24
+ return /^Bearer\s+(\S+)$/i.exec(authorization ?? '')?.[1] ?? null;
25
+ }
26
+ let SessionGuard = class SessionGuard {
27
+ options;
28
+ resolutions = new WeakMap();
29
+ constructor(options) {
30
+ this.options = options;
31
+ }
32
+ async canActivate(context) {
33
+ const request = context.switchToHttp().getRequest();
34
+ const token = getBearerToken(request.headers.authorization);
35
+ if (!token)
36
+ throw error_plugin_1.default.createException('WRONG_SESSION', 'Required session.');
37
+ if (!this.options.session && !this.options.identity)
38
+ throw error_plugin_1.default.createException('SERVER_ERROR', 'Session authentication is not configured.', 500);
39
+ let resolution = this.resolutions.get(request);
40
+ if (!resolution) {
41
+ resolution = Promise.resolve().then(async () => {
42
+ if (this.options.session)
43
+ return this.options.session.resolve(token, request);
44
+ const result = await this.options.identity.sessionPlugin.get(token);
45
+ if (!result.success)
46
+ throw result.error;
47
+ return result.data;
48
+ });
49
+ this.resolutions.set(request, resolution);
50
+ }
51
+ const session = await resolution;
52
+ if (session == null)
53
+ throw error_plugin_1.default.createException('WRONG_SESSION', 'Wrong session.');
54
+ context.switchToHttp().getResponse().setHeader('Cache-Control', 'no-store');
55
+ request.session = session;
56
+ return true;
57
+ }
58
+ };
59
+ exports.SessionGuard = SessionGuard;
60
+ exports.SessionGuard = SessionGuard = __decorate([
61
+ (0, common_1.Injectable)(),
62
+ __param(0, (0, common_1.Inject)(options_1.API_OPTIONS)),
63
+ __metadata("design:paramtypes", [Object])
64
+ ], SessionGuard);
@@ -0,0 +1,13 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { SessionGuard, SessionRequest } from './session.guard';
3
+ import { IdentityService } from '../../identity/identity.service';
4
+ import type { Session, User } from '../../identity/interface';
5
+ export type UserRequest = SessionRequest<Omit<Session, 'tokenHash'>> & {
6
+ users: User[];
7
+ };
8
+ export declare class UserGuard implements CanActivate {
9
+ private readonly sessionGuard;
10
+ private readonly identity;
11
+ constructor(sessionGuard: SessionGuard, identity: IdentityService);
12
+ canActivate(context: ExecutionContext): Promise<boolean>;
13
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.UserGuard = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const app_exception_1 = require("../error/app.exception");
18
+ const session_guard_1 = require("./session.guard");
19
+ const identity_service_1 = require("../../identity/identity.service");
20
+ const error_plugin_1 = __importDefault(require("../error/error.plugin"));
21
+ let UserGuard = class UserGuard {
22
+ sessionGuard;
23
+ identity;
24
+ constructor(sessionGuard, identity) {
25
+ this.sessionGuard = sessionGuard;
26
+ this.identity = identity;
27
+ }
28
+ async canActivate(context) {
29
+ await this.sessionGuard.canActivate(context);
30
+ const request = context.switchToHttp().getRequest();
31
+ const results = await Promise.all((request.session.userIds ?? []).map(id => this.identity.userPlugin.get(id)));
32
+ for (const result of results) {
33
+ if (!result.success && !(result.error instanceof app_exception_1.AppException && result.error.error.code === 'USER_NOT_FOUND'))
34
+ throw result.error;
35
+ }
36
+ request.users = results.flatMap(result => result.success ? [result.data] : []);
37
+ if (!request.users.length)
38
+ throw error_plugin_1.default.createException('REQUIRED_USER', 'A signed-in user is required.', 401);
39
+ return true;
40
+ }
41
+ };
42
+ exports.UserGuard = UserGuard;
43
+ exports.UserGuard = UserGuard = __decorate([
44
+ (0, common_1.Injectable)(),
45
+ __metadata("design:paramtypes", [session_guard_1.SessionGuard, identity_service_1.IdentityService])
46
+ ], UserGuard);
@@ -0,0 +1,9 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { RequestLogger } from '../logger/request.logger';
4
+ export declare class ResponseInterceptor implements NestInterceptor {
5
+ private readonly reflector;
6
+ private readonly logger;
7
+ constructor(reflector: Reflector, logger: RequestLogger);
8
+ intercept(context: ExecutionContext, next: CallHandler): import("rxjs").Observable<any>;
9
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ResponseInterceptor = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const rxjs_1 = require("rxjs");
16
+ const raw_response_decorator_1 = require("../decorator/raw-response.decorator");
17
+ const request_logger_1 = require("../logger/request.logger");
18
+ let ResponseInterceptor = class ResponseInterceptor {
19
+ reflector;
20
+ logger;
21
+ constructor(reflector, logger) {
22
+ this.reflector = reflector;
23
+ this.logger = logger;
24
+ }
25
+ intercept(context, next) {
26
+ if (context.getType() !== 'http')
27
+ return next.handle();
28
+ const request = context.switchToHttp().getRequest();
29
+ const response = context.switchToHttp().getResponse();
30
+ const raw = this.reflector.getAllAndOverride(raw_response_decorator_1.RAW_RESPONSE, [context.getHandler(), context.getClass()]);
31
+ return next.handle().pipe((0, rxjs_1.map)(data => {
32
+ if (response.headersSent || data instanceof common_1.StreamableFile || response.statusCode === 204 || response.statusCode === 304)
33
+ return data;
34
+ const body = raw ? data : { success: true, data: data ?? null, error: null };
35
+ this.logger.response(request, body);
36
+ return body;
37
+ }));
38
+ }
39
+ };
40
+ exports.ResponseInterceptor = ResponseInterceptor;
41
+ exports.ResponseInterceptor = ResponseInterceptor = __decorate([
42
+ (0, common_1.Injectable)(),
43
+ __metadata("design:paramtypes", [core_1.Reflector, request_logger_1.RequestLogger])
44
+ ], ResponseInterceptor);
@@ -0,0 +1,38 @@
1
+ import type { LoggerService } from '@nestjs/common';
2
+ import type { HTTPLog } from './request.logger';
3
+ export interface FileLoggerOptions {
4
+ directory?: string;
5
+ maxFileSize?: number;
6
+ retentionDays?: number;
7
+ }
8
+ export declare class FileLogger implements LoggerService {
9
+ readonly directory: string;
10
+ readonly recent: string[];
11
+ readonly network: HTTPLog[];
12
+ requests: number;
13
+ errors: number;
14
+ warnings: number;
15
+ failedWrites: number;
16
+ private durations;
17
+ private queue;
18
+ private pending;
19
+ private day;
20
+ private part;
21
+ private size;
22
+ private closed;
23
+ private readonly maxFileSize;
24
+ private readonly retentionDays;
25
+ constructor(options?: FileLoggerOptions);
26
+ get median(): number;
27
+ reset(): void;
28
+ log(message: unknown, ...details: unknown[]): void;
29
+ error(message: unknown, ...details: unknown[]): void;
30
+ warn(message: unknown, ...details: unknown[]): void;
31
+ debug(message: unknown, ...details: unknown[]): void;
32
+ verbose(message: unknown, ...details: unknown[]): void;
33
+ fatal(message: unknown, ...details: unknown[]): void;
34
+ private write;
35
+ private path;
36
+ flush(): Promise<void>;
37
+ close(): Promise<void>;
38
+ }