rl-core-api 0.15.6 → 0.16.0

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 (52) hide show
  1. package/dist/core/bootstrap/bootstrapCore.util.js +1 -1
  2. package/dist/core/config/env.schema.d.ts +7 -0
  3. package/dist/core/config/env.schema.js +4 -0
  4. package/dist/core/images/imageCleanup.service.d.ts +9 -0
  5. package/dist/core/images/imageCleanup.service.js +50 -0
  6. package/dist/core/images/imageFetch.service.d.ts +11 -0
  7. package/dist/core/images/imageFetch.service.js +190 -0
  8. package/dist/core/images/imageProcessing.service.d.ts +9 -0
  9. package/dist/core/images/imageProcessing.service.js +74 -0
  10. package/dist/core/images/imageProfile.interface.d.ts +40 -0
  11. package/dist/core/images/imageProfile.interface.js +29 -0
  12. package/dist/core/images/imageProfile.registry.d.ts +14 -0
  13. package/dist/core/images/imageProfile.registry.js +61 -0
  14. package/dist/core/images/imageStorage.service.d.ts +28 -0
  15. package/dist/core/images/imageStorage.service.js +151 -0
  16. package/dist/core/images/images.controller.d.ts +16 -0
  17. package/dist/core/images/images.controller.js +142 -0
  18. package/dist/core/images/images.module.d.ts +2 -0
  19. package/dist/core/images/images.module.js +35 -0
  20. package/dist/core/images/images.processor.d.ts +18 -0
  21. package/dist/core/images/images.processor.js +75 -0
  22. package/dist/core/images/images.service.d.ts +34 -0
  23. package/dist/core/images/images.service.js +137 -0
  24. package/dist/core/images/imagesApi.module.d.ts +2 -0
  25. package/dist/core/images/imagesApi.module.js +25 -0
  26. package/dist/core/images/imagesWorker.module.d.ts +2 -0
  27. package/dist/core/images/imagesWorker.module.js +22 -0
  28. package/dist/core/images/responses/imageAccepted.response.d.ts +4 -0
  29. package/dist/core/images/responses/imageAccepted.response.js +28 -0
  30. package/dist/core/images/responses/imageProfile.response.d.ts +10 -0
  31. package/dist/core/images/responses/imageProfile.response.js +55 -0
  32. package/dist/core/images/responses/imageStatus.response.d.ts +7 -0
  33. package/dist/core/images/responses/imageStatus.response.js +36 -0
  34. package/dist/core/images/uploadImageFromUrl.command.d.ts +3 -0
  35. package/dist/core/images/uploadImageFromUrl.command.js +23 -0
  36. package/dist/core/queue/job.producer.d.ts +1 -1
  37. package/dist/core/queue/job.producer.js +7 -1
  38. package/dist/core/queue/queue.constants.d.ts +4 -1
  39. package/dist/core/queue/queue.constants.js +5 -2
  40. package/dist/features/users/domain/avatarImage.profile.d.ts +13 -0
  41. package/dist/features/users/domain/avatarImage.profile.js +30 -0
  42. package/dist/features/users/domain/index.d.ts +1 -1
  43. package/dist/features/users/domain/index.js +1 -1
  44. package/dist/features/users/presentation/users.controller.d.ts +6 -5
  45. package/dist/features/users/presentation/users.controller.js +28 -15
  46. package/dist/features/users/users.module.js +3 -1
  47. package/dist/index.d.ts +17 -1
  48. package/dist/index.js +43 -2
  49. package/dist/rlCore.module.js +5 -1
  50. package/package.json +1 -1
  51. package/dist/features/users/domain/avatar.service.d.ts +0 -5
  52. package/dist/features/users/domain/avatar.service.js +0 -61
@@ -12,6 +12,8 @@ const common_1 = require("@nestjs/common");
12
12
  const core_module_1 = require("./core/core.module");
13
13
  const exportApi_module_1 = require("./core/export/exportApi.module");
14
14
  const exportWorker_module_1 = require("./core/export/exportWorker.module");
15
+ const imagesApi_module_1 = require("./core/images/imagesApi.module");
16
+ const imagesWorker_module_1 = require("./core/images/imagesWorker.module");
15
17
  const jobEvents_interface_1 = require("./core/queue/jobEvents.interface");
16
18
  const queue_constants_1 = require("./core/queue/queue.constants");
17
19
  const redisJobEvents_bridge_1 = require("./core/queue/redisJobEvents.bridge");
@@ -40,6 +42,7 @@ let RlCoreModule = RlCoreModule_1 = class RlCoreModule {
40
42
  maintenance_module_1.MaintenanceModule,
41
43
  notifications_module_1.NotificationsModule,
42
44
  exportApi_module_1.ExportApiModule,
45
+ imagesApi_module_1.ImagesApiModule,
43
46
  ],
