@flusys/nestjs-shared 1.0.0-beta → 1.0.0-rc

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 (90) hide show
  1. package/README.md +56 -110
  2. package/cjs/classes/api-controller.class.js +9 -24
  3. package/cjs/classes/index.js +1 -0
  4. package/cjs/constants/index.js +14 -0
  5. package/cjs/constants/permissions.js +174 -0
  6. package/cjs/decorators/api-response.decorator.js +1 -1
  7. package/cjs/decorators/index.js +1 -0
  8. package/cjs/decorators/sanitize-html.decorator.js +36 -0
  9. package/cjs/dtos/filter-and-pagination.dto.js +24 -34
  10. package/cjs/dtos/pagination.dto.js +4 -8
  11. package/cjs/dtos/response-payload.dto.js +0 -41
  12. package/cjs/entities/identity.js +4 -4
  13. package/cjs/entities/user-root.js +13 -14
  14. package/cjs/guards/permission.guard.js +39 -94
  15. package/cjs/interceptors/index.js +1 -0
  16. package/cjs/interceptors/set-create-by-on-body.interceptor.js +2 -30
  17. package/cjs/interceptors/set-delete-by-on-body.interceptor.js +2 -30
  18. package/cjs/interceptors/set-update-by-on-body.interceptor.js +2 -30
  19. package/cjs/interceptors/set-user-field-on-body.interceptor.js +43 -0
  20. package/cjs/interceptors/slug.interceptor.js +30 -9
  21. package/cjs/interfaces/datasource.interface.js +4 -0
  22. package/cjs/interfaces/index.js +2 -1
  23. package/cjs/interfaces/module-config.interface.js +4 -0
  24. package/cjs/modules/cache/cache.module.js +3 -3
  25. package/cjs/modules/datasource/multi-tenant-datasource.service.js +30 -110
  26. package/cjs/modules/utils/utils.service.js +63 -145
  27. package/cjs/utils/error-handler.util.js +91 -13
  28. package/cjs/utils/html-sanitizer.util.js +74 -0
  29. package/cjs/utils/index.js +2 -0
  30. package/cjs/utils/query-helpers.util.js +53 -0
  31. package/classes/api-controller.class.d.ts +5 -5
  32. package/classes/api-service.class.d.ts +5 -5
  33. package/classes/index.d.ts +1 -0
  34. package/classes/request-scoped-api.service.d.ts +3 -2
  35. package/constants/index.d.ts +1 -0
  36. package/constants/permissions.d.ts +167 -0
  37. package/decorators/index.d.ts +1 -0
  38. package/decorators/sanitize-html.decorator.d.ts +2 -0
  39. package/dtos/filter-and-pagination.dto.d.ts +0 -2
  40. package/dtos/response-payload.dto.d.ts +0 -7
  41. package/fesm/classes/api-controller.class.js +9 -24
  42. package/fesm/classes/index.js +2 -0
  43. package/fesm/constants/index.js +2 -0
  44. package/fesm/constants/permissions.js +121 -0
  45. package/fesm/decorators/api-response.decorator.js +1 -1
  46. package/fesm/decorators/index.js +1 -0
  47. package/fesm/decorators/sanitize-html.decorator.js +45 -0
  48. package/fesm/dtos/filter-and-pagination.dto.js +26 -47
  49. package/fesm/dtos/pagination.dto.js +4 -8
  50. package/fesm/dtos/response-payload.dto.js +0 -38
  51. package/fesm/entities/identity.js +4 -4
  52. package/fesm/entities/user-root.js +13 -14
  53. package/fesm/guards/permission.guard.js +39 -94
  54. package/fesm/interceptors/index.js +1 -0
  55. package/fesm/interceptors/set-create-by-on-body.interceptor.js +4 -30
  56. package/fesm/interceptors/set-delete-by-on-body.interceptor.js +4 -30
  57. package/fesm/interceptors/set-update-by-on-body.interceptor.js +4 -30
  58. package/fesm/interceptors/set-user-field-on-body.interceptor.js +36 -0
  59. package/fesm/interceptors/slug.interceptor.js +31 -10
  60. package/fesm/interfaces/datasource.interface.js +20 -0
  61. package/fesm/interfaces/index.js +2 -1
  62. package/fesm/interfaces/module-config.interface.js +5 -0
  63. package/fesm/modules/cache/cache.module.js +2 -2
  64. package/fesm/modules/datasource/multi-tenant-datasource.service.js +30 -110
  65. package/fesm/modules/utils/utils.service.js +50 -143
  66. package/fesm/utils/error-handler.util.js +93 -14
  67. package/fesm/utils/html-sanitizer.util.js +82 -0
  68. package/fesm/utils/index.js +2 -0
  69. package/fesm/utils/query-helpers.util.js +78 -0
  70. package/interceptors/index.d.ts +1 -0
  71. package/interceptors/set-create-by-on-body.interceptor.d.ts +1 -5
  72. package/interceptors/set-delete-by-on-body.interceptor.d.ts +1 -5
  73. package/interceptors/set-update-by-on-body.interceptor.d.ts +1 -5
  74. package/interceptors/set-user-field-on-body.interceptor.d.ts +2 -0
  75. package/interceptors/slug.interceptor.d.ts +2 -1
  76. package/interfaces/api.interface.d.ts +2 -2
  77. package/interfaces/datasource.interface.d.ts +5 -0
  78. package/interfaces/identity.interface.d.ts +4 -4
  79. package/interfaces/index.d.ts +2 -1
  80. package/interfaces/module-config.interface.d.ts +6 -0
  81. package/interfaces/permission.interface.d.ts +0 -1
  82. package/modules/utils/utils.service.d.ts +10 -4
  83. package/package.json +4 -4
  84. package/utils/error-handler.util.d.ts +23 -13
  85. package/utils/html-sanitizer.util.d.ts +3 -0
  86. package/utils/index.d.ts +2 -0
  87. package/utils/query-helpers.util.d.ts +16 -0
  88. package/cjs/interfaces/base-query.interface.js +0 -6
  89. package/fesm/interfaces/base-query.interface.js +0 -3
  90. package/interfaces/base-query.interface.d.ts +0 -7
