@cuencor/backend-storage 0.0.1 → 0.0.2
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/lib/s3-storage.provider.d.ts +1 -0
- package/dist/lib/s3-storage.provider.d.ts.map +1 -1
- package/dist/lib/s3-storage.provider.js +13 -0
- package/dist/lib/s3-storage.provider.js.map +1 -1
- package/dist/lib/storage.interface.d.ts +3 -0
- package/dist/lib/storage.interface.d.ts.map +1 -1
- package/dist/lib/storage.module.d.ts.map +1 -1
- package/dist/lib/storage.module.js +1 -0
- package/dist/lib/storage.module.js.map +1 -1
- package/dist/lib/storage.service.d.ts +1 -0
- package/dist/lib/storage.service.d.ts.map +1 -1
- package/dist/lib/storage.service.js +3 -0
- package/dist/lib/storage.service.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/s3-storage.provider.ts +16 -0
- package/src/lib/storage.interface.ts +4 -0
- package/src/lib/storage.module.ts +2 -1
- package/src/lib/storage.service.ts +4 -0
|
@@ -18,6 +18,7 @@ export declare class S3StorageProvider implements IStorageProvider {
|
|
|
18
18
|
private readonly logger;
|
|
19
19
|
constructor(opts: S3StorageOptions);
|
|
20
20
|
uploadFile(buffer: Buffer, folder: string, contentType: string, extension: string): Promise<UploadResult>;
|
|
21
|
+
putBuffer(key: string, buffer: Buffer, contentType: string): Promise<string>;
|
|
21
22
|
getFileBuffer(key: string): Promise<Buffer>;
|
|
22
23
|
deleteFile(key: string): Promise<void>;
|
|
23
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-storage.provider.d.ts","sourceRoot":"","sources":["../../src/lib/s3-storage.provider.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,iBAAkB,YAAW,gBAAgB;IAI5C,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;gBAEhC,IAAI,EAAE,gBAAgB;IAY7C,UAAU,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC;IAmBlB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS7C"}
|
|
1
|
+
{"version":3,"file":"s3-storage.provider.d.ts","sourceRoot":"","sources":["../../src/lib/s3-storage.provider.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,iBAAkB,YAAW,gBAAgB;IAI5C,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;gBAEhC,IAAI,EAAE,gBAAgB;IAY7C,UAAU,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC;IAmBlB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB5E,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS7C"}
|
|
@@ -34,6 +34,19 @@ class S3StorageProvider {
|
|
|
34
34
|
this.logger.debug(`Uploaded: ${url}`);
|
|
35
35
|
return { key, url };
|
|
36
36
|
}
|
|
37
|
+
async putBuffer(key, buffer, contentType) {
|
|
38
|
+
await this.client.send(new client_s3_1.PutObjectCommand({
|
|
39
|
+
Bucket: this.opts.bucket,
|
|
40
|
+
Key: key,
|
|
41
|
+
Body: buffer,
|
|
42
|
+
ContentType: contentType,
|
|
43
|
+
ContentDisposition: 'inline',
|
|
44
|
+
ACL: 'public-read',
|
|
45
|
+
}));
|
|
46
|
+
const url = `${this.opts.publicBase}/${key}`;
|
|
47
|
+
this.logger.debug(`putBuffer: ${url}`);
|
|
48
|
+
return url;
|
|
49
|
+
}
|
|
37
50
|
async getFileBuffer(key) {
|
|
38
51
|
const response = await this.client.send(new client_s3_1.GetObjectCommand({ Bucket: this.opts.bucket, Key: key }));
|
|
39
52
|
const stream = response.Body;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-storage.provider.js","sourceRoot":"","sources":["../../src/lib/s3-storage.provider.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AACxC,kDAK4B;AAC5B,mCAAoC;AAiBpC,MAAa,iBAAiB;IAIC;IAHZ,MAAM,CAAW;IACjB,MAAM,GAAG,IAAI,eAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE7D,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAQ,CAAC;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE;gBACX,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;aACtC;YACD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAc,EACd,MAAc,EACd,WAAmB,EACnB,SAAiB;QAEjB,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,IAAA,mBAAU,GAAE,IAAI,SAAS,EAAE,CAAC;QAErD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACpB,IAAI,4BAAgB,CAAC;YACnB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;YACxB,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,WAAW;YACxB,kBAAkB,EAAE,QAAQ;YAC5B,GAAG,EAAE,aAAa;SACnB,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACtC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,IAAI,4BAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAC7D,CAAC;QACF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAA6B,CAAC;QACtD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAA8B,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACpB,IAAI,+BAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAChE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"s3-storage.provider.js","sourceRoot":"","sources":["../../src/lib/s3-storage.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,10 @@ export interface UploadResult {
|
|
|
5
5
|
}
|
|
6
6
|
/** Common interface for any object-storage backend (Contabo, MinIO, AWS S3, etc.) */
|
|
7
7
|
export interface IStorageProvider {
|
|
8
|
+
/** Upload a file using an auto-generated UUID key under the given folder. */
|
|
8
9
|
uploadFile(buffer: Buffer, folder: string, contentType: string, extension: string): Promise<UploadResult>;
|
|
10
|
+
/** Upload a buffer to a specific, deterministic key. Returns the public URL. */
|
|
11
|
+
putBuffer(key: string, buffer: Buffer, contentType: string): Promise<string>;
|
|
9
12
|
getFileBuffer(key: string): Promise<Buffer>;
|
|
10
13
|
deleteFile(key: string): Promise<void>;
|
|
11
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.interface.d.ts","sourceRoot":"","sources":["../../src/lib/storage.interface.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CACR,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC"}
|
|
1
|
+
{"version":3,"file":"storage.interface.d.ts","sourceRoot":"","sources":["../../src/lib/storage.interface.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,UAAU,CACR,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB,gFAAgF;IAChF,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7E,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.module.d.ts","sourceRoot":"","sources":["../../src/lib/storage.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAIvD,OAAO,EAAqB,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE5E,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,QAAQ,EAAE,SAAS,GAAG,gBAAgB,CAAC;CACxC;AAED,qBACa,aAAa;IACxB;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAE,oBAA8C,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"storage.module.d.ts","sourceRoot":"","sources":["../../src/lib/storage.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAIvD,OAAO,EAAqB,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE5E,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,QAAQ,EAAE,SAAS,GAAG,gBAAgB,CAAC;CACxC;AAED,qBACa,aAAa;IACxB;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAE,oBAA8C,GAAG,aAAa;CA8BxF"}
|
|
@@ -26,6 +26,7 @@ let StorageModule = StorageModule_1 = class StorageModule {
|
|
|
26
26
|
static register(options = { provider: 'contabo' }) {
|
|
27
27
|
return {
|
|
28
28
|
module: StorageModule_1,
|
|
29
|
+
imports: [config_1.ConfigModule],
|
|
29
30
|
providers: [
|
|
30
31
|
{
|
|
31
32
|
provide: storage_interface_1.STORAGE_PROVIDER,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.module.js","sourceRoot":"","sources":["../../src/lib/storage.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,
|
|
1
|
+
{"version":3,"file":"storage.module.js","sourceRoot":"","sources":["../../src/lib/storage.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,2CAA6D;AAC7D,uDAAmD;AACnD,2DAAuD;AACvD,+DAA4E;AAQrE,IAAM,aAAa,qBAAnB,MAAM,aAAa;IACxB;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,CAAC,UAAgC,EAAE,QAAQ,EAAE,SAAS,EAAE;QACrE,OAAO;YACL,MAAM,EAAE,eAAa;YACrB,OAAO,EAAE,CAAC,qBAAY,CAAC;YACvB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,oCAAgB;oBACzB,MAAM,EAAE,CAAC,sBAAa,CAAC;oBACvB,UAAU,EAAE,CAAC,MAAqB,EAAqB,EAAE;wBACvD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;4BACnC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAS,gBAAgB,CAAC,CAAC;4BAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAS,mBAAmB,CAAC,CAAC;4BAChE,OAAO,IAAI,uCAAiB,CAAC;gCAC3B,QAAQ,EAAS,gCAAgC;gCACjD,MAAM,EAAW,WAAW;gCAC5B,WAAW,EAAM,MAAM,CAAC,UAAU,CAAS,YAAY,CAAC;gCACxD,eAAe,EAAE,MAAM,CAAC,UAAU,CAAS,gBAAgB,CAAC;gCAC5D,MAAM;gCACN,UAAU,EAAO,kCAAkC,QAAQ,IAAI,MAAM,EAAE;gCACvE,cAAc,EAAG,IAAI;6BACtB,CAAC,CAAC;wBACL,CAAC;wBACD,OAAO,IAAI,uCAAiB,CAAC,OAAO,CAAC,QAA4B,CAAC,CAAC;oBACrE,CAAC;iBACF;gBACD,gCAAc;aACf;YACD,OAAO,EAAE,CAAC,gCAAc,CAAC;SAC1B,CAAC;IACJ,CAAC;CACF,CAAA;AAxCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,aAAa,CAwCzB"}
|
|
@@ -7,6 +7,7 @@ export declare class StorageService {
|
|
|
7
7
|
private readonly provider;
|
|
8
8
|
constructor(provider: IStorageProvider);
|
|
9
9
|
uploadFile(buffer: Buffer, folder: string, contentType: string, extension: string): Promise<UploadResult>;
|
|
10
|
+
putBuffer(key: string, buffer: Buffer, contentType: string): Promise<string>;
|
|
10
11
|
getFileBuffer(key: string): Promise<Buffer>;
|
|
11
12
|
deleteFile(key: string): Promise<void>;
|
|
12
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../src/lib/storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEvF;;;GAGG;AACH,qBACa,cAAc;IAEG,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAGvE,UAAU,CACR,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC;IAIxB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGvC"}
|
|
1
|
+
{"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../src/lib/storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,gBAAgB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEvF;;;GAGG;AACH,qBACa,cAAc;IAEG,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAGvE,UAAU,CACR,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC;IAIxB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5E,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGvC"}
|
|
@@ -27,6 +27,9 @@ let StorageService = class StorageService {
|
|
|
27
27
|
uploadFile(buffer, folder, contentType, extension) {
|
|
28
28
|
return this.provider.uploadFile(buffer, folder, contentType, extension);
|
|
29
29
|
}
|
|
30
|
+
putBuffer(key, buffer, contentType) {
|
|
31
|
+
return this.provider.putBuffer(key, buffer, contentType);
|
|
32
|
+
}
|
|
30
33
|
getFileBuffer(key) {
|
|
31
34
|
return this.provider.getFileBuffer(key);
|
|
32
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../src/lib/storage.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAAuF;AAEvF;;;GAGG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAc;IAEoB;IAD7C,YAC6C,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IACpE,CAAC;IAEJ,UAAU,CACR,MAAc,EACd,MAAc,EACd,WAAmB,EACnB,SAAiB;QAEjB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../src/lib/storage.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAAuF;AAEvF;;;GAGG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAc;IAEoB;IAD7C,YAC6C,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IACpE,CAAC;IAEJ,UAAU,CACR,MAAc,EACd,MAAc,EACd,WAAmB,EACnB,SAAiB;QAEjB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,MAAc,EAAE,WAAmB;QACxD,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;AAzBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,oCAAgB,CAAC,CAAA;;GAFhB,cAAc,CAyB1B"}
|
package/package.json
CHANGED
|
@@ -62,6 +62,22 @@ export class S3StorageProvider implements IStorageProvider {
|
|
|
62
62
|
return { key, url };
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
async putBuffer(key: string, buffer: Buffer, contentType: string): Promise<string> {
|
|
66
|
+
await this.client.send(
|
|
67
|
+
new PutObjectCommand({
|
|
68
|
+
Bucket: this.opts.bucket,
|
|
69
|
+
Key: key,
|
|
70
|
+
Body: buffer,
|
|
71
|
+
ContentType: contentType,
|
|
72
|
+
ContentDisposition: 'inline',
|
|
73
|
+
ACL: 'public-read',
|
|
74
|
+
}),
|
|
75
|
+
);
|
|
76
|
+
const url = `${this.opts.publicBase}/${key}`;
|
|
77
|
+
this.logger.debug(`putBuffer: ${url}`);
|
|
78
|
+
return url;
|
|
79
|
+
}
|
|
80
|
+
|
|
65
81
|
async getFileBuffer(key: string): Promise<Buffer> {
|
|
66
82
|
const response = await this.client.send(
|
|
67
83
|
new GetObjectCommand({ Bucket: this.opts.bucket, Key: key }),
|
|
@@ -7,6 +7,7 @@ export interface UploadResult {
|
|
|
7
7
|
|
|
8
8
|
/** Common interface for any object-storage backend (Contabo, MinIO, AWS S3, etc.) */
|
|
9
9
|
export interface IStorageProvider {
|
|
10
|
+
/** Upload a file using an auto-generated UUID key under the given folder. */
|
|
10
11
|
uploadFile(
|
|
11
12
|
buffer: Buffer,
|
|
12
13
|
folder: string,
|
|
@@ -14,6 +15,9 @@ export interface IStorageProvider {
|
|
|
14
15
|
extension: string,
|
|
15
16
|
): Promise<UploadResult>;
|
|
16
17
|
|
|
18
|
+
/** Upload a buffer to a specific, deterministic key. Returns the public URL. */
|
|
19
|
+
putBuffer(key: string, buffer: Buffer, contentType: string): Promise<string>;
|
|
20
|
+
|
|
17
21
|
getFileBuffer(key: string): Promise<Buffer>;
|
|
18
22
|
|
|
19
23
|
deleteFile(key: string): Promise<void>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DynamicModule, Module } from '@nestjs/common';
|
|
2
|
-
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
3
3
|
import { StorageService } from './storage.service';
|
|
4
4
|
import { STORAGE_PROVIDER } from './storage.interface';
|
|
5
5
|
import { S3StorageProvider, S3StorageOptions } from './s3-storage.provider';
|
|
@@ -23,6 +23,7 @@ export class StorageModule {
|
|
|
23
23
|
static register(options: StorageModuleOptions = { provider: 'contabo' }): DynamicModule {
|
|
24
24
|
return {
|
|
25
25
|
module: StorageModule,
|
|
26
|
+
imports: [ConfigModule],
|
|
26
27
|
providers: [
|
|
27
28
|
{
|
|
28
29
|
provide: STORAGE_PROVIDER,
|
|
@@ -20,6 +20,10 @@ export class StorageService {
|
|
|
20
20
|
return this.provider.uploadFile(buffer, folder, contentType, extension);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
putBuffer(key: string, buffer: Buffer, contentType: string): Promise<string> {
|
|
24
|
+
return this.provider.putBuffer(key, buffer, contentType);
|
|
25
|
+
}
|
|
26
|
+
|
|
23
27
|
getFileBuffer(key: string): Promise<Buffer> {
|
|
24
28
|
return this.provider.getFileBuffer(key);
|
|
25
29
|
}
|