@devstroupe/devkit-nest 1.0.0 → 1.1.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.
- package/dist/audit/audit.context.d.ts +9 -0
- package/dist/audit/audit.context.js +5 -0
- package/dist/audit/audit.interceptor.d.ts +5 -0
- package/dist/audit/audit.interceptor.js +81 -0
- package/dist/audit/audit.module.d.ts +2 -0
- package/dist/audit/audit.module.js +29 -0
- package/dist/audit/audit.subscriber.d.ts +14 -0
- package/dist/audit/audit.subscriber.js +129 -0
- package/dist/audit/index.d.ts +4 -0
- package/dist/audit/index.js +20 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +18 -0
- package/dist/auth/permissions.decorator.d.ts +2 -0
- package/dist/auth/permissions.decorator.js +7 -0
- package/dist/auth/permissions.guard.d.ts +7 -0
- package/dist/auth/permissions.guard.js +46 -0
- package/dist/auth/permissions.guard.test.d.ts +1 -0
- package/dist/auth/permissions.guard.test.js +100 -0
- package/dist/http/base-crud.controller.d.ts +2 -0
- package/dist/http/base-crud.controller.js +24 -3
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/realtime/index.d.ts +3 -0
- package/dist/realtime/index.js +19 -0
- package/dist/realtime/realtime.gateway.d.ts +14 -0
- package/dist/realtime/realtime.gateway.js +134 -0
- package/dist/realtime/realtime.module.d.ts +2 -0
- package/dist/realtime/realtime.module.js +22 -0
- package/dist/realtime/realtime.service.d.ts +10 -0
- package/dist/realtime/realtime.service.js +32 -0
- package/dist/storage/drivers/local.storage.d.ts +11 -0
- package/dist/storage/drivers/local.storage.js +114 -0
- package/dist/storage/drivers/local.storage.test.d.ts +1 -0
- package/dist/storage/drivers/local.storage.test.js +106 -0
- package/dist/storage/drivers/s3.storage.d.ts +12 -0
- package/dist/storage/drivers/s3.storage.js +138 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +21 -0
- package/dist/storage/storage.module.d.ts +11 -0
- package/dist/storage/storage.module.js +81 -0
- package/dist/storage/storage.module.test.d.ts +1 -0
- package/dist/storage/storage.module.test.js +113 -0
- package/dist/storage/storage.service.d.ts +7 -0
- package/dist/storage/storage.service.js +6 -0
- package/dist/storage/storage.types.d.ts +42 -0
- package/dist/storage/storage.types.js +2 -0
- package/package.json +12 -2
|
@@ -0,0 +1,81 @@
|
|
|
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 StorageModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.StorageModule = exports.STORAGE_OPTIONS_TOKEN = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const storage_service_1 = require("./storage.service");
|
|
13
|
+
const local_storage_1 = require("./drivers/local.storage");
|
|
14
|
+
const s3_storage_1 = require("./drivers/s3.storage");
|
|
15
|
+
exports.STORAGE_OPTIONS_TOKEN = 'STORAGE_OPTIONS_TOKEN';
|
|
16
|
+
let StorageModule = StorageModule_1 = class StorageModule {
|
|
17
|
+
static register(options) {
|
|
18
|
+
const storageServiceProvider = {
|
|
19
|
+
provide: storage_service_1.StorageService,
|
|
20
|
+
useFactory: () => {
|
|
21
|
+
return this.createServiceInstance(options);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
module: StorageModule_1,
|
|
26
|
+
providers: [
|
|
27
|
+
{ provide: exports.STORAGE_OPTIONS_TOKEN, useValue: options },
|
|
28
|
+
storageServiceProvider,
|
|
29
|
+
],
|
|
30
|
+
exports: [storage_service_1.StorageService],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
static registerAsync(options) {
|
|
34
|
+
const storageServiceProvider = {
|
|
35
|
+
provide: storage_service_1.StorageService,
|
|
36
|
+
useFactory: async (opts) => {
|
|
37
|
+
return this.createServiceInstance(opts);
|
|
38
|
+
},
|
|
39
|
+
inject: [exports.STORAGE_OPTIONS_TOKEN],
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
module: StorageModule_1,
|
|
43
|
+
imports: [],
|
|
44
|
+
providers: [
|
|
45
|
+
{
|
|
46
|
+
provide: exports.STORAGE_OPTIONS_TOKEN,
|
|
47
|
+
useFactory: options.useFactory,
|
|
48
|
+
inject: options.inject || [],
|
|
49
|
+
},
|
|
50
|
+
storageServiceProvider,
|
|
51
|
+
],
|
|
52
|
+
exports: [storage_service_1.StorageService],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
static createServiceInstance(options) {
|
|
56
|
+
switch (options.driver) {
|
|
57
|
+
case 'local':
|
|
58
|
+
if (!options.local) {
|
|
59
|
+
throw new Error('Configuração de "local" não fornecida para o driver local.');
|
|
60
|
+
}
|
|
61
|
+
return new local_storage_1.LocalStorageService(options.local);
|
|
62
|
+
case 's3':
|
|
63
|
+
if (!options.s3) {
|
|
64
|
+
throw new Error('Configuração de "s3" não fornecida para o driver s3.');
|
|
65
|
+
}
|
|
66
|
+
return new s3_storage_1.S3StorageService(options.s3, false);
|
|
67
|
+
case 'r2':
|
|
68
|
+
if (!options.r2) {
|
|
69
|
+
throw new Error('Configuração de "r2" não fornecida para o driver r2.');
|
|
70
|
+
}
|
|
71
|
+
return new s3_storage_1.S3StorageService(options.r2, true);
|
|
72
|
+
default:
|
|
73
|
+
throw new Error(`Driver de storage não suportado: ${options.driver}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports.StorageModule = StorageModule;
|
|
78
|
+
exports.StorageModule = StorageModule = StorageModule_1 = __decorate([
|
|
79
|
+
(0, common_1.Global)(),
|
|
80
|
+
(0, common_1.Module)({})
|
|
81
|
+
], StorageModule);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const node_test_1 = require("node:test");
|
|
37
|
+
const assert = __importStar(require("node:assert"));
|
|
38
|
+
const storage_module_1 = require("./storage.module");
|
|
39
|
+
const storage_service_1 = require("./storage.service");
|
|
40
|
+
const local_storage_1 = require("./drivers/local.storage");
|
|
41
|
+
const s3_storage_1 = require("./drivers/s3.storage");
|
|
42
|
+
(0, node_test_1.describe)('StorageModule', () => {
|
|
43
|
+
(0, node_test_1.test)('deve instanciar LocalStorageService quando configurado driver local', () => {
|
|
44
|
+
const dynamicModule = storage_module_1.StorageModule.register({
|
|
45
|
+
driver: 'local',
|
|
46
|
+
local: {
|
|
47
|
+
storagePath: './tmp-test-module',
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
assert.ok(dynamicModule.providers);
|
|
51
|
+
const serviceProvider = dynamicModule.exports?.find(e => e === storage_service_1.StorageService);
|
|
52
|
+
assert.ok(serviceProvider);
|
|
53
|
+
const factoryProvider = dynamicModule.providers?.find((p) => p.provide === storage_service_1.StorageService);
|
|
54
|
+
assert.ok(factoryProvider);
|
|
55
|
+
assert.ok(factoryProvider.useFactory);
|
|
56
|
+
const instance = factoryProvider.useFactory();
|
|
57
|
+
assert.ok(instance instanceof local_storage_1.LocalStorageService);
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.test)('deve instanciar S3StorageService quando configurado driver s3', () => {
|
|
60
|
+
const dynamicModule = storage_module_1.StorageModule.register({
|
|
61
|
+
driver: 's3',
|
|
62
|
+
s3: {
|
|
63
|
+
bucket: 'test-bucket',
|
|
64
|
+
accessKeyId: 'key',
|
|
65
|
+
secretAccessKey: 'secret',
|
|
66
|
+
region: 'us-east-1',
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const factoryProvider = dynamicModule.providers?.find((p) => p.provide === storage_service_1.StorageService);
|
|
70
|
+
assert.ok(factoryProvider);
|
|
71
|
+
const instance = factoryProvider.useFactory();
|
|
72
|
+
assert.ok(instance instanceof s3_storage_1.S3StorageService);
|
|
73
|
+
});
|
|
74
|
+
(0, node_test_1.test)('deve instanciar S3StorageService quando configurado driver r2', () => {
|
|
75
|
+
const dynamicModule = storage_module_1.StorageModule.register({
|
|
76
|
+
driver: 'r2',
|
|
77
|
+
r2: {
|
|
78
|
+
bucket: 'test-bucket',
|
|
79
|
+
accountId: 'account-id',
|
|
80
|
+
accessKeyId: 'key',
|
|
81
|
+
secretAccessKey: 'secret',
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
const factoryProvider = dynamicModule.providers?.find((p) => p.provide === storage_service_1.StorageService);
|
|
85
|
+
assert.ok(factoryProvider);
|
|
86
|
+
const instance = factoryProvider.useFactory();
|
|
87
|
+
assert.ok(instance instanceof s3_storage_1.S3StorageService);
|
|
88
|
+
});
|
|
89
|
+
(0, node_test_1.test)('deve lançar erro se configurações do driver local não forem fornecidas', () => {
|
|
90
|
+
const dynamicModule = storage_module_1.StorageModule.register({ driver: 'local' });
|
|
91
|
+
const factoryProvider = dynamicModule.providers?.find((p) => p.provide === storage_service_1.StorageService);
|
|
92
|
+
assert.ok(factoryProvider);
|
|
93
|
+
assert.throws(() => {
|
|
94
|
+
factoryProvider.useFactory();
|
|
95
|
+
}, /Configuração de "local" não fornecida/);
|
|
96
|
+
});
|
|
97
|
+
(0, node_test_1.test)('deve lançar erro se configurações do driver s3 não forem fornecidas', () => {
|
|
98
|
+
const dynamicModule = storage_module_1.StorageModule.register({ driver: 's3' });
|
|
99
|
+
const factoryProvider = dynamicModule.providers?.find((p) => p.provide === storage_service_1.StorageService);
|
|
100
|
+
assert.ok(factoryProvider);
|
|
101
|
+
assert.throws(() => {
|
|
102
|
+
factoryProvider.useFactory();
|
|
103
|
+
}, /Configuração de "s3" não fornecida/);
|
|
104
|
+
});
|
|
105
|
+
(0, node_test_1.test)('deve lançar erro se configurações do driver r2 não forem fornecidas', () => {
|
|
106
|
+
const dynamicModule = storage_module_1.StorageModule.register({ driver: 'r2' });
|
|
107
|
+
const factoryProvider = dynamicModule.providers?.find((p) => p.provide === storage_service_1.StorageService);
|
|
108
|
+
assert.ok(factoryProvider);
|
|
109
|
+
assert.throws(() => {
|
|
110
|
+
factoryProvider.useFactory();
|
|
111
|
+
}, /Configuração de "r2" não fornecida/);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { StorageFile, UploadOptions, UploadResult } from './storage.types';
|
|
2
|
+
export declare abstract class StorageService {
|
|
3
|
+
abstract upload(file: StorageFile, options?: UploadOptions): Promise<UploadResult>;
|
|
4
|
+
abstract delete(key: string): Promise<void>;
|
|
5
|
+
abstract getUrl(key: string): Promise<string>;
|
|
6
|
+
abstract getSignedUrl(key: string, expiresIn?: number): Promise<string>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type StorageDriver = 'local' | 's3' | 'r2';
|
|
2
|
+
export interface LocalStorageOptions {
|
|
3
|
+
storagePath: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface S3StorageOptions {
|
|
7
|
+
bucket: string;
|
|
8
|
+
region?: string;
|
|
9
|
+
accessKeyId: string;
|
|
10
|
+
secretAccessKey: string;
|
|
11
|
+
endpoint?: string;
|
|
12
|
+
forcePathStyle?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface R2StorageOptions {
|
|
15
|
+
bucket: string;
|
|
16
|
+
accountId: string;
|
|
17
|
+
accessKeyId: string;
|
|
18
|
+
secretAccessKey: string;
|
|
19
|
+
publicUrl?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface StorageOptions {
|
|
22
|
+
driver: StorageDriver;
|
|
23
|
+
local?: LocalStorageOptions;
|
|
24
|
+
s3?: S3StorageOptions;
|
|
25
|
+
r2?: R2StorageOptions;
|
|
26
|
+
}
|
|
27
|
+
export interface StorageFile {
|
|
28
|
+
originalname: string;
|
|
29
|
+
mimetype: string;
|
|
30
|
+
buffer: Buffer;
|
|
31
|
+
size: number;
|
|
32
|
+
}
|
|
33
|
+
export interface UploadOptions {
|
|
34
|
+
path?: string;
|
|
35
|
+
filename?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface UploadResult {
|
|
38
|
+
key: string;
|
|
39
|
+
url: string;
|
|
40
|
+
size: number;
|
|
41
|
+
mimetype: string;
|
|
42
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devstroupe/devkit-nest",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "DevsTroupe Development Kit — NestJS base classes: BaseRepository, BaseCrudController and query parsers",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -29,12 +29,18 @@
|
|
|
29
29
|
"main": "dist/index.js",
|
|
30
30
|
"types": "dist/index.d.ts",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@
|
|
32
|
+
"@aws-sdk/client-s3": "^3.500.0",
|
|
33
|
+
"@aws-sdk/s3-request-presigner": "^3.500.0",
|
|
34
|
+
"jsonwebtoken": "^9.0.2",
|
|
35
|
+
"@devstroupe/devkit-core": "1.1.0"
|
|
33
36
|
},
|
|
34
37
|
"peerDependencies": {
|
|
35
38
|
"@nestjs/common": "^10.0.0 || ^11.0.0",
|
|
36
39
|
"@nestjs/core": "^10.0.0 || ^11.0.0",
|
|
37
40
|
"@nestjs/swagger": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0",
|
|
41
|
+
"@nestjs/websockets": "^10.0.0 || ^11.0.0",
|
|
42
|
+
"socket.io": "^4.7.0",
|
|
43
|
+
"rxjs": "^7.0.0",
|
|
38
44
|
"typeorm": "^0.3.0",
|
|
39
45
|
"reflect-metadata": "^0.1.13 || ^0.2.0"
|
|
40
46
|
},
|
|
@@ -42,7 +48,11 @@
|
|
|
42
48
|
"@nestjs/common": "^10.3.8",
|
|
43
49
|
"@nestjs/core": "^10.3.8",
|
|
44
50
|
"@nestjs/swagger": "^7.3.1",
|
|
51
|
+
"@nestjs/websockets": "^10.3.8",
|
|
52
|
+
"@types/jsonwebtoken": "^9.0.6",
|
|
45
53
|
"@types/node": "^20.11.0",
|
|
54
|
+
"rxjs": "^7.8.1",
|
|
55
|
+
"socket.io": "^4.7.5",
|
|
46
56
|
"typeorm": "^0.3.17",
|
|
47
57
|
"reflect-metadata": "^0.1.13",
|
|
48
58
|
"typescript": "^5.4.5"
|