@bts-soft/core 1.2.8 → 1.3.8

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 (157) hide show
  1. package/dist/cache/src/index.d.ts +8 -0
  2. package/dist/cache/src/index.js +25 -0
  3. package/dist/cache/src/index.js.map +1 -0
  4. package/dist/cache/src/redis/config/redisConfig.service.d.ts +4 -0
  5. package/dist/cache/src/redis/config/redisConfig.service.js +33 -0
  6. package/dist/cache/src/redis/config/redisConfig.service.js.map +1 -0
  7. package/dist/cache/src/redis/constant/redis.constant.d.ts +2 -0
  8. package/dist/cache/src/redis/constant/redis.constant.js +5 -0
  9. package/dist/cache/src/redis/constant/redis.constant.js.map +1 -0
  10. package/dist/cache/src/redis/factory/redisClient.factory.d.ts +2 -0
  11. package/dist/cache/src/redis/factory/redisClient.factory.js +47 -0
  12. package/dist/cache/src/redis/factory/redisClient.factory.js.map +1 -0
  13. package/dist/cache/src/redis/interface/redis.interface.d.ts +111 -0
  14. package/dist/cache/src/redis/interface/redis.interface.js +3 -0
  15. package/dist/cache/src/redis/interface/redis.interface.js.map +1 -0
  16. package/dist/cache/src/redis/provider/redisService.provider.d.ts +2 -0
  17. package/dist/cache/src/redis/provider/redisService.provider.js +12 -0
  18. package/dist/cache/src/redis/provider/redisService.provider.js.map +1 -0
  19. package/dist/cache/src/redis/redis.health.d.ts +7 -0
  20. package/dist/cache/src/redis/redis.health.js +38 -0
  21. package/dist/cache/src/redis/redis.health.js.map +1 -0
  22. package/dist/cache/src/redis/redis.module.d.ts +2 -0
  23. package/dist/cache/src/redis/redis.module.js +39 -0
  24. package/dist/cache/src/redis/redis.module.js.map +1 -0
  25. package/dist/cache/src/redis/redis.service.d.ts +119 -0
  26. package/dist/cache/src/redis/redis.service.js +571 -0
  27. package/dist/cache/src/redis/redis.service.js.map +1 -0
  28. package/dist/core/src/index.d.ts +4 -0
  29. package/dist/core/src/index.js +21 -0
  30. package/dist/core/src/index.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.js +3 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/mail-queue/src/email.module.d.ts +2 -0
  35. package/dist/mail-queue/src/email.module.js +40 -0
  36. package/dist/mail-queue/src/email.module.js.map +1 -0
  37. package/dist/mail-queue/src/index.d.ts +8 -0
  38. package/dist/mail-queue/src/index.js +25 -0
  39. package/dist/mail-queue/src/index.js.map +1 -0
  40. package/dist/mail-queue/src/interfaces/IemailStrategy.interface.d.ts +3 -0
  41. package/dist/mail-queue/src/interfaces/IemailStrategy.interface.js +3 -0
  42. package/dist/mail-queue/src/interfaces/IemailStrategy.interface.js.map +1 -0
  43. package/dist/mail-queue/src/interfaces/iEmailObserver.interface.d.ts +4 -0
  44. package/dist/mail-queue/src/interfaces/iEmailObserver.interface.js +3 -0
  45. package/dist/mail-queue/src/interfaces/iEmailObserver.interface.js.map +1 -0
  46. package/dist/mail-queue/src/observer/email.observer.d.ts +5 -0
  47. package/dist/mail-queue/src/observer/email.observer.js +13 -0
  48. package/dist/mail-queue/src/observer/email.observer.js.map +1 -0
  49. package/dist/mail-queue/src/processor/email.processing.d.ts +8 -0
  50. package/dist/mail-queue/src/processor/email.processing.js +44 -0
  51. package/dist/mail-queue/src/processor/email.processing.js.map +1 -0
  52. package/dist/mail-queue/src/provider/mailer.provider.d.ts +5 -0
  53. package/dist/mail-queue/src/provider/mailer.provider.js +32 -0
  54. package/dist/mail-queue/src/provider/mailer.provider.js.map +1 -0
  55. package/dist/mail-queue/src/sendemail.service.d.ts +11 -0
  56. package/dist/mail-queue/src/sendemail.service.js +52 -0
  57. package/dist/mail-queue/src/sendemail.service.js.map +1 -0
  58. package/dist/mail-queue/src/strategy/email.strategy.d.ts +6 -0
  59. package/dist/mail-queue/src/strategy/email.strategy.js +18 -0
  60. package/dist/mail-queue/src/strategy/email.strategy.js.map +1 -0
  61. package/dist/tsconfig.tsbuildinfo +1 -1
  62. package/dist/upload/src/index.d.ts +19 -0
  63. package/dist/upload/src/index.js +36 -0
  64. package/dist/upload/src/index.js.map +1 -0
  65. package/dist/upload/src/upload/commands/deleteImage.command.d.ts +8 -0
  66. package/dist/upload/src/upload/commands/deleteImage.command.js +14 -0
  67. package/dist/upload/src/upload/commands/deleteImage.command.js.map +1 -0
  68. package/dist/upload/src/upload/commands/deleteVideo.command.d.ts +9 -0
  69. package/dist/upload/src/upload/commands/deleteVideo.command.js +15 -0
  70. package/dist/upload/src/upload/commands/deleteVideo.command.js.map +1 -0
  71. package/dist/upload/src/upload/commands/uploadImage.command.d.ts +9 -0
  72. package/dist/upload/src/upload/commands/uploadImage.command.js +15 -0
  73. package/dist/upload/src/upload/commands/uploadImage.command.js.map +1 -0
  74. package/dist/upload/src/upload/commands/uploadVideo.command.d.ts +9 -0
  75. package/dist/upload/src/upload/commands/uploadVideo.command.js +15 -0
  76. package/dist/upload/src/upload/commands/uploadVideo.command.js.map +1 -0
  77. package/dist/upload/src/upload/config/cloudinary.d.ts +6 -0
  78. package/dist/upload/src/upload/config/cloudinary.js +19 -0
  79. package/dist/upload/src/upload/config/cloudinary.js.map +1 -0
  80. package/dist/upload/src/upload/dtos/createImage.dto.d.ts +6 -0
  81. package/dist/upload/src/upload/dtos/createImage.dto.js +41 -0
  82. package/dist/upload/src/upload/dtos/createImage.dto.js.map +1 -0
  83. package/dist/upload/src/upload/dtos/createVideo.dto.d.ts +6 -0
  84. package/dist/upload/src/upload/dtos/createVideo.dto.js +40 -0
  85. package/dist/upload/src/upload/dtos/createVideo.dto.js.map +1 -0
  86. package/dist/upload/src/upload/dtos/fileUpload.d.ts +7 -0
  87. package/dist/upload/src/upload/dtos/fileUpload.js +3 -0
  88. package/dist/upload/src/upload/dtos/fileUpload.js.map +1 -0
  89. package/dist/upload/src/upload/factories/upload.factory.d.ts +4 -0
  90. package/dist/upload/src/upload/factories/upload.factory.js +11 -0
  91. package/dist/upload/src/upload/factories/upload.factory.js.map +1 -0
  92. package/dist/upload/src/upload/graphql/main.graphql.d.ts +2 -0
  93. package/dist/upload/src/upload/graphql/main.graphql.js +8 -0
  94. package/dist/upload/src/upload/graphql/main.graphql.js.map +1 -0
  95. package/dist/upload/src/upload/interfaces/IDaeleteStrategy.interface.d.ts +3 -0
  96. package/dist/upload/src/upload/interfaces/IDaeleteStrategy.interface.js +3 -0
  97. package/dist/upload/src/upload/interfaces/IDaeleteStrategy.interface.js.map +1 -0
  98. package/dist/upload/src/upload/interfaces/IUpload.interface.d.ts +3 -0
  99. package/dist/upload/src/upload/interfaces/IUpload.interface.js +3 -0
  100. package/dist/upload/src/upload/interfaces/IUpload.interface.js.map +1 -0
  101. package/dist/upload/src/upload/interfaces/IUploadCommand.interface.d.ts +3 -0
  102. package/dist/upload/src/upload/interfaces/IUploadCommand.interface.js +3 -0
  103. package/dist/upload/src/upload/interfaces/IUploadCommand.interface.js.map +1 -0
  104. package/dist/upload/src/upload/interfaces/IUploadObserver.interface.d.ts +6 -0
  105. package/dist/upload/src/upload/interfaces/IUploadObserver.interface.js +3 -0
  106. package/dist/upload/src/upload/interfaces/IUploadObserver.interface.js.map +1 -0
  107. package/dist/upload/src/upload/observer/upload.observer.d.ts +7 -0
  108. package/dist/upload/src/upload/observer/upload.observer.js +19 -0
  109. package/dist/upload/src/upload/observer/upload.observer.js.map +1 -0
  110. package/dist/upload/src/upload/rest.controller.d.ts +13 -0
  111. package/dist/upload/src/upload/rest.controller.js +94 -0
  112. package/dist/upload/src/upload/rest.controller.js.map +1 -0
  113. package/dist/upload/src/upload/strategies/delete.strategy.d.ts +6 -0
  114. package/dist/upload/src/upload/strategies/delete.strategy.js +15 -0
  115. package/dist/upload/src/upload/strategies/delete.strategy.js.map +1 -0
  116. package/dist/upload/src/upload/strategies/upload.strategy.d.ts +6 -0
  117. package/dist/upload/src/upload/strategies/upload.strategy.js +21 -0
  118. package/dist/upload/src/upload/strategies/upload.strategy.js.map +1 -0
  119. package/dist/upload/src/upload/upload.module.d.ts +2 -0
  120. package/dist/upload/src/upload/upload.module.js +21 -0
  121. package/dist/upload/src/upload/upload.module.js.map +1 -0
  122. package/dist/upload/src/upload/upload.service.d.ts +27 -0
  123. package/dist/upload/src/upload/upload.service.js +161 -0
  124. package/dist/upload/src/upload/upload.service.js.map +1 -0
  125. package/dist/validation/src/decorators/CapitalField.decorator.d.ts +1 -0
  126. package/dist/validation/src/decorators/CapitalField.decorator.js +23 -0
  127. package/dist/validation/src/decorators/CapitalField.decorator.js.map +1 -0
  128. package/dist/validation/src/decorators/EmailField.decorator.d.ts +1 -0
  129. package/dist/validation/src/decorators/EmailField.decorator.js +17 -0
  130. package/dist/validation/src/decorators/EmailField.decorator.js.map +1 -0
  131. package/dist/validation/src/decorators/IdValidate.decorator.d.ts +1 -0
  132. package/dist/validation/src/decorators/IdValidate.decorator.js +19 -0
  133. package/dist/validation/src/decorators/IdValidate.decorator.js.map +1 -0
  134. package/dist/validation/src/decorators/PasswordField.decorator.d.ts +2 -0
  135. package/dist/validation/src/decorators/PasswordField.decorator.js +20 -0
  136. package/dist/validation/src/decorators/PasswordField.decorator.js.map +1 -0
  137. package/dist/validation/src/decorators/PhoneField.decorator.d.ts +3 -0
  138. package/dist/validation/src/decorators/PhoneField.decorator.js +21 -0
  139. package/dist/validation/src/decorators/PhoneField.decorator.js.map +1 -0
  140. package/dist/validation/src/decorators/TextField.decorator.d.ts +1 -0
  141. package/dist/validation/src/decorators/TextField.decorator.js +23 -0
  142. package/dist/validation/src/decorators/TextField.decorator.js.map +1 -0
  143. package/dist/validation/src/decorators/nationalId.decorator.d.ts +2 -0
  144. package/dist/validation/src/decorators/nationalId.decorator.js +24 -0
  145. package/dist/validation/src/decorators/nationalId.decorator.js.map +1 -0
  146. package/dist/validation/src/index.d.ts +10 -0
  147. package/dist/validation/src/index.js +27 -0
  148. package/dist/validation/src/index.js.map +1 -0
  149. package/dist/validation/src/regex/SQL_INJECTION_REGEX.d.ts +1 -0
  150. package/dist/validation/src/regex/SQL_INJECTION_REGEX.js +5 -0
  151. package/dist/validation/src/regex/SQL_INJECTION_REGEX.js.map +1 -0
  152. package/dist/validation/src/utility/WordsTransform.decorator.d.ts +2 -0
  153. package/dist/validation/src/utility/WordsTransform.decorator.js +19 -0
  154. package/dist/validation/src/utility/WordsTransform.decorator.js.map +1 -0
  155. package/package.json +10 -3
  156. package/src/index.ts +7 -1
  157. package/tsconfig.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.strategy.js","sourceRoot":"","sources":["../../../../../../upload/src/upload/strategies/delete.strategy.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAwB;IACnC,YAAoB,UAAe;QAAf,eAAU,GAAV,UAAU,CAAK;IAAG,CAAC;IAEvC,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,eAAuB,OAAO;QAC3D,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE;YAChD,aAAa,EAAE,YAAY;SAC5B,CAAC,CAAC;IACL,CAAC;CACF;AARD,4DAQC"}