@@ -0,0 +1,6 @@
1
+ import { DatabaseMode } from '@flusys/nestjs-core';
2
+ export interface IModuleConfigService {
3
+ getDatabaseMode(): DatabaseMode;
4
+ isMultiTenant(): boolean;
5
+ isCompanyFeatureEnabled(): boolean;
6
+ }
@@ -11,7 +11,6 @@ export interface LegacyPermissionConfig {
11
11
  export type PermissionConfig = PermissionCondition | LegacyPermissionConfig | string[];
12
12
  export interface PermissionGuardConfig {
13
13
  enableCompanyFeature?: boolean;
14
- cacheKeyPrefix?: string;
15
14
  userPermissionKeyFormat?: string;
16
15
  companyPermissionKeyFormat?: string;
17
16
  }
@@ -1,6 +1,14 @@
1
- import { HybridCache } from '@flusys/nestjs-shared/classes';
1
+ import { HybridCache } from '../../classes/hybrid-cache.class';
2
+ export declare const DEFAULT_PHONE_REGEX: RegExp;
3
+ export declare const DEFAULT_PHONE_COUNTRY_CODE = "+88";
4
+ export interface PhoneValidationConfig {
5
+ regex: RegExp;
6
+ countryCode: string;
7
+ }
2
8
  export declare class UtilsService {
3
- constructor();
9
+ private readonly logger;
10
+ private phoneConfig;
11
+ setPhoneValidationConfig(config: PhoneValidationConfig): void;
4
12
  getCacheKey(entityName: string, params: any, entityId?: string, tenantId?: string): string;
5
13
  trackCacheKey(cacheKey: string, entityName: string, cacheManager: HybridCache, entityId?: string, tenantId?: string): Promise<void>;
6
14
  clearCache(entityName: string, cacheManager: HybridCache, entityId?: string, tenantId?: string): Promise<void>;
@@ -16,6 +24,4 @@ export declare class UtilsService {
16
24
  columnName: string;
17
25
  value: string;
18
26
  };
19
- getOtpEmailFormat(otp: number, userName?: string | null | undefined): string;
20
- getResetPasswordEmailFormat(resetLink: string, userName?: string | null | undefined): string;
21
27
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flusys/nestjs-shared",
3
- "version": "1.0.0-beta",
3
+ "version": "1.0.0-rc",
4
4
  "description": "Common shared utilities for Flusys NestJS applications",
5
5
  "main": "cjs/index.js",
6
6
  "module": "fesm/index.js",
@@ -88,7 +88,7 @@
88
88
  }
89
89
  },
90
90
  "peerDependencies": {
91
- "@keyv/redis": "^3.0.0",
91
+ "@keyv/redis": "^5.0.0",
92
92
  "@nestjs/common": "^10.0.0 || ^11.0.0",
93
93
  "@nestjs/config": "^3.0.0 || ^4.0.0",
94
94
  "@nestjs/core": "^10.0.0 || ^11.0.0",
@@ -96,7 +96,7 @@
96
96
  "@nestjs/passport": "^10.0.0 || ^11.0.0",
97
97
  "@nestjs/swagger": "^7.0.0 || ^11.0.0",
98
98
  "@nestjs/typeorm": "^10.0.0 || ^11.0.0",
99
- "cacheable": "^1.0.0",
99
+ "cacheable": "^2.0.0",
100
100
  "class-transformer": "^0.5.0",
101
101
  "class-validator": "^0.14.0",
102
102
  "keyv": "^5.0.0",
@@ -105,6 +105,6 @@
105
105
  "winston-daily-rotate-file": "^5.0.0"
106
106
  },