44
47
  providers: [
45
48
  {
@@ -48,7 +51,7 @@ let RlCoreModule = RlCoreModule_1 = class RlCoreModule {
48
51
  },
49
52
  ...((0, queue_constants_1.isRedisConfigured)() ? [redisJobEvents_bridge_1.RedisJobEventsBridge] : []),
50
53
  ],
51
- exports: [notifications_module_1.NotificationsModule],
54
+ exports: [notifications_module_1.NotificationsModule, imagesApi_module_1.ImagesApiModule],
52
55
  };
53
56
  }
54
57
  static forWorker(options = {}) {
@@ -60,6 +63,7 @@ let RlCoreModule = RlCoreModule_1 = class RlCoreModule {
60
63
  validateEnv: options.validateEnv,
61
64
  }),
62
65
  exportWorker_module_1.ExportWorkerModule,
66
+ imagesWorker_module_1.ImagesWorkerModule,
63
67
  ],
64
68
  providers: [
65
69
  ...((0, queue_constants_1.isRedisConfigured)()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rl-core-api",
3
- "version": "0.15.6",
3
+ "version": "0.16.0",
4
4
  "description": "Core NestJS: autenticação com 2FA, RBAC, auditoria, notificações e listagens com filtro dinâmico",
5
5
  "author": "Rodrigo Liberti",
6
6
  "license": "MIT",
@@ -1,5 +0,0 @@
1
- export declare const AVATAR_MAX_BYTES: number;
2
- export declare class AvatarService {
3
- processAndStore(userId: string, file?: Express.Multer.File): Promise<string>;
4
- remove(userId: string): Promise<void>;
5
- }
@@ -1,61 +0,0 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
9
- return (mod && mod.__esModule) ? mod : { "default": mod };
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AvatarService = exports.AVATAR_MAX_BYTES = void 0;
13
- const common_1 = require("@nestjs/common");
14
- const fs_1 = require("fs");
15
- const path_1 = require("path");
16
- const sharp_1 = __importDefault(require("sharp"));
17
- const UPLOAD_DIR = (0, path_1.join)(process.cwd(), "uploads", "avatars");
18
- const ALLOWED = ["image/jpeg", "image/png", "image/webp"];
19
- exports.AVATAR_MAX_BYTES = 5 * 1024 * 1024;
20
- const MAGIC_BYTES_CHECK = {
21
- "image/jpeg": (buf) => buf.length >= 3 && buf[0] === 0xff && buf[1] === 0xd8 && buf[2] === 0xff,
22
- "image/png": (buf) => buf.length >= 8 &&
23
- buf
24
- .subarray(0, 8)
25
- .equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])),
26
- "image/webp": (buf) => buf.length >= 12 &&
27
- buf.subarray(0, 4).toString("ascii") === "RIFF" &&
28
- buf.subarray(8, 12).toString("ascii") === "WEBP",
29
- };
30
- let AvatarService = class AvatarService {
31
- async processAndStore(userId, file) {
32
- if (!file) {
33
- throw new common_1.BadRequestException("Arquivo de imagem é obrigatório");
34
- }
35
- if (!ALLOWED.includes(file.mimetype)) {
36
- throw new common_1.BadRequestException("Formato inválido (use JPEG, PNG ou WebP)");
37
- }
38
- if (!MAGIC_BYTES_CHECK[file.mimetype]?.(file.buffer)) {
39
- throw new common_1.BadRequestException("O conteúdo do arquivo não corresponde ao formato declarado");
40
- }
41
- if (file.size > exports.AVATAR_MAX_BYTES) {
42
- throw new common_1.BadRequestException("Imagem excede o limite de 5MB");
43
- }
44
- await fs_1.promises.mkdir(UPLOAD_DIR, { recursive: true });
45
- const filename = `${userId}.webp`;
46
- const fullPath = (0, path_1.join)(UPLOAD_DIR, filename);
47
- await (0, sharp_1.default)(file.buffer)
48
- .resize(256, 256, { fit: "cover" })
49
- .webp({ quality: 85 })
50
- .toFile(fullPath);
51
- return `/uploads/avatars/${filename}?v=${Date.now()}`;
52
- }
53
- async remove(userId) {
54
- const fullPath = (0, path_1.join)(UPLOAD_DIR, `${userId}.webp`);
55
- await fs_1.promises.rm(fullPath, { force: true });
56
- }
57
- };
58
- exports.AvatarService = AvatarService;
59
- exports.AvatarService = AvatarService = __decorate([
60
- (0, common_1.Injectable)()
61
- ], AvatarService);