@@ -0,0 +1,6 @@
1
+ import { IUploadStrategy } from '../interfaces/IUpload.interface';
2
+ export declare class CloudinaryUploadStrategy implements IUploadStrategy {
3
+ private cloudinary;
4
+ constructor(cloudinary: any);
5
+ upload(stream: any, options: any): Promise<any>;
6
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CloudinaryUploadStrategy = void 0;
4
+ class CloudinaryUploadStrategy {
5
+ constructor(cloudinary) {
6
+ this.cloudinary = cloudinary;
7
+ }
8
+ async upload(stream, options) {
9
+ return new Promise((resolve, reject) => {
10
+ const uploadStream = this.cloudinary.uploader.upload_stream(options, (error, result) => {
11
+ if (error)
12
+ reject(error);
13
+ else
14
+ resolve(result);
15
+ });
16
+ stream.pipe(uploadStream);
17
+ });
18
+ }
19
+ }
20
+ exports.CloudinaryUploadStrategy = CloudinaryUploadStrategy;
21
+ //# sourceMappingURL=upload.strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.strategy.js","sourceRoot":"","sources":["../../../../../../upload/src/upload/strategies/upload.strategy.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAwB;IACnC,YAAoB,UAAe;QAAf,eAAU,GAAV,UAAU,CAAK;IAAG,CAAC;IAEvC,KAAK,CAAC,MAAM,CAAC,MAAW,EAAE,OAAY;QACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CACzD,OAAO,EACP,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChB,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;oBACpB,OAAO,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAfD,4DAeC"}
@@ -0,0 +1,2 @@
1
+ export declare class UploadModule {
2
+ }
@@ -0,0 +1,21 @@
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.UploadModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const upload_service_1 = require("./upload.service");
12
+ let UploadModule = class UploadModule {
13
+ };
14
+ exports.UploadModule = UploadModule;
15
+ exports.UploadModule = UploadModule = __decorate([
16
+ (0, common_1.Module)({
17
+ providers: [upload_service_1.UploadService],
18
+ exports: [upload_service_1.UploadService],
19
+ })
20
+ ], UploadModule);
21
+ //# sourceMappingURL=upload.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.module.js","sourceRoot":"","sources":["../../../../../upload/src/upload/upload.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,qDAAiD;AAU1C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAJxB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,27 @@
1
+ import { ConfigService } from '@nestjs/config';
2
+ import Stream from 'stream';
3
+ import { CreateImageDto } from './dtos/createImage.dto';
4
+ import { CreateVideoDto } from './dtos/createVideo.dto';
5
+ export interface UploadFile {
6
+ stream: Stream;
7
+ filename: string;
8
+ }
9
+ export declare class UploadService {
10
+ private configService;
11
+ private readonly cloudinary;
12
+ private uploadStrategy;
13
+ private deleteStrategy;
14
+ private observers;
15
+ constructor(configService: ConfigService);
16
+ private notifyUploadSuccess;
17
+ private notifyUploadError;
18
+ private notifyDeleteSuccess;
19
+ private notifyDeleteError;
20
+ uploadImageCore(fileData: UploadFile, dirUpload?: string): Promise<string>;
21
+ uploadVideoCore(fileData: UploadFile, dirUpload?: string): Promise<string>;
22
+ uploadImage(createImageInput: CreateImageDto, dirUpload?: string): Promise<string>;
23
+ uploadVideo(createVideoInput: CreateVideoDto, dirUpload?: string): Promise<string>;
24
+ deleteImage(imageUrl: string): Promise<void>;
25
+ deleteVideo(videoUrl: string): Promise<void>;
26
+ private getVideoDuration;
27
+ }
@@ -0,0 +1,161 @@
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.UploadService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const config_1 = require("@nestjs/config");
15
+ const upload_factory_1 = require("./factories/upload.factory");
16
+ const upload_strategy_1 = require("./strategies/upload.strategy");
17
+ const delete_strategy_1 = require("./strategies/delete.strategy");
18
+ const uploadImage_command_1 = require("./commands/uploadImage.command");
19
+ const deleteImage_command_1 = require("./commands/deleteImage.command");
20
+ const deleteVideo_command_1 = require("./commands/deleteVideo.command");
21
+ const uploadVideo_command_1 = require("./commands/uploadVideo.command");
22
+ const upload_observer_1 = require("./observer/upload.observer");
23
+ let UploadService = class UploadService {
24
+ constructor(configService) {
25
+ this.configService = configService;
26
+ this.observers = [];
27
+ this.cloudinary = upload_factory_1.UploadServiceFactory.create(this.configService);
28
+ this.uploadStrategy = new upload_strategy_1.CloudinaryUploadStrategy(this.cloudinary);
29
+ this.deleteStrategy = new delete_strategy_1.CloudinaryDeleteStrategy(this.cloudinary);
30
+ this.observers.push(new upload_observer_1.LoggingObserver());
31
+ }
32
+ notifyUploadSuccess(result) {
33
+ this.observers.forEach((observer) => observer.onUploadSuccess(result));
34
+ }
35
+ notifyUploadError(error) {
36
+ this.observers.forEach((observer) => observer.onUploadError(error));
37
+ }
38
+ notifyDeleteSuccess(result) {
39
+ this.observers.forEach((observer) => observer.onDeleteSuccess(result));
40
+ }
41
+ notifyDeleteError(error) {
42
+ this.observers.forEach((observer) => observer.onDeleteError(error));
43
+ }
44
+ async uploadImageCore(fileData, dirUpload = 'avatars') {
45
+ const { stream, filename } = fileData;
46
+ const options = {
47
+ folder: dirUpload,
48
+ public_id: `${Date.now()}-${filename}`,
49
+ resource_type: 'auto',
50
+ };
51
+ const command = new uploadImage_command_1.UploadImageCommand(this.uploadStrategy, stream, options);
52
+ try {
53
+ const result = await command.execute();
54
+ if (!result?.secure_url) {
55
+ throw new common_1.HttpException('Cloudinary response invalid', common_1.HttpStatus.BAD_REQUEST);
56
+ }
57
+ this.notifyUploadSuccess(result);
58
+ return result.secure_url;
59
+ }
60
+ catch (error) {
61
+ this.notifyUploadError(error);
62
+ throw new common_1.HttpException('Upload failed', common_1.HttpStatus.BAD_REQUEST);
63
+ }
64
+ }
65
+ async uploadVideoCore(fileData, dirUpload = 'videos') {
66
+ const { stream, filename } = fileData;
67
+ const duration = await this.getVideoDuration(stream);
68
+ if (duration > 60) {
69
+ throw new common_1.HttpException('Video must be 1 minute or less', common_1.HttpStatus.BAD_REQUEST);
70
+ }
71
+ const options = {
72
+ folder: dirUpload,
73
+ public_id: `${Date.now()}-${filename.split('.')[0]}`,
74
+ resource_type: 'video',
75
+ chunk_size: 6000000,
76
+ };
77
+ const command = new uploadVideo_command_1.UploadVideoCommand(this.uploadStrategy, stream, options);
78
+ try {
79
+ const result = await command.execute();
80
+ if (!result?.secure_url) {
81
+ throw new common_1.HttpException('Cloudinary response invalid', common_1.HttpStatus.BAD_REQUEST);
82
+ }
83
+ this.notifyUploadSuccess(result);
84
+ return result.secure_url;
85
+ }
86
+ catch (error) {
87
+ this.notifyUploadError(error);
88
+ throw new common_1.HttpException('Video upload failed', common_1.HttpStatus.BAD_REQUEST);
89
+ }
90
+ }
91
+ async uploadImage(createImageInput, dirUpload = 'avatars') {
92
+ if (!createImageInput.image)
93
+ return null;
94
+ const uploadedFile = await createImageInput.image;
95
+ if (!uploadedFile || !uploadedFile.createReadStream) {
96
+ throw new common_1.HttpException('Invalid image file', common_1.HttpStatus.BAD_REQUEST);
97
+ }
98
+ const { createReadStream, filename } = uploadedFile;
99
+ const stream = createReadStream();
100
+ return this.uploadImageCore({ stream, filename }, dirUpload);
101
+ }
102
+ async uploadVideo(createVideoInput, dirUpload = 'videos') {
103
+ if (!createVideoInput.video) {
104
+ throw new common_1.HttpException('Video file is required', common_1.HttpStatus.BAD_REQUEST);
105
+ }
106
+ const uploadedFile = await createVideoInput.video;
107
+ if (!uploadedFile || !uploadedFile.createReadStream) {
108
+ throw new common_1.HttpException('Invalid video file', common_1.HttpStatus.BAD_REQUEST);
109
+ }
110
+ const { createReadStream, filename } = uploadedFile;
111
+ const stream = createReadStream();
112
+ return this.uploadVideoCore({ stream, filename }, dirUpload);
113
+ }
114
+ async deleteImage(imageUrl) {
115
+ const publicId = imageUrl?.split('/').pop()?.split('.')[0];
116
+ if (!publicId) {
117
+ throw new common_1.HttpException('Invalid image URL', common_1.HttpStatus.BAD_REQUEST);
118
+ }
119
+ const command = new deleteImage_command_1.DeleteImageCommand(this.deleteStrategy, publicId);
120
+ try {
121
+ const result = await command.execute();
122
+ if (result.result !== 'ok' && result.result !== 'not found') {
123
+ throw new common_1.HttpException(`Failed to delete image. Reason: ${result.result}`, common_1.HttpStatus.BAD_REQUEST);
124
+ }
125
+ this.notifyDeleteSuccess(result);
126
+ }
127
+ catch (error) {
128
+ this.notifyDeleteError(error);
129
+ throw new common_1.HttpException('Delete failed', common_1.HttpStatus.BAD_REQUEST);
130
+ }
131
+ }
132
+ async deleteVideo(videoUrl) {
133
+ const publicId = videoUrl?.split('/').pop()?.split('.')[0];
134
+ if (!publicId) {
135
+ throw new common_1.HttpException('Invalid video URL', common_1.HttpStatus.BAD_REQUEST);
136
+ }
137
+ const command = new deleteVideo_command_1.DeleteVideoCommand(this.deleteStrategy, publicId, 'video');
138
+ try {
139
+ const result = await command.execute();
140
+ if (result.result !== 'ok' && result.result !== 'not found') {
141
+ throw new common_1.HttpException(`Failed to delete video. Reason: ${result.result}`, common_1.HttpStatus.BAD_REQUEST);
142
+ }
143
+ this.notifyDeleteSuccess(result);
144
+ }
145
+ catch (error) {
146
+ this.notifyDeleteError(error);
147
+ throw new common_1.HttpException('Video delete failed', common_1.HttpStatus.BAD_REQUEST);
148
+ }
149
+ }
150
+ async getVideoDuration(stream) {
151
+ return new Promise((resolve, reject) => {
152
+ resolve(60);
153
+ });
154
+ }
155
+ };
156
+ exports.UploadService = UploadService;
157
+ exports.UploadService = UploadService = __decorate([
158
+ (0, common_1.Injectable)(),
159
+ __metadata("design:paramtypes", [config_1.ConfigService])
160
+ ], UploadService);
161
+ //# sourceMappingURL=upload.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.service.js","sourceRoot":"","sources":["../../../../../upload/src/upload/upload.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function CapitalTextField(text: string, min?: number, max?: number, nullable?: boolean, isGraphql?: boolean): PropertyDecorator;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CapitalTextField = CapitalTextField;
4
+ const common_1 = require("@nestjs/common");
5
+ const graphql_1 = require("@nestjs/graphql");
6
+ const class_validator_1 = require("class-validator");
7
+ const class_transformer_1 = require("class-transformer");
8
+ const WordsTransform_decorator_1 = require("../utility/WordsTransform.decorator");
9
+ const SQL_INJECTION_REGEX_1 = require("../regex/SQL_INJECTION_REGEX");
10
+ function CapitalTextField(text, min = 1, max = 255, nullable = false, isGraphql = true) {
11
+ const message = `${text} must be between ${min} and ${max} characters`;
12
+ const graphQLDecorators = isGraphql
13
+ ? [(0, graphql_1.Field)(() => String, { nullable })]
14
+ : [];
15
+ return (0, common_1.applyDecorators)(...graphQLDecorators, (0, class_validator_1.IsOptional)(), (0, class_validator_1.IsString)({ message }), (0, class_validator_1.Matches)(/^[A-Za-z\s]+$/, {
16
+ message: `${text} must contain only letters (no numbers or symbols)`,
17
+ }), (0, class_validator_1.Length)(min, max, {
18
+ message,
19
+ }), (0, class_validator_1.Matches)(SQL_INJECTION_REGEX_1.SQL_INJECTION_REGEX, {
20
+ message: `${text} contains forbidden SQL keywords or patterns`,
21
+ }), (0, class_transformer_1.Transform)(({ value }) => (0, WordsTransform_decorator_1.CapitalizeWords)(value)));
22
+ }
23
+ //# sourceMappingURL=CapitalField.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CapitalField.decorator.js","sourceRoot":"","sources":["../../../../../validation/src/decorators/CapitalField.decorator.ts"],"names":[],"mappings":";;AAoBA,4CAoCC;AAxDD,2CAAiD;AACjD,6CAAwC;AACxC,qDAAwE;AACxE,yDAA8C;AAE9C,kFAAsE;AACtE,sEAAmE;AAcnE,SAAgB,gBAAgB,CAC9B,IAAY,EACZ,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,GAAG,EACT,WAAoB,KAAK,EACzB,YAAqB,IAAI;IAEzB,MAAM,OAAO,GAAG,GAAG,IAAI,oBAAoB,GAAG,QAAQ,GAAG,aAAa,CAAC;IAGvE,MAAM,iBAAiB,GAAG,SAAS;QACjC,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,IAAA,wBAAe,EAEpB,GAAG,iBAAiB,EAGpB,IAAA,4BAAU,GAAE,EACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,CAAC,EACrB,IAAA,yBAAO,EAAC,eAAe,EAAE;QACvB,OAAO,EAAE,GAAG,IAAI,oDAAoD;KACrE,CAAC,EACF,IAAA,wBAAM,EAAC,GAAG,EAAE,GAAG,EAAE;QACf,OAAO;KACR,CAAC,EACF,IAAA,yBAAO,EACL,yCAAmB,EACnB;QACE,OAAO,EAAE,GAAG,IAAI,8CAA8C;KAC/D,CACF,EAED,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAA,0CAAe,EAAC,KAAK,CAAC,CAAC,CACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function EmailField(nullable?: boolean, isGraphql?: boolean): PropertyDecorator;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmailField = EmailField;
4
+ const common_1 = require("@nestjs/common");
5
+ const graphql_1 = require("@nestjs/graphql");
6
+ const class_transformer_1 = require("class-transformer");
7
+ const class_validator_1 = require("class-validator");
8
+ const SQL_INJECTION_REGEX_1 = require("../regex/SQL_INJECTION_REGEX");
9
+ function EmailField(nullable = false, isGraphql = true) {
10
+ const graphQLDecorators = isGraphql
11
+ ? [(0, graphql_1.Field)(() => String, { nullable })]
12
+ : [];
13
+ return (0, common_1.applyDecorators)(...graphQLDecorators, (0, class_validator_1.IsOptional)(), (0, class_validator_1.IsEmail)({}, { message: 'Must be a valid email address' }), (0, class_validator_1.Matches)(SQL_INJECTION_REGEX_1.SQL_INJECTION_REGEX, {
14
+ message: 'Email contains forbidden SQL keywords or patterns',
15
+ }), (0, class_transformer_1.Transform)(({ value }) => value?.toLowerCase()));
16
+ }
17
+ //# sourceMappingURL=EmailField.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailField.decorator.js","sourceRoot":"","sources":["../../../../../validation/src/decorators/EmailField.decorator.ts"],"names":[],"mappings":";;AAmBA,gCA8BC;AAjDD,2CAAiD;AACjD,6CAAwC;AACxC,yDAA8C;AAC9C,qDAIyB;AACzB,sEAAmE;AAWnE,SAAgB,UAAU,CACxB,WAAoB,KAAK,EACzB,YAAqB,IAAI;IAIzB,MAAM,iBAAiB,GAAG,SAAS;QACjC,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,IAAA,wBAAe,EAEpB,GAAG,iBAAiB,EAGpB,IAAA,4BAAU,GAAE,EAEZ,IAAA,yBAAO,EAAC,EAAE,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,EAGzD,IAAA,yBAAO,EACL,yCAAmB,EACnB;QACE,OAAO,EAAE,mDAAmD;KAC7D,CACF,EAGD,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function IdField(id: string, length?: number, nullable?: boolean, isGraphql?: boolean): PropertyDecorator;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IdField = IdField;
4
+ const common_1 = require("@nestjs/common");
5
+ const graphql_1 = require("@nestjs/graphql");
6
+ const class_validator_1 = require("class-validator");
7
+ const SQL_INJECTION_REGEX_1 = require("../regex/SQL_INJECTION_REGEX");
8
+ function IdField(id, length = 26, nullable = false, isGraphql = true) {
9
+ const message = `${id} ID must be exactly ${length} characters`;
10
+ const graphQLDecorators = isGraphql
11
+ ? [(0, graphql_1.Field)(() => String, { nullable })]
12
+ : [];
13
+ return (0, common_1.applyDecorators)(...graphQLDecorators, (0, class_validator_1.IsOptional)(), (0, class_validator_1.IsString)({ message }), (0, class_validator_1.Length)(length, length, {
14
+ message,
15
+ }), (0, class_validator_1.Matches)(SQL_INJECTION_REGEX_1.SQL_INJECTION_REGEX, {
16
+ message: `${id} Id contains forbidden SQL keywords or patterns`,
17
+ }));
18
+ }
19
+ //# sourceMappingURL=IdValidate.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdValidate.decorator.js","sourceRoot":"","sources":["../../../../../validation/src/decorators/IdValidate.decorator.ts"],"names":[],"mappings":";;AAcA,0BAmCC;AAjDD,2CAAiD;AACjD,6CAAwC;AACxC,qDAAwE;AACxE,sEAAmE;AAWnE,SAAgB,OAAO,CACrB,EAAU,EACV,SAAiB,EAAE,EACnB,WAAoB,KAAK,EACzB,YAAqB,IAAI;IAEzB,MAAM,OAAO,GAAG,GAAG,EAAE,uBAAuB,MAAM,aAAa,CAAC;IAGhE,MAAM,iBAAiB,GAAG,SAAS;QACjC,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,EAAE,CAAC;IAGP,OAAO,IAAA,wBAAe,EAEpB,GAAG,iBAAiB,EAGpB,IAAA,4BAAU,GAAE,EACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,CAAC,EAGrB,IAAA,wBAAM,EAAC,MAAM,EAAE,MAAM,EAAE;QACrB,OAAO;KACR,CAAC,EAGF,IAAA,yBAAO,EACL,yCAAmB,EACnB;QACE,OAAO,EAAE,GAAG,EAAE,iDAAiD;KAChE,CACF,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function password(message?: string): PropertyDecorator;
2
+ export declare function PasswordField(min?: number, max?: number, nullable?: boolean, isGraphql?: boolean): PropertyDecorator;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.password = password;
4
+ exports.PasswordField = PasswordField;
5
+ const class_validator_1 = require("class-validator");
6
+ const common_1 = require("@nestjs/common");
7
+ const graphql_1 = require("@nestjs/graphql");
8
+ const SQL_INJECTION_REGEX_1 = require("../regex/SQL_INJECTION_REGEX");
9
+ function password(message = 'Password must contain uppercase, lowercase, number and special character') {
10
+ return (0, class_validator_1.Matches)(/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_])/, { message });
11
+ }
12
+ function PasswordField(min = 8, max = 16, nullable = false, isGraphql = true) {
13
+ const graphQLDecorators = isGraphql
14
+ ? [(0, graphql_1.Field)(() => String, { nullable })]
15
+ : [];
16
+ return (0, common_1.applyDecorators)(...graphQLDecorators, (0, class_validator_1.IsString)(), (0, class_validator_1.Length)(min, max, { message: `Password must be between ${min} and ${max} characters` }), password(), (0, class_validator_1.Matches)(SQL_INJECTION_REGEX_1.SQL_INJECTION_REGEX, {
17
+ message: 'Password contains forbidden SQL keywords or patterns',
18
+ }));
19
+ }
20
+ //# sourceMappingURL=PasswordField.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordField.decorator.js","sourceRoot":"","sources":["../../../../../validation/src/decorators/PasswordField.decorator.ts"],"names":[],"mappings":";;AAWA,4BAKC;AAWD,sCA4BC;AAvDD,qDAA4D;AAC5D,2CAAiD;AACjD,6CAAwC;AACxC,sEAAmE;AAQnE,SAAgB,QAAQ,CACtB,OAAO,GAAG,0EAA0E;IAGpF,OAAO,IAAA,yBAAO,EAAC,2CAA2C,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3E,CAAC;AAWD,SAAgB,aAAa,CACzB,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,EAAE,EACR,WAAoB,KAAK,EACzB,YAAqB,IAAI;IAI3B,MAAM,iBAAiB,GAAG,SAAS;QACjC,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,IAAA,wBAAe,EAEpB,GAAG,iBAAiB,EAGpB,IAAA,0BAAQ,GAAE,EACV,IAAA,wBAAM,EAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,4BAA4B,GAAG,QAAQ,GAAG,aAAa,EAAE,CAAC,EACtF,QAAQ,EAAE,EAEV,IAAA,yBAAO,EACH,yCAAmB,EACnB;QACK,OAAO,EAAE,sDAAsD;KACnE,CACJ,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CountryCode } from 'libphonenumber-js';
2
+ export declare function ValidatePhoneNumber(): PropertyDecorator;
3
+ export declare function PhoneField(format?: CountryCode, nullable?: boolean, isGraphql?: boolean): PropertyDecorator;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidatePhoneNumber = ValidatePhoneNumber;
4
+ exports.PhoneField = PhoneField;
5
+ const common_1 = require("@nestjs/common");
6
+ const graphql_1 = require("@nestjs/graphql");
7
+ const class_validator_1 = require("class-validator");
8
+ const class_transformer_1 = require("class-transformer");
9
+ const SQL_INJECTION_REGEX_1 = require("../regex/SQL_INJECTION_REGEX");
10
+ function ValidatePhoneNumber() {
11
+ return (0, class_transformer_1.Transform)(({ value }) => typeof value === 'string' ? value.replace(/[^\d+]/g, '') : value);
12
+ }
13
+ function PhoneField(format = 'EG', nullable = false, isGraphql = true) {
14
+ const graphQLDecorators = isGraphql ? [(0, graphql_1.Field)(() => String, { nullable })] : [];
15
+ return (0, common_1.applyDecorators)(...graphQLDecorators, (0, class_validator_1.IsOptional)(), (0, class_transformer_1.Transform)(({ value }) => typeof value === 'string' ? value.replace(/[^\d+]/g, '') : value), (0, class_validator_1.Matches)(SQL_INJECTION_REGEX_1.SQL_INJECTION_REGEX, {
16
+ message: 'Phone contains forbidden SQL keywords or patterns',
17
+ }), (0, class_validator_1.IsPhoneNumber)(format, {
18
+ message: `Phone number must be a valid ${format} number`,
19
+ }));
20
+ }
21
+ //# sourceMappingURL=PhoneField.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhoneField.decorator.js","sourceRoot":"","sources":["../../../../../validation/src/decorators/PhoneField.decorator.ts"],"names":[],"mappings":";;AAUA,kDAIC;AAWD,gCAwBC;AAjDD,2CAAiD;AACjD,6CAAwC;AACxC,qDAAqE;AACrE,yDAA8C;AAC9C,sEAAmE;AAMnE,SAAgB,mBAAmB;IACjC,OAAO,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAC7B,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CACjE,CAAC;AACJ,CAAC;AAWD,SAAgB,UAAU,CACxB,SAAsB,IAAI,EAC1B,WAAoB,KAAK,EACzB,YAAqB,IAAI;IAEzB,MAAM,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/E,OAAO,IAAA,wBAAe,EACpB,GAAG,iBAAiB,EAEpB,IAAA,4BAAU,GAAE,EAEZ,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACtB,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CACjE,EAED,IAAA,yBAAO,EAAC,yCAAmB,EAAE;QAC3B,OAAO,EAAE,mDAAmD;KAC7D,CAAC,EAEF,IAAA,+BAAa,EAAC,MAAM,EAAE;QACpB,OAAO,EAAE,gCAAgC,MAAM,SAAS;KACzD,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function TextField(text: string, min?: number, max?: number, nullable?: boolean, isGraphql?: boolean): PropertyDecorator;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TextField = TextField;
4
+ const common_1 = require("@nestjs/common");
5
+ const graphql_1 = require("@nestjs/graphql");
6
+ const class_validator_1 = require("class-validator");
7
+ const class_transformer_1 = require("class-transformer");
8
+ const WordsTransform_decorator_1 = require("../utility/WordsTransform.decorator");
9
+ const SQL_INJECTION_REGEX_1 = require("../regex/SQL_INJECTION_REGEX");
10
+ function TextField(text, min = 1, max = 255, nullable = false, isGraphql = true) {
11
+ const message = `${text} must be between ${min} and ${max} characters`;
12
+ const graphQLDecorators = isGraphql
13
+ ? [(0, graphql_1.Field)(() => String, { nullable })]
14
+ : [];
15
+ return (0, common_1.applyDecorators)(...graphQLDecorators, (0, class_validator_1.IsOptional)(), (0, class_validator_1.IsString)({ message }), (0, class_validator_1.Matches)(/^[A-Za-z0-9\s.,-]+$/, {
16
+ message: `${text} must contain only letters, numbers, spaces, or basic symbols (.,-)`,
17
+ }), (0, class_validator_1.Length)(min, max, {
18
+ message,
19
+ }), (0, class_validator_1.Matches)(SQL_INJECTION_REGEX_1.SQL_INJECTION_REGEX, {
20
+ message: `${text} contains forbidden SQL keywords or patterns`,
21
+ }), (0, class_transformer_1.Transform)(({ value }) => (0, WordsTransform_decorator_1.LowwerWords)(value)));
22
+ }
23
+ //# sourceMappingURL=TextField.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextField.decorator.js","sourceRoot":"","sources":["../../../../../validation/src/decorators/TextField.decorator.ts"],"names":[],"mappings":";;AAkBA,8BAoCC;AAtDD,2CAAiD;AACjD,6CAAwC;AACxC,qDAAwE;AACxE,yDAA8C;AAE9C,kFAAkE;AAClE,sEAAmE;AAYnE,SAAgB,SAAS,CACvB,IAAY,EACZ,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,GAAG,EACT,WAAoB,KAAK,EACzB,YAAqB,IAAI;IAEzB,MAAM,OAAO,GAAG,GAAG,IAAI,oBAAoB,GAAG,QAAQ,GAAG,aAAa,CAAC;IAGvE,MAAM,iBAAiB,GAAG,SAAS;QACjC,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,IAAA,wBAAe,EAEpB,GAAG,iBAAiB,EAGpB,IAAA,4BAAU,GAAE,EACZ,IAAA,0BAAQ,EAAC,EAAE,OAAO,EAAE,CAAC,EACrB,IAAA,yBAAO,EAAC,qBAAqB,EAAE;QAC7B,OAAO,EAAE,GAAG,IAAI,qEAAqE;KACtF,CAAC,EACF,IAAA,wBAAM,EAAC,GAAG,EAAE,GAAG,EAAE;QACf,OAAO;KACR,CAAC,EACF,IAAA,yBAAO,EACL,yCAAmB,EACnB;QACE,OAAO,EAAE,GAAG,IAAI,8CAA8C;KAC/D,CACF,EAED,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAA,sCAAW,EAAC,KAAK,CAAC,CAAC,CAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function ValidateNationalId(): PropertyDecorator;
2
+ export declare function NationalIdField(nullable?: boolean, isGraphql?: boolean): PropertyDecorator;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidateNationalId = ValidateNationalId;
4
+ exports.NationalIdField = NationalIdField;
5
+ const common_1 = require("@nestjs/common");
6
+ const graphql_1 = require("@nestjs/graphql");
7
+ const class_validator_1 = require("class-validator");
8
+ const class_transformer_1 = require("class-transformer");
9
+ function ValidateNationalId() {
10
+ return (0, class_transformer_1.Transform)(({ value }) => typeof value === 'string' ? value.replace(/\D/g, '') : value);
11
+ }
12
+ function NationalIdField(nullable = false, isGraphql = true) {
13
+ const graphQLDecorators = isGraphql
14
+ ? [(0, graphql_1.Field)(() => String, { nullable })]
15
+ : [];
16
+ return (0, common_1.applyDecorators)(...graphQLDecorators, (0, class_validator_1.IsOptional)(), (0, class_transformer_1.Transform)(({ value }) => typeof value === 'string' ? value.replace(/\D/g, '') : value), (0, class_validator_1.Matches)(/^\d{14}$/, {
17
+ message: 'National ID must contain exactly 14 digits',
18
+ }), (0, class_validator_1.Matches)(/^[23]\d{13}$/, {
19
+ message: 'National ID must start with 2 or 3',
20
+ }), (0, class_validator_1.Length)(14, 14, {
21
+ message: 'National ID must be exactly 14 digits',
22
+ }));
23
+ }
24
+ //# sourceMappingURL=nationalId.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nationalId.decorator.js","sourceRoot":"","sources":["../../../../../validation/src/decorators/nationalId.decorator.ts"],"names":[],"mappings":";;AAQA,gDAIC;AASD,0CAgCC;AArDD,2CAAiD;AACjD,6CAAwC;AACxC,qDAA8D;AAC9D,yDAA8C;AAK9C,SAAgB,kBAAkB;IAChC,OAAO,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAC7B,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAC7D,CAAC;AACJ,CAAC;AASD,SAAgB,eAAe,CAC3B,WAAoB,KAAK,EACzB,YAAqB,IAAI;IAI3B,MAAM,iBAAiB,GAAG,SAAS;QACjC,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,IAAA,wBAAe,EAEpB,GAAG,iBAAiB,EAGpB,IAAA,4BAAU,GAAE,EAEZ,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAGtF,IAAA,yBAAO,EAAC,UAAU,EAAE;QAClB,OAAO,EAAE,4CAA4C;KACtD,CAAC,EAEF,IAAA,yBAAO,EAAC,cAAc,EAAE;QACtB,OAAO,EAAE,oCAAoC;KAC9C,CAAC,EAEF,IAAA,wBAAM,EAAC,EAAE,EAAE,EAAE,EAAE;QACb,OAAO,EAAE,uCAAuC;KACjD,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './decorators/IdValidate.decorator';
2
+ export * from './decorators/TextField.decorator';
3
+ export * from './decorators/CapitalField.decorator';
4
+ export * from './decorators/EmailField.decorator';
5
+ export * from './decorators/PasswordField.decorator';
6
+ export * from './decorators/PhoneField.decorator';
7
+ export * from './decorators/nationalId.decorator';
8
+ export * from './utility/WordsTransform.decorator';
9
+ export * from './decorators/nationalId.decorator';
10
+ export * from './decorators/PhoneField.decorator';
@@ -0,0 +1,27 @@
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("./decorators/IdValidate.decorator"), exports);
18
+ __exportStar(require("./decorators/TextField.decorator"), exports);
19
+ __exportStar(require("./decorators/CapitalField.decorator"), exports);
20
+ __exportStar(require("./decorators/EmailField.decorator"), exports);
21
+ __exportStar(require("./decorators/PasswordField.decorator"), exports);
22
+ __exportStar(require("./decorators/PhoneField.decorator"), exports);
23
+ __exportStar(require("./decorators/nationalId.decorator"), exports);
24
+ __exportStar(require("./utility/WordsTransform.decorator"), exports);
25
+ __exportStar(require("./decorators/nationalId.decorator"), exports);
26
+ __exportStar(require("./decorators/PhoneField.decorator"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../validation/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,oEAAkD;AAClD,mEAAiD;AACjD,sEAAoD;AACpD,oEAAkD;AAClD,uEAAqD;AACrD,oEAAkD;AAClD,oEAAkD;AAIlD,qEAAmD;AAGnD,oEAAkD;AAClD,oEAAkD"}
@@ -0,0 +1 @@
1
+ export declare const SQL_INJECTION_REGEX: RegExp;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQL_INJECTION_REGEX = void 0;
4
+ exports.SQL_INJECTION_REGEX = /^(?!.*(\b(SELECT|INSERT|DELETE|UPDATE|DROP|UNION|EXEC|TRUNCATE|ALTER|CREATE)\b|--|;)).*$/i;
5
+ //# sourceMappingURL=SQL_INJECTION_REGEX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQL_INJECTION_REGEX.js","sourceRoot":"","sources":["../../../../../validation/src/regex/SQL_INJECTION_REGEX.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,2FAA2F,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function LowwerWords(value: string): string;
2
+ export declare function CapitalizeWords(value: string): string;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LowwerWords = LowwerWords;
4
+ exports.CapitalizeWords = CapitalizeWords;
5
+ function LowwerWords(value) {
6
+ if (!value || typeof value !== 'string')
7
+ return value;
8
+ return value.toLowerCase();
9
+ }
10
+ function CapitalizeWords(value) {
11
+ if (!value || typeof value !== 'string')
12
+ return value;
13
+ return value
14
+ .toLowerCase()
15
+ .split(' ')
16
+ .map((word) => word.length > 0 ? word.charAt(0).toUpperCase() + word.slice(1) : '')
17
+ .join(' ');
18
+ }
19
+ //# sourceMappingURL=WordsTransform.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WordsTransform.decorator.js","sourceRoot":"","sources":["../../../../../validation/src/utility/WordsTransform.decorator.ts"],"names":[],"mappings":";;AAKA,kCAIC;AAOD,0CAUC;AArBD,SAAgB,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEtD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC;AAOD,SAAgB,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEtD,OAAO,KAAK;SACT,WAAW,EAAE;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CACpE;SACA,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "@bts-soft/core",
3
- "version": "1.2.8",
3
+ "version": "1.3.8",
4
4
  "author": "Omar Sabry",
5
5
  "description": "All bts-soft packages",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "license": "MIT",
9
+ "workspaces": [
10
+ "packages/*"
11
+ ],
9
12
  "dependencies": {
13
+ "@bts-soft/cache": "^1.0.1",
10
14
  "@bts-soft/mail-queue": "^1.1.5",
11
- "@bts-soft/upload": "^1.1.2",
12
- "@bts-soft/validation":"^1.0.0"
15
+ "@bts-soft/upload": "^1.1.5",
16
+ "@bts-soft/validation": "^1.0.1"
13
17
  },
14
18
  "peerDependencies": {
15
19
  "@nestjs/common": "^10.0.0",
@@ -17,5 +21,8 @@
17
21
  },
18
22
  "scripts": {
19
23
  "build": "tsc -p tsconfig.json"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^24.7.1"
20
27
  }
21
28
  }