@sandumo/nestjs-storage-module 1.0.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/README.md +24 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/storage.module.d.ts +10 -0
- package/dist/storage.module.d.ts.map +1 -0
- package/dist/storage.module.js +39 -0
- package/dist/storage.module.js.map +1 -0
- package/dist/storage.options.d.ts +10 -0
- package/dist/storage.options.d.ts.map +1 -0
- package/dist/storage.options.js +5 -0
- package/dist/storage.options.js.map +1 -0
- package/dist/storage.service.d.ts +27 -0
- package/dist/storage.service.d.ts.map +1 -0
- package/dist/storage.service.js +179 -0
- package/dist/storage.service.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# @sandumo/nestjs-storage-module
|
|
2
|
+
|
|
3
|
+
This package provides a NestJS module for interacting with storage.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @sandumo/nestjs-storage-module
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { StorageModule } from '@sandumo/nestjs-storage-module';
|
|
15
|
+
|
|
16
|
+
@Module({
|
|
17
|
+
imports: [StorageModule.forRootAsync({
|
|
18
|
+
s3AccessKeyId: 'your-api-key',
|
|
19
|
+
s3SecretAccessKey: 'your-api-key',
|
|
20
|
+
s3Endpoint: 'your-api-key',
|
|
21
|
+
s3Bucket: 'your-api-key',
|
|
22
|
+
})]
|
|
23
|
+
})
|
|
24
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StorageService = exports.StorageModule = void 0;
|
|
4
|
+
const storage_module_1 = require("./storage.module");
|
|
5
|
+
Object.defineProperty(exports, "StorageModule", { enumerable: true, get: function () { return storage_module_1.StorageModule; } });
|
|
6
|
+
const storage_service_1 = require("./storage.service");
|
|
7
|
+
Object.defineProperty(exports, "StorageService", { enumerable: true, get: function () { return storage_service_1.StorageService; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAiD;AAGxC,8FAHA,8BAAa,OAGA;AAFtB,uDAAmD;AAE3B,+FAFf,gCAAc,OAEe"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { StorageModuleOptions } from './storage.options';
|
|
3
|
+
export declare class StorageModule {
|
|
4
|
+
static forRootAsync(options: {
|
|
5
|
+
useFactory: (...args: any[]) => Promise<StorageModuleOptions> | StorageModuleOptions;
|
|
6
|
+
inject?: any[];
|
|
7
|
+
imports?: any[];
|
|
8
|
+
}): DynamicModule;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=storage.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.module.d.ts","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAA0B,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,qBAKa,aAAa;IACxB,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;QAC3B,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;QACrF,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;KACjB,GAAG,aAAa;CAgBlB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
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 = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const storage_service_1 = require("./storage.service");
|
|
13
|
+
const storage_options_1 = require("./storage.options");
|
|
14
|
+
let StorageModule = StorageModule_1 = class StorageModule {
|
|
15
|
+
static forRootAsync(options) {
|
|
16
|
+
const providers = [
|
|
17
|
+
{
|
|
18
|
+
provide: storage_options_1.STORAGE_MODULE_OPTIONS,
|
|
19
|
+
useFactory: options.useFactory,
|
|
20
|
+
inject: options.inject || [],
|
|
21
|
+
imports: options.imports || [],
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
return {
|
|
25
|
+
providers: providers,
|
|
26
|
+
exports: providers,
|
|
27
|
+
module: StorageModule_1,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
StorageModule = StorageModule_1 = __decorate([
|
|
32
|
+
(0, common_1.Global)(),
|
|
33
|
+
(0, common_1.Module)({
|
|
34
|
+
providers: [storage_service_1.StorageService],
|
|
35
|
+
exports: [storage_service_1.StorageService],
|
|
36
|
+
})
|
|
37
|
+
], StorageModule);
|
|
38
|
+
exports.StorageModule = StorageModule;
|
|
39
|
+
//# sourceMappingURL=storage.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.module.js","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA+D;AAC/D,uDAAmD;AACnD,uDAAiF;AAO1E,IAAM,aAAa,qBAAnB,MAAM,aAAa;IACxB,MAAM,CAAC,YAAY,CAAC,OAInB;QACC,MAAM,SAAS,GAAG;YAChB;gBACE,OAAO,EAAE,wCAAsB;gBAC/B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;gBAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;aAC/B;SACF,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,eAAa;SACtB,CAAC;IACJ,CAAC;CACF,CAAA;AArBY,aAAa;IALzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,gCAAc,CAAC;QAC3B,OAAO,EAAE,CAAC,gCAAc,CAAC;KAC1B,CAAC;GACW,aAAa,CAqBzB;AArBY,sCAAa"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface StorageModuleOptions {
|
|
2
|
+
s3AccessKeyId: string;
|
|
3
|
+
s3SecretAccessKey: string;
|
|
4
|
+
s3Bucket: string;
|
|
5
|
+
s3Endpoint: string;
|
|
6
|
+
region?: string;
|
|
7
|
+
rootPath?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const STORAGE_MODULE_OPTIONS: unique symbol;
|
|
10
|
+
//# sourceMappingURL=storage.options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.options.d.ts","sourceRoot":"","sources":["../src/storage.options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,sBAAsB,eAAmC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.options.js","sourceRoot":"","sources":["../src/storage.options.ts"],"names":[],"mappings":";;;AASa,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
/// <reference types="multer" />
|
|
5
|
+
import { ReadStream } from 'fs';
|
|
6
|
+
import { Stream } from 'stream';
|
|
7
|
+
import { StorageModuleOptions } from './storage.options';
|
|
8
|
+
import { Readable } from 'stream';
|
|
9
|
+
export declare class StorageService {
|
|
10
|
+
private options;
|
|
11
|
+
private s3Client;
|
|
12
|
+
private BUCKET;
|
|
13
|
+
private ROOT_PATH;
|
|
14
|
+
private _isUp;
|
|
15
|
+
constructor(options: StorageModuleOptions);
|
|
16
|
+
private isUp;
|
|
17
|
+
getObject(key: string): Promise<Readable>;
|
|
18
|
+
putObject(blobName: string, blob: Buffer): Promise<any>;
|
|
19
|
+
getStream(key: string): Promise<Stream>;
|
|
20
|
+
putStream(key: string, stream: ReadStream): Promise<any>;
|
|
21
|
+
private createBucket;
|
|
22
|
+
renameFile(oldPath: string, newPath: string): Promise<void>;
|
|
23
|
+
getRandomKey(): string;
|
|
24
|
+
uploadFiles(files: Express.Multer.File[], getFilepath?: (file: Express.Multer.File) => string): Promise<any[]>;
|
|
25
|
+
uploadFile(file: Express.Multer.File, filepath?: string): Promise<any>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=storage.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":";;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGhC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAA0B,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,qBACa,cAAc;IAMmB,OAAO,CAAC,OAAO;IAL3D,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAU;gBAE6B,OAAO,EAAE,oBAAoB;IAsBjF,OAAO,CAAC,IAAI;IAIN,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAWzC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAcvD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;YAchD,YAAY;IAgBpB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjE,YAAY,IAAI,MAAM;IAItB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAexG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAY7E"}
|
|
@@ -0,0 +1,179 @@
|
|
|
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 __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
9
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
10
|
+
};
|
|
11
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
12
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
13
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
14
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
15
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
16
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
17
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
21
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
22
|
+
var m = o[Symbol.asyncIterator], i;
|
|
23
|
+
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);
|
|
24
|
+
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); }); }; }
|
|
25
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
26
|
+
};
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.StorageService = void 0;
|
|
29
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
30
|
+
const common_1 = require("@nestjs/common");
|
|
31
|
+
const storage_options_1 = require("./storage.options");
|
|
32
|
+
const crypto_1 = require("crypto");
|
|
33
|
+
let StorageService = class StorageService {
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.options = options;
|
|
36
|
+
console.log('[x] epta here nah');
|
|
37
|
+
try {
|
|
38
|
+
this.s3Client = new client_s3_1.S3Client({
|
|
39
|
+
credentials: {
|
|
40
|
+
accessKeyId: this.options.s3AccessKeyId,
|
|
41
|
+
secretAccessKey: this.options.s3SecretAccessKey,
|
|
42
|
+
},
|
|
43
|
+
endpoint: this.options.s3Endpoint,
|
|
44
|
+
region: this.options.region || 'us-east-1',
|
|
45
|
+
forcePathStyle: true,
|
|
46
|
+
});
|
|
47
|
+
this.BUCKET = this.options.s3Bucket || 'default';
|
|
48
|
+
this.ROOT_PATH = this.options.rootPath ? this.options.rootPath + (this.options.rootPath.endsWith('/') ? '' : '/') : '';
|
|
49
|
+
this.createBucket();
|
|
50
|
+
this._isUp = true;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error(error);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
isUp() {
|
|
57
|
+
return this._isUp;
|
|
58
|
+
}
|
|
59
|
+
getObject(key) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
if (!this.isUp()) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
console.log('[x] getObject', key);
|
|
65
|
+
const command = new client_s3_1.GetObjectCommand({ Bucket: this.BUCKET, Key: key });
|
|
66
|
+
const response = yield this.s3Client.send(command);
|
|
67
|
+
return response.Body;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
putObject(blobName, blob) {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
if (!this.isUp()) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const command = new client_s3_1.PutObjectCommand({
|
|
76
|
+
Bucket: this.BUCKET,
|
|
77
|
+
Key: blobName,
|
|
78
|
+
Body: blob,
|
|
79
|
+
});
|
|
80
|
+
return this.s3Client.send(command);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
getStream(key) {
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
console.log('[x] getStream', key);
|
|
86
|
+
const response = yield this.getObject(key);
|
|
87
|
+
return response;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
putStream(key, stream) {
|
|
91
|
+
var stream_1, stream_1_1;
|
|
92
|
+
var e_1, _a;
|
|
93
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
+
if (!this.isUp()) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const chunks = [];
|
|
98
|
+
try {
|
|
99
|
+
for (stream_1 = __asyncValues(stream); stream_1_1 = yield stream_1.next(), !stream_1_1.done;) {
|
|
100
|
+
const chunk = stream_1_1.value;
|
|
101
|
+
chunks.push(chunk);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
105
|
+
finally {
|
|
106
|
+
try {
|
|
107
|
+
if (stream_1_1 && !stream_1_1.done && (_a = stream_1.return)) yield _a.call(stream_1);
|
|
108
|
+
}
|
|
109
|
+
finally { if (e_1) throw e_1.error; }
|
|
110
|
+
}
|
|
111
|
+
const fileBuffer = Buffer.concat(chunks);
|
|
112
|
+
return this.putObject(key, fileBuffer);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
createBucket() {
|
|
116
|
+
var _a;
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
if (!this.isUp()) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const command = new client_s3_1.ListBucketsCommand({});
|
|
122
|
+
const response = yield this.s3Client.send(command);
|
|
123
|
+
const bucketExists = (_a = response.Buckets) === null || _a === void 0 ? void 0 : _a.some((b) => b.Name === this.BUCKET);
|
|
124
|
+
if (!bucketExists) {
|
|
125
|
+
console.log(`Creating bucket ${this.BUCKET}`);
|
|
126
|
+
const createBucketCommand = new client_s3_1.CreateBucketCommand({ Bucket: this.BUCKET });
|
|
127
|
+
return this.s3Client.send(createBucketCommand);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
renameFile(oldPath, newPath) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
yield this.s3Client.send(new client_s3_1.CopyObjectCommand({
|
|
134
|
+
Bucket: this.BUCKET,
|
|
135
|
+
CopySource: `${this.BUCKET}/${this.ROOT_PATH}${oldPath}`,
|
|
136
|
+
Key: `${this.ROOT_PATH}${newPath}`,
|
|
137
|
+
}));
|
|
138
|
+
yield this.s3Client.send(new client_s3_1.DeleteObjectCommand({
|
|
139
|
+
Bucket: this.BUCKET,
|
|
140
|
+
Key: `${this.ROOT_PATH}${oldPath}`,
|
|
141
|
+
}));
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
getRandomKey() {
|
|
145
|
+
return (0, crypto_1.randomBytes)(32).toString('hex');
|
|
146
|
+
}
|
|
147
|
+
uploadFiles(files, getFilepath) {
|
|
148
|
+
return Promise.all(files.map((file) => __awaiter(this, void 0, void 0, function* () {
|
|
149
|
+
const filepath = `${this.ROOT_PATH}${getFilepath ? getFilepath(file) : `unnamed/${this.getRandomKey()}.${file.originalname.split('.').pop()}`}`;
|
|
150
|
+
yield this.putObject(filepath, file.buffer);
|
|
151
|
+
return {
|
|
152
|
+
name: file.originalname,
|
|
153
|
+
path: filepath,
|
|
154
|
+
type: file.mimetype,
|
|
155
|
+
size: file.size,
|
|
156
|
+
};
|
|
157
|
+
})));
|
|
158
|
+
}
|
|
159
|
+
uploadFile(file, filepath) {
|
|
160
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
+
filepath = filepath
|
|
162
|
+
? `${this.ROOT_PATH}${filepath}`
|
|
163
|
+
: `${this.ROOT_PATH}unnamed/${this.getRandomKey()}.${file.originalname.split('.').pop()}`;
|
|
164
|
+
yield this.putObject(filepath, file.buffer);
|
|
165
|
+
return {
|
|
166
|
+
name: file.originalname,
|
|
167
|
+
path: filepath,
|
|
168
|
+
type: file.mimetype,
|
|
169
|
+
size: file.size,
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
StorageService = __decorate([
|
|
175
|
+
(0, common_1.Injectable)(),
|
|
176
|
+
__param(0, (0, common_1.Inject)(storage_options_1.STORAGE_MODULE_OPTIONS))
|
|
177
|
+
], StorageService);
|
|
178
|
+
exports.StorageService = StorageService;
|
|
179
|
+
//# sourceMappingURL=storage.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sandumo/nestjs-storage-module",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "./dist/index.js",
|
|
5
|
+
"types": "./dist/index.d.ts",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsc --watch",
|
|
12
|
+
"lint": "eslint ./src/**/*.{ts,tsx}"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@types/multer": "^1.4.7",
|
|
16
|
+
"eslint": "^7.32.0",
|
|
17
|
+
"eslint-config-custom": "workspace:*",
|
|
18
|
+
"tsconfig": "workspace:*",
|
|
19
|
+
"typescript": "^4.5.2"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@aws-sdk/client-s3": "^3.717.0",
|
|
23
|
+
"@nestjs/common": "^9.0.0",
|
|
24
|
+
"aws-sdk": "^2.1692.0"
|
|
25
|
+
},
|
|
26
|
+
"description": "This package provides a NestJS module for storage.",
|
|
27
|
+
"keywords": [
|
|
28
|
+
"storage",
|
|
29
|
+
"nestjs",
|
|
30
|
+
"module"
|
|
31
|
+
],
|
|
32
|
+
"homepage": "https://github.com/sandumo/packages/blob/main/packages/nestjs-storage-module/README.md",
|
|
33
|
+
"author": {
|
|
34
|
+
"name": "Sandu Morari",
|
|
35
|
+
"email": "sandu.m.md@gmail.com",
|
|
36
|
+
"url": "https://github.com/sandumorari"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/sandumo/packages.git"
|
|
41
|
+
}
|
|
42
|
+
}
|