@uniorganization/uni-lib 4.0.34 → 4.0.35

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.
@@ -0,0 +1,12 @@
1
+ import { Users } from './usr.entity';
2
+ export declare class FileTypeEntity {
3
+ id: number;
4
+ name: string;
5
+ extensions: string[];
6
+ code: string;
7
+ createdBy?: Users | null;
8
+ createdById: number | null;
9
+ createdDate: Date;
10
+ updatedDate: Date;
11
+ deletedDate: Date | null;
12
+ }
@@ -0,0 +1,58 @@
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.FileTypeEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const usr_entity_1 = require("./usr.entity");
15
+ let FileTypeEntity = class FileTypeEntity {
16
+ };
17
+ exports.FileTypeEntity = FileTypeEntity;
18
+ __decorate([
19
+ (0, typeorm_1.PrimaryGeneratedColumn)(),
20
+ __metadata("design:type", Number)
21
+ ], FileTypeEntity.prototype, "id", void 0);
22
+ __decorate([
23
+ (0, typeorm_1.Column)({ name: 'name', type: 'varchar', nullable: false }),
24
+ __metadata("design:type", String)
25
+ ], FileTypeEntity.prototype, "name", void 0);
26
+ __decorate([
27
+ (0, typeorm_1.Column)({ name: 'extensions', type: 'jsonb', nullable: false }),
28
+ __metadata("design:type", Array)
29
+ ], FileTypeEntity.prototype, "extensions", void 0);
30
+ __decorate([
31
+ (0, typeorm_1.Column)({ name: 'code', type: 'varchar', nullable: false }),
32
+ __metadata("design:type", String)
33
+ ], FileTypeEntity.prototype, "code", void 0);
34
+ __decorate([
35
+ (0, typeorm_1.ManyToOne)(() => usr_entity_1.Users),
36
+ (0, typeorm_1.JoinColumn)({ name: 'created_by_id' }),
37
+ __metadata("design:type", usr_entity_1.Users)
38
+ ], FileTypeEntity.prototype, "createdBy", void 0);
39
+ __decorate([
40
+ (0, typeorm_1.Column)({ name: 'created_by_id', type: 'integer', nullable: true }),
41
+ __metadata("design:type", Number)
42
+ ], FileTypeEntity.prototype, "createdById", void 0);
43
+ __decorate([
44
+ (0, typeorm_1.CreateDateColumn)({ name: 'created_date', type: 'timestamp' }),
45
+ __metadata("design:type", Date)
46
+ ], FileTypeEntity.prototype, "createdDate", void 0);
47
+ __decorate([
48
+ (0, typeorm_1.UpdateDateColumn)({ name: 'updated_date', type: 'timestamp' }),
49
+ __metadata("design:type", Date)
50
+ ], FileTypeEntity.prototype, "updatedDate", void 0);
51
+ __decorate([
52
+ (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_date', type: 'timestamp' }),
53
+ __metadata("design:type", Date)
54
+ ], FileTypeEntity.prototype, "deletedDate", void 0);
55
+ exports.FileTypeEntity = FileTypeEntity = __decorate([
56
+ (0, typeorm_1.Entity)('file_type', { schema: 'enr' }),
57
+ (0, typeorm_1.Index)(['code'], { unique: true })
58
+ ], FileTypeEntity);
@@ -0,0 +1,17 @@
1
+ import { Users } from './usr.entity';
2
+ import { FileTypeEntity } from './file-type.entity';
3
+ export declare class FileEntity {
4
+ id: number;
5
+ name: string;
6
+ type: FileTypeEntity;
7
+ typeId: number;
8
+ path: string;
9
+ extension: string;
10
+ startDate: Date | null;
11
+ endDate: Date | null;
12
+ createdBy?: Users | null;
13
+ createdById: number | null;
14
+ createdDate: Date;
15
+ updatedDate: Date;
16
+ deletedDate: Date | null;
17
+ }
@@ -0,0 +1,75 @@
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.FileEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const usr_entity_1 = require("./usr.entity");
15
+ const file_type_entity_1 = require("./file-type.entity");
16
+ let FileEntity = class FileEntity {
17
+ };
18
+ exports.FileEntity = FileEntity;
19
+ __decorate([
20
+ (0, typeorm_1.PrimaryGeneratedColumn)(),
21
+ __metadata("design:type", Number)
22
+ ], FileEntity.prototype, "id", void 0);
23
+ __decorate([
24
+ (0, typeorm_1.Column)({ name: 'name', type: 'varchar', nullable: false }),
25
+ __metadata("design:type", String)
26
+ ], FileEntity.prototype, "name", void 0);
27
+ __decorate([
28
+ (0, typeorm_1.ManyToOne)(() => file_type_entity_1.FileTypeEntity),
29
+ (0, typeorm_1.JoinColumn)({ name: 'type_id' }),
30
+ __metadata("design:type", file_type_entity_1.FileTypeEntity)
31
+ ], FileEntity.prototype, "type", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.Column)({ name: 'type_id', type: 'integer', nullable: false }),
34
+ __metadata("design:type", Number)
35
+ ], FileEntity.prototype, "typeId", void 0);
36
+ __decorate([
37
+ (0, typeorm_1.Column)({ name: 'path', type: 'text', nullable: false }),
38
+ __metadata("design:type", String)
39
+ ], FileEntity.prototype, "path", void 0);
40
+ __decorate([
41
+ (0, typeorm_1.Column)({ name: 'extension', type: 'varchar', nullable: false }),
42
+ __metadata("design:type", String)
43
+ ], FileEntity.prototype, "extension", void 0);
44
+ __decorate([
45
+ (0, typeorm_1.Column)({ name: 'start_date', type: 'timestamp', nullable: true }),
46
+ __metadata("design:type", Date)
47
+ ], FileEntity.prototype, "startDate", void 0);
48
+ __decorate([
49
+ (0, typeorm_1.Column)({ name: 'end_date', type: 'timestamp', nullable: true }),
50
+ __metadata("design:type", Date)
51
+ ], FileEntity.prototype, "endDate", void 0);
52
+ __decorate([
53
+ (0, typeorm_1.ManyToOne)(() => usr_entity_1.Users),
54
+ (0, typeorm_1.JoinColumn)({ name: 'created_by_id' }),
55
+ __metadata("design:type", usr_entity_1.Users)
56
+ ], FileEntity.prototype, "createdBy", void 0);
57
+ __decorate([
58
+ (0, typeorm_1.Column)({ name: 'created_by_id', type: 'integer', nullable: true }),
59
+ __metadata("design:type", Number)
60
+ ], FileEntity.prototype, "createdById", void 0);
61
+ __decorate([
62
+ (0, typeorm_1.CreateDateColumn)({ name: 'created_date', type: 'timestamp' }),
63
+ __metadata("design:type", Date)
64
+ ], FileEntity.prototype, "createdDate", void 0);
65
+ __decorate([
66
+ (0, typeorm_1.UpdateDateColumn)({ name: 'updated_date', type: 'timestamp' }),
67
+ __metadata("design:type", Date)
68
+ ], FileEntity.prototype, "updatedDate", void 0);
69
+ __decorate([
70
+ (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_date', type: 'timestamp' }),
71
+ __metadata("design:type", Date)
72
+ ], FileEntity.prototype, "deletedDate", void 0);
73
+ exports.FileEntity = FileEntity = __decorate([
74
+ (0, typeorm_1.Entity)('file', { schema: 'enr' })
75
+ ], FileEntity);
@@ -28,7 +28,6 @@ export * from './form.entity';
28
28
  export * from './incident-notes.entity';
29
29
  export * from './incident.entity';
30
30
  export * from './incoterms.entity';
31
- export * from './index';
32
31
  export * from './inventory.entity';
33
32
  export * from './it-info.entity';
34
33
  export * from './lob-assignment.entity';
@@ -79,6 +78,8 @@ export * from './p1-service-network.entity';
79
78
  export * from './raw_roster.entity';
80
79
  export * from './bp-alerts.entity';
81
80
  export * from './feedback.entity';
81
+ export * from './file-type.entity';
82
+ export * from './file.entity';
82
83
  export * from './service-center.entity';
83
84
  export * from './service-center-unsupported-model.entity';
84
85
  export * from './service-center-ranking.entity';
@@ -88,3 +89,4 @@ export * from './service-center-phone.entity';
88
89
  export * from './service-center-distance-cache.entity';
89
90
  export * from './service-center-geocode-cache.entity';
90
91
  export * from './kenko.entity';
92
+ export * from './ticket-service-center-match-process.entity';
@@ -44,7 +44,6 @@ __exportStar(require("./form.entity"), exports);
44
44
  __exportStar(require("./incident-notes.entity"), exports);
45
45
  __exportStar(require("./incident.entity"), exports);
46
46
  __exportStar(require("./incoterms.entity"), exports);
47
- __exportStar(require("./index"), exports);
48
47
  __exportStar(require("./inventory.entity"), exports);
49
48
  __exportStar(require("./it-info.entity"), exports);
50
49
  __exportStar(require("./lob-assignment.entity"), exports);
@@ -95,6 +94,8 @@ __exportStar(require("./p1-service-network.entity"), exports);
95
94
  __exportStar(require("./raw_roster.entity"), exports);
96
95
  __exportStar(require("./bp-alerts.entity"), exports);
97
96
  __exportStar(require("./feedback.entity"), exports);
97
+ __exportStar(require("./file-type.entity"), exports);
98
+ __exportStar(require("./file.entity"), exports);
98
99
  __exportStar(require("./service-center.entity"), exports);
99
100
  __exportStar(require("./service-center-unsupported-model.entity"), exports);
100
101
  __exportStar(require("./service-center-ranking.entity"), exports);
@@ -104,3 +105,4 @@ __exportStar(require("./service-center-phone.entity"), exports);
104
105
  __exportStar(require("./service-center-distance-cache.entity"), exports);
105
106
  __exportStar(require("./service-center-geocode-cache.entity"), exports);
106
107
  __exportStar(require("./kenko.entity"), exports);
108
+ __exportStar(require("./ticket-service-center-match-process.entity"), exports);
@@ -0,0 +1,21 @@
1
+ import { Users } from './usr.entity';
2
+ import { FileEntity } from './file.entity';
3
+ import { TicketServiceCenterMatchProcessStatus } from '../enums/ticket-service-center-match-process-status.enum';
4
+ export declare class TicketServiceCenterMatchProcessEntity {
5
+ id: number;
6
+ status: TicketServiceCenterMatchProcessStatus;
7
+ startDate: Date | null;
8
+ endDate: Date | null;
9
+ ticketsProcessed: number | null;
10
+ requestedRadiusMiles: number | null;
11
+ log: string | null;
12
+ createdBy?: Users | null;
13
+ createdById: number | null;
14
+ sourceFile?: FileEntity | null;
15
+ sourceFileId: number | null;
16
+ outputFile?: FileEntity | null;
17
+ outputFileId: number | null;
18
+ createdDate: Date;
19
+ updatedDate: Date;
20
+ deletedDate: Date | null;
21
+ }
@@ -0,0 +1,89 @@
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.TicketServiceCenterMatchProcessEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const usr_entity_1 = require("./usr.entity");
15
+ const file_entity_1 = require("./file.entity");
16
+ const ticket_service_center_match_process_status_enum_1 = require("../enums/ticket-service-center-match-process-status.enum");
17
+ let TicketServiceCenterMatchProcessEntity = class TicketServiceCenterMatchProcessEntity {
18
+ };
19
+ exports.TicketServiceCenterMatchProcessEntity = TicketServiceCenterMatchProcessEntity;
20
+ __decorate([
21
+ (0, typeorm_1.PrimaryGeneratedColumn)(),
22
+ __metadata("design:type", Number)
23
+ ], TicketServiceCenterMatchProcessEntity.prototype, "id", void 0);
24
+ __decorate([
25
+ (0, typeorm_1.Column)({ name: 'status', type: 'varchar', nullable: false }),
26
+ __metadata("design:type", String)
27
+ ], TicketServiceCenterMatchProcessEntity.prototype, "status", void 0);
28
+ __decorate([
29
+ (0, typeorm_1.Column)({ name: 'start_date', type: 'timestamp', nullable: true }),
30
+ __metadata("design:type", Date)
31
+ ], TicketServiceCenterMatchProcessEntity.prototype, "startDate", void 0);
32
+ __decorate([
33
+ (0, typeorm_1.Column)({ name: 'end_date', type: 'timestamp', nullable: true }),
34
+ __metadata("design:type", Date)
35
+ ], TicketServiceCenterMatchProcessEntity.prototype, "endDate", void 0);
36
+ __decorate([
37
+ (0, typeorm_1.Column)({ name: 'tickets_processed', type: 'integer', nullable: true }),
38
+ __metadata("design:type", Number)
39
+ ], TicketServiceCenterMatchProcessEntity.prototype, "ticketsProcessed", void 0);
40
+ __decorate([
41
+ (0, typeorm_1.Column)({ name: 'requested_radius_miles', type: 'numeric', precision: 10, scale: 2, nullable: true }),
42
+ __metadata("design:type", Number)
43
+ ], TicketServiceCenterMatchProcessEntity.prototype, "requestedRadiusMiles", void 0);
44
+ __decorate([
45
+ (0, typeorm_1.Column)({ name: 'log', type: 'text', nullable: true }),
46
+ __metadata("design:type", String)
47
+ ], TicketServiceCenterMatchProcessEntity.prototype, "log", void 0);
48
+ __decorate([
49
+ (0, typeorm_1.ManyToOne)(() => usr_entity_1.Users),
50
+ (0, typeorm_1.JoinColumn)({ name: 'created_by_id' }),
51
+ __metadata("design:type", usr_entity_1.Users)
52
+ ], TicketServiceCenterMatchProcessEntity.prototype, "createdBy", void 0);
53
+ __decorate([
54
+ (0, typeorm_1.Column)({ name: 'created_by_id', type: 'integer', nullable: true }),
55
+ __metadata("design:type", Number)
56
+ ], TicketServiceCenterMatchProcessEntity.prototype, "createdById", void 0);
57
+ __decorate([
58
+ (0, typeorm_1.ManyToOne)(() => file_entity_1.FileEntity),
59
+ (0, typeorm_1.JoinColumn)({ name: 'source_file_id' }),
60
+ __metadata("design:type", file_entity_1.FileEntity)
61
+ ], TicketServiceCenterMatchProcessEntity.prototype, "sourceFile", void 0);
62
+ __decorate([
63
+ (0, typeorm_1.Column)({ name: 'source_file_id', type: 'integer', nullable: true }),
64
+ __metadata("design:type", Number)
65
+ ], TicketServiceCenterMatchProcessEntity.prototype, "sourceFileId", void 0);
66
+ __decorate([
67
+ (0, typeorm_1.ManyToOne)(() => file_entity_1.FileEntity),
68
+ (0, typeorm_1.JoinColumn)({ name: 'output_file_id' }),
69
+ __metadata("design:type", file_entity_1.FileEntity)
70
+ ], TicketServiceCenterMatchProcessEntity.prototype, "outputFile", void 0);
71
+ __decorate([
72
+ (0, typeorm_1.Column)({ name: 'output_file_id', type: 'integer', nullable: true }),
73
+ __metadata("design:type", Number)
74
+ ], TicketServiceCenterMatchProcessEntity.prototype, "outputFileId", void 0);
75
+ __decorate([
76
+ (0, typeorm_1.CreateDateColumn)({ name: 'created_date', type: 'timestamp' }),
77
+ __metadata("design:type", Date)
78
+ ], TicketServiceCenterMatchProcessEntity.prototype, "createdDate", void 0);
79
+ __decorate([
80
+ (0, typeorm_1.UpdateDateColumn)({ name: 'updated_date', type: 'timestamp' }),
81
+ __metadata("design:type", Date)
82
+ ], TicketServiceCenterMatchProcessEntity.prototype, "updatedDate", void 0);
83
+ __decorate([
84
+ (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_date', type: 'timestamp' }),
85
+ __metadata("design:type", Date)
86
+ ], TicketServiceCenterMatchProcessEntity.prototype, "deletedDate", void 0);
87
+ exports.TicketServiceCenterMatchProcessEntity = TicketServiceCenterMatchProcessEntity = __decorate([
88
+ (0, typeorm_1.Entity)('ticket_service_center_match_process', { schema: 'enr' })
89
+ ], TicketServiceCenterMatchProcessEntity);
@@ -1,2 +1,3 @@
1
1
  export * from './feedback-role.enum';
2
2
  export * from './service-center-status.enum';
3
+ export * from './ticket-service-center-match-process-status.enum';
@@ -16,3 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./feedback-role.enum"), exports);
18
18
  __exportStar(require("./service-center-status.enum"), exports);
19
+ __exportStar(require("./ticket-service-center-match-process-status.enum"), exports);
@@ -0,0 +1,6 @@
1
+ export declare enum TicketServiceCenterMatchProcessStatus {
2
+ PENDING = "pending",
3
+ IN_PROCESS = "in_process",
4
+ COMPLETED = "completed",
5
+ FAILED = "failed"
6
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TicketServiceCenterMatchProcessStatus = void 0;
4
+ var TicketServiceCenterMatchProcessStatus;
5
+ (function (TicketServiceCenterMatchProcessStatus) {
6
+ TicketServiceCenterMatchProcessStatus["PENDING"] = "pending";
7
+ TicketServiceCenterMatchProcessStatus["IN_PROCESS"] = "in_process";
8
+ TicketServiceCenterMatchProcessStatus["COMPLETED"] = "completed";
9
+ TicketServiceCenterMatchProcessStatus["FAILED"] = "failed";
10
+ })(TicketServiceCenterMatchProcessStatus || (exports.TicketServiceCenterMatchProcessStatus = TicketServiceCenterMatchProcessStatus = {}));
package/dist/index.d.ts CHANGED
@@ -2,5 +2,6 @@ export * from './entities';
2
2
  export * from './config';
3
3
  export * from './utils';
4
4
  export * from './modules';
5
+ export * from './modules/file-storage';
5
6
  export * from './middlewares';
6
7
  export * from './enums';
package/dist/index.js CHANGED
@@ -18,5 +18,6 @@ __exportStar(require("./entities"), exports);
18
18
  __exportStar(require("./config"), exports);
19
19
  __exportStar(require("./utils"), exports);
20
20
  __exportStar(require("./modules"), exports);
21
+ __exportStar(require("./modules/file-storage"), exports);
21
22
  __exportStar(require("./middlewares"), exports);
22
23
  __exportStar(require("./enums"), exports);
@@ -0,0 +1,17 @@
1
+ export declare const FILE_STORAGE_BUCKET_NAME_ENV = "BUCKET_NAME";
2
+ export declare const FILE_STORAGE_BUCKET_REGION_ENV = "BUCKET_REGION";
3
+ export declare const FILE_STORAGE_BUCKET_ACCESS_KEY_ID_ENV = "BUCKET_ACCESS_KEY_ID";
4
+ export declare const FILE_STORAGE_BUCKET_SECRET_ACCESS_KEY_ENV = "BUCKET_SECRET_ACCESS_KEY";
5
+ export declare const FILE_STORAGE_BUCKET_ENDPOINT_ENV = "BUCKET_ENDPOINT";
6
+ export declare const FILE_STORAGE_BUCKET_PREFIX_ENV = "BUCKET_PREFIX";
7
+ export declare const FILE_STORAGE_BUCKET_ENV_KEYS: readonly ["BUCKET_NAME", "BUCKET_REGION", "BUCKET_ACCESS_KEY_ID", "BUCKET_SECRET_ACCESS_KEY", "BUCKET_ENDPOINT", "BUCKET_PREFIX"];
8
+ export declare const FILE_TYPE_CODES: {
9
+ readonly SERVICE_CENTER_TICKET_MATCH_SOURCE: "SERVICE_CENTER_TICKET_MATCH_SOURCE";
10
+ readonly SERVICE_CENTER_TICKET_MATCH_OUTPUT: "SERVICE_CENTER_TICKET_MATCH_OUTPUT";
11
+ };
12
+ export declare const FILE_STORAGE_DEFAULT_BUCKET_PREFIX = "";
13
+ export declare const FILE_STORAGE_ALLOWED_PATH_SEPARATOR = "/";
14
+ export declare const sanitizeFileName: (fileName: string) => string;
15
+ export declare const normalizeBucketPrefix: (prefix?: string | null) => string;
16
+ export declare const extractFileExtension: (originalName: string) => string;
17
+ export declare const buildBucketPath: (bucketPrefix: string | null | undefined, fileTypeCode: string, uniqueId: string, originalFileName: string) => string;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildBucketPath = exports.extractFileExtension = exports.normalizeBucketPrefix = exports.sanitizeFileName = exports.FILE_STORAGE_ALLOWED_PATH_SEPARATOR = exports.FILE_STORAGE_DEFAULT_BUCKET_PREFIX = exports.FILE_TYPE_CODES = exports.FILE_STORAGE_BUCKET_ENV_KEYS = exports.FILE_STORAGE_BUCKET_PREFIX_ENV = exports.FILE_STORAGE_BUCKET_ENDPOINT_ENV = exports.FILE_STORAGE_BUCKET_SECRET_ACCESS_KEY_ENV = exports.FILE_STORAGE_BUCKET_ACCESS_KEY_ID_ENV = exports.FILE_STORAGE_BUCKET_REGION_ENV = exports.FILE_STORAGE_BUCKET_NAME_ENV = void 0;
4
+ exports.FILE_STORAGE_BUCKET_NAME_ENV = 'BUCKET_NAME';
5
+ exports.FILE_STORAGE_BUCKET_REGION_ENV = 'BUCKET_REGION';
6
+ exports.FILE_STORAGE_BUCKET_ACCESS_KEY_ID_ENV = 'BUCKET_ACCESS_KEY_ID';
7
+ exports.FILE_STORAGE_BUCKET_SECRET_ACCESS_KEY_ENV = 'BUCKET_SECRET_ACCESS_KEY';
8
+ exports.FILE_STORAGE_BUCKET_ENDPOINT_ENV = 'BUCKET_ENDPOINT';
9
+ exports.FILE_STORAGE_BUCKET_PREFIX_ENV = 'BUCKET_PREFIX';
10
+ exports.FILE_STORAGE_BUCKET_ENV_KEYS = [
11
+ exports.FILE_STORAGE_BUCKET_NAME_ENV,
12
+ exports.FILE_STORAGE_BUCKET_REGION_ENV,
13
+ exports.FILE_STORAGE_BUCKET_ACCESS_KEY_ID_ENV,
14
+ exports.FILE_STORAGE_BUCKET_SECRET_ACCESS_KEY_ENV,
15
+ exports.FILE_STORAGE_BUCKET_ENDPOINT_ENV,
16
+ exports.FILE_STORAGE_BUCKET_PREFIX_ENV,
17
+ ];
18
+ exports.FILE_TYPE_CODES = {
19
+ SERVICE_CENTER_TICKET_MATCH_SOURCE: 'SERVICE_CENTER_TICKET_MATCH_SOURCE',
20
+ SERVICE_CENTER_TICKET_MATCH_OUTPUT: 'SERVICE_CENTER_TICKET_MATCH_OUTPUT',
21
+ };
22
+ exports.FILE_STORAGE_DEFAULT_BUCKET_PREFIX = '';
23
+ exports.FILE_STORAGE_ALLOWED_PATH_SEPARATOR = '/';
24
+ const sanitizeFileName = (fileName) => {
25
+ const sanitized = fileName
26
+ .normalize('NFKD')
27
+ .replace(/[\u0300-\u036f]/g, '')
28
+ .replace(/[^a-zA-Z0-9._-]+/g, '_')
29
+ .replace(/_+/g, '_')
30
+ .replace(/^_+|_+$/g, '');
31
+ return sanitized.length > 0 ? sanitized : 'file';
32
+ };
33
+ exports.sanitizeFileName = sanitizeFileName;
34
+ const normalizeBucketPrefix = (prefix) => {
35
+ if (!prefix) {
36
+ return exports.FILE_STORAGE_DEFAULT_BUCKET_PREFIX;
37
+ }
38
+ return prefix.replace(/^\/+|\/+$/g, '');
39
+ };
40
+ exports.normalizeBucketPrefix = normalizeBucketPrefix;
41
+ const extractFileExtension = (originalName) => {
42
+ const normalizedName = (0, exports.sanitizeFileName)(originalName);
43
+ const lastDotIndex = normalizedName.lastIndexOf('.');
44
+ if (lastDotIndex === -1 || lastDotIndex === normalizedName.length - 1) {
45
+ throw new Error('Unable to determine file extension from the original file name');
46
+ }
47
+ return normalizedName.slice(lastDotIndex + 1).toLowerCase();
48
+ };
49
+ exports.extractFileExtension = extractFileExtension;
50
+ const buildBucketPath = (bucketPrefix, fileTypeCode, uniqueId, originalFileName) => {
51
+ const prefix = (0, exports.normalizeBucketPrefix)(bucketPrefix);
52
+ const sanitizedOriginalFileName = (0, exports.sanitizeFileName)(originalFileName);
53
+ const bucketSegments = prefix ? [prefix, fileTypeCode, `${uniqueId}-${sanitizedOriginalFileName}`] : [fileTypeCode, `${uniqueId}-${sanitizedOriginalFileName}`];
54
+ return bucketSegments.join(exports.FILE_STORAGE_ALLOWED_PATH_SEPARATOR);
55
+ };
56
+ exports.buildBucketPath = buildBucketPath;
@@ -0,0 +1,2 @@
1
+ export declare class FileStorageModule {
2
+ }
@@ -0,0 +1,24 @@
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.FileStorageModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const typeorm_1 = require("@nestjs/typeorm");
12
+ const file_entity_1 = require("../../entities/file.entity");
13
+ const file_type_entity_1 = require("../../entities/file-type.entity");
14
+ const file_storage_service_1 = require("./file-storage.service");
15
+ let FileStorageModule = class FileStorageModule {
16
+ };
17
+ exports.FileStorageModule = FileStorageModule;
18
+ exports.FileStorageModule = FileStorageModule = __decorate([
19
+ (0, common_1.Module)({
20
+ imports: [typeorm_1.TypeOrmModule.forFeature([file_entity_1.FileEntity, file_type_entity_1.FileTypeEntity])],
21
+ providers: [file_storage_service_1.FileStorageService],
22
+ exports: [file_storage_service_1.FileStorageService],
23
+ })
24
+ ], FileStorageModule);
@@ -0,0 +1,30 @@
1
+ import { Repository } from 'typeorm';
2
+ import { FileEntity } from '../../entities/file.entity';
3
+ import { FileTypeEntity } from '../../entities/file-type.entity';
4
+ export interface FileStorageUploadOptions {
5
+ fileTypeCode?: string;
6
+ fileTypeId?: number;
7
+ createdById?: number | null;
8
+ startDate?: Date | null;
9
+ endDate?: Date | null;
10
+ }
11
+ export interface FileStorageUploadFile {
12
+ originalname: string;
13
+ mimetype: string;
14
+ buffer: Buffer;
15
+ }
16
+ export declare class FileStorageService {
17
+ private readonly fileRepository;
18
+ private readonly fileTypeRepository;
19
+ private readonly logger;
20
+ private readonly s3Client;
21
+ constructor(fileRepository: Repository<FileEntity>, fileTypeRepository: Repository<FileTypeEntity>);
22
+ uploadDocument(file: FileStorageUploadFile, options: FileStorageUploadOptions): Promise<FileEntity>;
23
+ downloadDocument(bucketPath: string): Promise<Buffer>;
24
+ resolveFileType(fileTypeCode?: string, fileTypeId?: number): Promise<FileTypeEntity>;
25
+ private createS3Client;
26
+ private putObject;
27
+ private deleteObject;
28
+ private streamToBuffer;
29
+ private getRequiredEnv;
30
+ }
@@ -0,0 +1,224 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
24
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
25
+ var m = o[Symbol.asyncIterator], i;
26
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
27
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
28
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
29
+ };
30
+ var FileStorageService_1;
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.FileStorageService = void 0;
33
+ const common_1 = require("@nestjs/common");
34
+ const typeorm_1 = require("@nestjs/typeorm");
35
+ const client_s3_1 = require("@aws-sdk/client-s3");
36
+ const typeorm_2 = require("typeorm");
37
+ const node_crypto_1 = require("node:crypto");
38
+ const file_entity_1 = require("../../entities/file.entity");
39
+ const file_type_entity_1 = require("../../entities/file-type.entity");
40
+ const constants_1 = require("./constants");
41
+ let FileStorageService = FileStorageService_1 = class FileStorageService {
42
+ constructor(fileRepository, fileTypeRepository) {
43
+ this.fileRepository = fileRepository;
44
+ this.fileTypeRepository = fileTypeRepository;
45
+ this.logger = new common_1.Logger(FileStorageService_1.name);
46
+ this.s3Client = this.createS3Client();
47
+ }
48
+ uploadDocument(file, options) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ var _a, _b, _c;
51
+ if (!file) {
52
+ throw new Error('File is required');
53
+ }
54
+ if (!file.buffer) {
55
+ throw new Error('File buffer is required to upload documents to the bucket');
56
+ }
57
+ const fileType = yield this.resolveFileType(options.fileTypeCode, options.fileTypeId);
58
+ const extension = (0, constants_1.extractFileExtension)(file.originalname);
59
+ const uniqueId = (0, node_crypto_1.randomUUID)();
60
+ const bucketPrefix = process.env[constants_1.FILE_STORAGE_BUCKET_PREFIX_ENV];
61
+ const bucketName = this.getRequiredEnv(constants_1.FILE_STORAGE_BUCKET_NAME_ENV);
62
+ const bucketPath = (0, constants_1.buildBucketPath)(bucketPrefix, fileType.code, uniqueId, file.originalname);
63
+ yield this.putObject(bucketName, bucketPath, file);
64
+ try {
65
+ const fileRecord = this.fileRepository.create({
66
+ name: file.originalname,
67
+ typeId: fileType.id,
68
+ path: bucketPath,
69
+ extension,
70
+ startDate: (_a = options.startDate) !== null && _a !== void 0 ? _a : null,
71
+ endDate: (_b = options.endDate) !== null && _b !== void 0 ? _b : null,
72
+ createdById: (_c = options.createdById) !== null && _c !== void 0 ? _c : null,
73
+ });
74
+ return yield this.fileRepository.save(fileRecord);
75
+ }
76
+ catch (error) {
77
+ yield this.deleteObject(bucketName, bucketPath);
78
+ throw error;
79
+ }
80
+ });
81
+ }
82
+ downloadDocument(bucketPath) {
83
+ return __awaiter(this, void 0, void 0, function* () {
84
+ const bucketName = this.getRequiredEnv(constants_1.FILE_STORAGE_BUCKET_NAME_ENV);
85
+ try {
86
+ const response = yield this.s3Client.send(new client_s3_1.GetObjectCommand({
87
+ Bucket: bucketName,
88
+ Key: bucketPath,
89
+ }));
90
+ if (!response.Body) {
91
+ throw new Error(`Empty body returned for bucket path "${bucketPath}"`);
92
+ }
93
+ return this.streamToBuffer(response.Body);
94
+ }
95
+ catch (error) {
96
+ const errorMessage = error instanceof Error ? error.message : String(error);
97
+ const errorStack = error instanceof Error ? error.stack : undefined;
98
+ this.logger.error(`Failed to download file from bucket path "${bucketPath}"`, errorStack || errorMessage);
99
+ throw error;
100
+ }
101
+ });
102
+ }
103
+ resolveFileType(fileTypeCode, fileTypeId) {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ if (fileTypeCode && typeof fileTypeId === 'number') {
106
+ const [byCode, byId] = yield Promise.all([
107
+ this.fileTypeRepository.findOne({ where: { code: fileTypeCode } }),
108
+ this.fileTypeRepository.findOne({ where: { id: fileTypeId } }),
109
+ ]);
110
+ if (!byCode) {
111
+ throw new Error(`File type not found for code "${fileTypeCode}"`);
112
+ }
113
+ if (!byId) {
114
+ throw new Error(`File type not found for id "${fileTypeId}"`);
115
+ }
116
+ if (byCode.id !== byId.id) {
117
+ throw new Error(`File type code "${fileTypeCode}" does not match id "${fileTypeId}"`);
118
+ }
119
+ return byCode;
120
+ }
121
+ if (fileTypeCode) {
122
+ const fileType = yield this.fileTypeRepository.findOne({ where: { code: fileTypeCode } });
123
+ if (!fileType) {
124
+ throw new Error(`File type not found for code "${fileTypeCode}"`);
125
+ }
126
+ return fileType;
127
+ }
128
+ if (typeof fileTypeId === 'number') {
129
+ const fileType = yield this.fileTypeRepository.findOne({ where: { id: fileTypeId } });
130
+ if (!fileType) {
131
+ throw new Error(`File type not found for id "${fileTypeId}"`);
132
+ }
133
+ return fileType;
134
+ }
135
+ throw new Error('Either fileTypeCode or fileTypeId must be provided');
136
+ });
137
+ }
138
+ createS3Client() {
139
+ const region = this.getRequiredEnv(constants_1.FILE_STORAGE_BUCKET_REGION_ENV);
140
+ const accessKeyId = this.getRequiredEnv(constants_1.FILE_STORAGE_BUCKET_ACCESS_KEY_ID_ENV);
141
+ const secretAccessKey = this.getRequiredEnv(constants_1.FILE_STORAGE_BUCKET_SECRET_ACCESS_KEY_ENV);
142
+ const endpoint = this.getRequiredEnv(constants_1.FILE_STORAGE_BUCKET_ENDPOINT_ENV);
143
+ return new client_s3_1.S3Client({
144
+ region,
145
+ endpoint,
146
+ forcePathStyle: false,
147
+ credentials: {
148
+ accessKeyId,
149
+ secretAccessKey,
150
+ },
151
+ });
152
+ }
153
+ putObject(bucketName, bucketPath, file) {
154
+ return __awaiter(this, void 0, void 0, function* () {
155
+ const params = {
156
+ Bucket: bucketName,
157
+ Key: bucketPath,
158
+ Body: file.buffer,
159
+ ContentType: file.mimetype,
160
+ };
161
+ try {
162
+ yield this.s3Client.send(new client_s3_1.PutObjectCommand(params));
163
+ }
164
+ catch (error) {
165
+ const errorMessage = error instanceof Error ? error.message : String(error);
166
+ const errorStack = error instanceof Error ? error.stack : undefined;
167
+ this.logger.error(`Failed to upload file "${file.originalname}" to bucket path "${bucketPath}"`, errorStack || errorMessage);
168
+ throw error;
169
+ }
170
+ });
171
+ }
172
+ deleteObject(bucketName, bucketPath) {
173
+ return __awaiter(this, void 0, void 0, function* () {
174
+ try {
175
+ yield this.s3Client.send(new client_s3_1.DeleteObjectCommand({
176
+ Bucket: bucketName,
177
+ Key: bucketPath,
178
+ }));
179
+ }
180
+ catch (error) {
181
+ const errorMessage = error instanceof Error ? error.message : String(error);
182
+ this.logger.warn(`Uploaded object "${bucketPath}" could not be deleted after DB save failure: ${errorMessage}`);
183
+ }
184
+ });
185
+ }
186
+ streamToBuffer(stream) {
187
+ return __awaiter(this, void 0, void 0, function* () {
188
+ var _a, stream_1, stream_1_1;
189
+ var _b, e_1, _c, _d;
190
+ const chunks = [];
191
+ try {
192
+ for (_a = true, stream_1 = __asyncValues(stream); stream_1_1 = yield stream_1.next(), _b = stream_1_1.done, !_b; _a = true) {
193
+ _d = stream_1_1.value;
194
+ _a = false;
195
+ const chunk = _d;
196
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
197
+ }
198
+ }
199
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
200
+ finally {
201
+ try {
202
+ if (!_a && !_b && (_c = stream_1.return)) yield _c.call(stream_1);
203
+ }
204
+ finally { if (e_1) throw e_1.error; }
205
+ }
206
+ return Buffer.concat(chunks);
207
+ });
208
+ }
209
+ getRequiredEnv(key) {
210
+ const value = process.env[key];
211
+ if (!value) {
212
+ throw new Error(`Environment variable ${key} is required`);
213
+ }
214
+ return value;
215
+ }
216
+ };
217
+ exports.FileStorageService = FileStorageService;
218
+ exports.FileStorageService = FileStorageService = FileStorageService_1 = __decorate([
219
+ (0, common_1.Injectable)(),
220
+ __param(0, (0, typeorm_1.InjectRepository)(file_entity_1.FileEntity)),
221
+ __param(1, (0, typeorm_1.InjectRepository)(file_type_entity_1.FileTypeEntity)),
222
+ __metadata("design:paramtypes", [typeorm_2.Repository,
223
+ typeorm_2.Repository])
224
+ ], FileStorageService);
@@ -0,0 +1,3 @@
1
+ export * from './constants';
2
+ export * from './file-storage.module';
3
+ export * from './file-storage.service';
@@ -0,0 +1,19 @@
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("./constants"), exports);
18
+ __exportStar(require("./file-storage.module"), exports);
19
+ __exportStar(require("./file-storage.service"), exports);
@@ -2,3 +2,4 @@ export * from './common';
2
2
  export * from './encryption';
3
3
  export * from './google-maps/google-maps.module';
4
4
  export * from './google-maps/google-maps.service';
5
+ export * from './file-storage';
@@ -18,3 +18,4 @@ __exportStar(require("./common"), exports);
18
18
  __exportStar(require("./encryption"), exports);
19
19
  __exportStar(require("./google-maps/google-maps.module"), exports);
20
20
  __exportStar(require("./google-maps/google-maps.service"), exports);
21
+ __exportStar(require("./file-storage"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniorganization/uni-lib",
3
- "version": "4.0.34",
3
+ "version": "4.0.35",
4
4
  "description": "UNI Library",
5
5
  "author": "Jhomiguel",
6
6
  "main": "dist/index.js",
@@ -22,6 +22,7 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@googlemaps/google-maps-services-js": "^3.4.2",
25
+ "@aws-sdk/client-s3": "^3.833.0",
25
26
  "@nestjs/axios": "3.0.3",
26
27
  "@nestjs/common": "^10.4.1",
27
28
  "@nestjs/core": "^10.4.1",