107
107
  "dependencies": {
108
- "@flusys/nestjs-core": "1.0.0-beta"
108
+ "@flusys/nestjs-core": "1.0.0-rc"
109
109
  }
110
110
  }
@@ -1,13 +1,27 @@
1
1
  import { Logger } from '@nestjs/common';
2
+ export interface IErrorContext {
3
+ operation?: string;
4
+ entity?: string;
5
+ userId?: string;
6
+ id?: string;
7
+ companyId?: string;
8
+ branchId?: string;
9
+ sectionId?: string;
10
+ data?: Record<string, unknown>;
11
+ }
12
+ export interface ISanitizedError {
13
+ message: string;
14
+ code?: string;
15
+ statusCode?: number;
16
+ stack?: string;
17
+ }
2
18
  export declare class ErrorHandler {
3
- static getErrorMessage(error: unknown): string;
4
- static getErrorStack(error: unknown): string | undefined;
5
- static createErrorContext(error: unknown, context?: {
6
- operation?: string;
7
- entity?: string;
8
- userId?: string;
9
- [key: string]: unknown;
10
- }): {
19
+ static getErrorMessage(error: unknown, sanitizeForClient?: boolean): string;
20
+ private static containsSensitiveData;
21
+ static getErrorStack(error: unknown, forClient?: boolean): string | undefined;
22
+ static createClientError(error: unknown, statusCode?: number, code?: string): ISanitizedError;
23
+ private static sanitizeContextForLogging;
24
+ static createErrorContext(error: unknown, context?: IErrorContext): {
11
25
  error: {
12
26
  message: string;
13
27
  stack?: string;
@@ -15,10 +29,6 @@ export declare class ErrorHandler {
15
29
  };
16
30
  context?: Record<string, unknown>;
17
31
  };
18
- static logError(logger: Logger, error: unknown, operation: string, context?: {
19
- entity?: string;
20
- userId?: string;
21
- [key: string]: unknown;
22
- }): void;
32
+ static logError(logger: Logger, error: unknown, operation: string, context?: Omit<IErrorContext, 'operation'>): void;
23
33
  static rethrowError(error: unknown): never;
24
34
  }
@@ -0,0 +1,3 @@
1
+ export declare function escapeHtml(str: string): string;
2
+ export declare function escapeHtmlVariables(variables: Record<string, unknown>): Record<string, string>;
3
+ export declare function containsHtmlContent(str: string): boolean;
package/utils/index.d.ts CHANGED
@@ -1 +1,3 @@
1
1
  export * from './error-handler.util';
2
+ export * from './html-sanitizer.util';
3
+ export * from './query-helpers.util';
@@ -0,0 +1,16 @@
1
+ import { ObjectLiteral, SelectQueryBuilder } from 'typeorm';
2
+ import { ILoggedUserInfo } from '../interfaces';
3
+ export interface ICompanyFilterConfig {
4
+ isCompanyFeatureEnabled: boolean;
5
+ entityAlias: string;
6
+ columnName?: string;
7
+ }
8
+ export declare function applyCompanyFilter<T extends ObjectLiteral>(query: SelectQueryBuilder<T>, config: ICompanyFilterConfig, user: ILoggedUserInfo | null | undefined): SelectQueryBuilder<T>;
9
+ export declare function buildCompanyWhereCondition<T extends Record<string, unknown>>(baseWhere: T, isCompanyFeatureEnabled: boolean, user: ILoggedUserInfo | null | undefined): T & {
10
+ companyId?: string;
11
+ };
12
+ export interface ICompanyEnabled {
13
+ companyId?: string | null;
14
+ }
15
+ export declare function hasCompanyId<T>(entity: T): entity is T & ICompanyEnabled;
16
+ export declare function validateCompanyOwnership<T>(entity: T, user: ILoggedUserInfo | null | undefined, isCompanyFeatureEnabled: boolean, entityName: string): void;
@@ -1,6 +0,0 @@
1
- /**
2
- * Base query DTO interface for list/search endpoints
3
- */ "use strict";
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
@@ -1,3 +0,0 @@
1
- /**
2
- * Base query DTO interface for list/search endpoints
3
- */ export { };
@@ -1,7 +0,0 @@
1
- export interface IBaseQueryDto {
2
- search?: string;
3
- sortBy?: string;
4
- sortOrder?: 'ASC' | 'DESC';
5
- page?: number;
6
- limit?: number;
7
- }