@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.
@@ -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;AA7DD,8CA6DC"}
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;CA6BxF"}
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,2CAA+C;AAC/C,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,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;AAvCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,aAAa,CAuCzB"}
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;AArBY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,oCAAgB,CAAC,CAAA;;GAFhB,cAAc,CAqB1B"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cuencor/backend-storage",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "S3-compatible object storage provider for Cuencor Platform (Contabo, MinIO, AWS S3)",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
@@ -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
  }