ceph-link 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.
Files changed (137) hide show
  1. package/dist/app.controller.d.ts +7 -0
  2. package/dist/app.controller.d.ts.map +1 -0
  3. package/dist/app.controller.js +34 -0
  4. package/dist/app.controller.js.map +1 -0
  5. package/dist/app.module.d.ts +3 -0
  6. package/dist/app.module.d.ts.map +1 -0
  7. package/dist/app.module.js +29 -0
  8. package/dist/app.module.js.map +1 -0
  9. package/dist/app.service.d.ts +4 -0
  10. package/dist/app.service.d.ts.map +1 -0
  11. package/dist/app.service.js +20 -0
  12. package/dist/app.service.js.map +1 -0
  13. package/dist/ceph-s3-sdk.d.ts +15 -0
  14. package/dist/ceph-s3-sdk.d.ts.map +1 -0
  15. package/dist/ceph-s3-sdk.js +27 -0
  16. package/dist/ceph-s3-sdk.js.map +1 -0
  17. package/dist/ceph-s3-sdk.module.d.ts +10 -0
  18. package/dist/ceph-s3-sdk.module.d.ts.map +1 -0
  19. package/dist/ceph-s3-sdk.module.js +72 -0
  20. package/dist/ceph-s3-sdk.module.js.map +1 -0
  21. package/dist/cephcore-sdk.d.ts +44 -0
  22. package/dist/cephcore-sdk.d.ts.map +1 -0
  23. package/dist/cephcore-sdk.js +98 -0
  24. package/dist/cephcore-sdk.js.map +1 -0
  25. package/dist/config/ceph-s3-config.service.d.ts +7 -0
  26. package/dist/config/ceph-s3-config.service.d.ts.map +1 -0
  27. package/dist/config/ceph-s3-config.service.js +41 -0
  28. package/dist/config/ceph-s3-config.service.js.map +1 -0
  29. package/dist/core/types.d.ts +22 -0
  30. package/dist/core/types.d.ts.map +1 -0
  31. package/dist/core/types.js +3 -0
  32. package/dist/core/types.js.map +1 -0
  33. package/dist/dto/bucket.dto.d.ts +9 -0
  34. package/dist/dto/bucket.dto.d.ts.map +1 -0
  35. package/dist/dto/bucket.dto.js +40 -0
  36. package/dist/dto/bucket.dto.js.map +1 -0
  37. package/dist/dto/object.dto.d.ts +14 -0
  38. package/dist/dto/object.dto.d.ts.map +1 -0
  39. package/dist/dto/object.dto.js +65 -0
  40. package/dist/dto/object.dto.js.map +1 -0
  41. package/dist/exceptions/ceph-exceptions.d.ts +28 -0
  42. package/dist/exceptions/ceph-exceptions.d.ts.map +1 -0
  43. package/dist/exceptions/ceph-exceptions.js +56 -0
  44. package/dist/exceptions/ceph-exceptions.js.map +1 -0
  45. package/dist/helpers/download-helper.d.ts +32 -0
  46. package/dist/helpers/download-helper.d.ts.map +1 -0
  47. package/dist/helpers/download-helper.js +218 -0
  48. package/dist/helpers/download-helper.js.map +1 -0
  49. package/dist/helpers/search-helper.d.ts +57 -0
  50. package/dist/helpers/search-helper.d.ts.map +1 -0
  51. package/dist/helpers/search-helper.js +279 -0
  52. package/dist/helpers/search-helper.js.map +1 -0
  53. package/dist/helpers/upload-helper.d.ts +37 -0
  54. package/dist/helpers/upload-helper.d.ts.map +1 -0
  55. package/dist/helpers/upload-helper.js +204 -0
  56. package/dist/helpers/upload-helper.js.map +1 -0
  57. package/dist/index.d.ts +26 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +65 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/interfaces/bucket.interface.d.ts +26 -0
  62. package/dist/interfaces/bucket.interface.d.ts.map +1 -0
  63. package/dist/interfaces/bucket.interface.js +3 -0
  64. package/dist/interfaces/bucket.interface.js.map +1 -0
  65. package/dist/interfaces/ceph-s3-options.interface.d.ts +38 -0
  66. package/dist/interfaces/ceph-s3-options.interface.d.ts.map +1 -0
  67. package/dist/interfaces/ceph-s3-options.interface.js +3 -0
  68. package/dist/interfaces/ceph-s3-options.interface.js.map +1 -0
  69. package/dist/interfaces/config.interface.d.ts +23 -0
  70. package/dist/interfaces/config.interface.d.ts.map +1 -0
  71. package/dist/interfaces/config.interface.js +3 -0
  72. package/dist/interfaces/config.interface.js.map +1 -0
  73. package/dist/interfaces/file.interface.d.ts +54 -0
  74. package/dist/interfaces/file.interface.d.ts.map +1 -0
  75. package/dist/interfaces/file.interface.js +3 -0
  76. package/dist/interfaces/file.interface.js.map +1 -0
  77. package/dist/interfaces/folder.interface.d.ts +31 -0
  78. package/dist/interfaces/folder.interface.d.ts.map +1 -0
  79. package/dist/interfaces/folder.interface.js +3 -0
  80. package/dist/interfaces/folder.interface.js.map +1 -0
  81. package/dist/main.d.ts +2 -0
  82. package/dist/main.d.ts.map +1 -0
  83. package/dist/main.js +10 -0
  84. package/dist/main.js.map +1 -0
  85. package/dist/managers/bucket-manager.d.ts +36 -0
  86. package/dist/managers/bucket-manager.d.ts.map +1 -0
  87. package/dist/managers/bucket-manager.js +195 -0
  88. package/dist/managers/bucket-manager.js.map +1 -0
  89. package/dist/managers/file-manager.d.ts +35 -0
  90. package/dist/managers/file-manager.d.ts.map +1 -0
  91. package/dist/managers/file-manager.js +238 -0
  92. package/dist/managers/file-manager.js.map +1 -0
  93. package/dist/managers/folder-manager.d.ts +31 -0
  94. package/dist/managers/folder-manager.d.ts.map +1 -0
  95. package/dist/managers/folder-manager.js +231 -0
  96. package/dist/managers/folder-manager.js.map +1 -0
  97. package/dist/services/bucket.service.d.ts +16 -0
  98. package/dist/services/bucket.service.d.ts.map +1 -0
  99. package/dist/services/bucket.service.js +176 -0
  100. package/dist/services/bucket.service.js.map +1 -0
  101. package/dist/services/ceph-s3.service.d.ts +14 -0
  102. package/dist/services/ceph-s3.service.d.ts.map +1 -0
  103. package/dist/services/ceph-s3.service.js +59 -0
  104. package/dist/services/ceph-s3.service.js.map +1 -0
  105. package/dist/services/file.service.d.ts +19 -0
  106. package/dist/services/file.service.d.ts.map +1 -0
  107. package/dist/services/file.service.js +85 -0
  108. package/dist/services/file.service.js.map +1 -0
  109. package/dist/services/folder.service.d.ts +21 -0
  110. package/dist/services/folder.service.d.ts.map +1 -0
  111. package/dist/services/folder.service.js +181 -0
  112. package/dist/services/folder.service.js.map +1 -0
  113. package/dist/services/object.service.d.ts +24 -0
  114. package/dist/services/object.service.d.ts.map +1 -0
  115. package/dist/services/object.service.js +231 -0
  116. package/dist/services/object.service.js.map +1 -0
  117. package/dist/services/storage.service.d.ts +36 -0
  118. package/dist/services/storage.service.d.ts.map +1 -0
  119. package/dist/services/storage.service.js +165 -0
  120. package/dist/services/storage.service.js.map +1 -0
  121. package/dist/utils/error.utils.d.ts +41 -0
  122. package/dist/utils/error.utils.d.ts.map +1 -0
  123. package/dist/utils/error.utils.js +111 -0
  124. package/dist/utils/error.utils.js.map +1 -0
  125. package/dist/utils/mime-helper.d.ts +10 -0
  126. package/dist/utils/mime-helper.d.ts.map +1 -0
  127. package/dist/utils/mime-helper.js +87 -0
  128. package/dist/utils/mime-helper.js.map +1 -0
  129. package/dist/utils/path-helper.d.ts +12 -0
  130. package/dist/utils/path-helper.d.ts.map +1 -0
  131. package/dist/utils/path-helper.js +46 -0
  132. package/dist/utils/path-helper.js.map +1 -0
  133. package/dist/utils/validators.d.ts +37 -0
  134. package/dist/utils/validators.d.ts.map +1 -0
  135. package/dist/utils/validators.js +218 -0
  136. package/dist/utils/validators.js.map +1 -0
  137. package/package.json +3 -5
@@ -0,0 +1,176 @@
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 BucketService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.BucketService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const ceph_s3_service_1 = require("./ceph-s3.service");
16
+ const ceph_exceptions_1 = require("../exceptions/ceph-exceptions");
17
+ let BucketService = BucketService_1 = class BucketService {
18
+ constructor(cephS3Service) {
19
+ this.cephS3Service = cephS3Service;
20
+ this.logger = new common_1.Logger(BucketService_1.name);
21
+ }
22
+ async createBucket(bucketName, region) {
23
+ try {
24
+ const s3 = this.cephS3Service.getClient();
25
+ await s3.createBucket({
26
+ Bucket: bucketName,
27
+ CreateBucketConfiguration: region ? { LocationConstraint: region } : undefined,
28
+ }).promise();
29
+ this.logger.log(`Bucket created successfully: ${bucketName}`);
30
+ }
31
+ catch (error) {
32
+ // Handle RadosGW JSON response quirk
33
+ if (error?.message?.includes('Non-whitespace before first tag') ||
34
+ error?.message?.includes('Char: {')) {
35
+ this.logger.warn(`RadosGW returned JSON instead of XML for bucket creation: ${bucketName}`);
36
+ // Verify bucket actually exists
37
+ try {
38
+ const bucketExists = await this.bucketExists(bucketName);
39
+ if (bucketExists) {
40
+ this.logger.log(`Bucket created successfully (verified): ${bucketName}`);
41
+ return;
42
+ }
43
+ }
44
+ catch (checkError) {
45
+ // Continue with original error
46
+ }
47
+ }
48
+ if (error?.code === 'BucketAlreadyExists' || error?.code === 'BucketAlreadyOwnedByYou') {
49
+ this.logger.log(`Bucket already exists: ${bucketName}`);
50
+ return;
51
+ }
52
+ if (error?.code === 'AccessDenied') {
53
+ throw new ceph_exceptions_1.PermissionDeniedError('bucket creation');
54
+ }
55
+ const errorMessage = error?.message || error;
56
+ this.logger.error(`Failed to create bucket ${bucketName}:`, errorMessage);
57
+ throw new Error(`Failed to create bucket: ${errorMessage}`);
58
+ }
59
+ }
60
+ async deleteBucket(bucketName, force = false) {
61
+ try {
62
+ const s3 = this.cephS3Service.getClient();
63
+ if (force) {
64
+ await this.emptyBucket(bucketName);
65
+ }
66
+ await s3.deleteBucket({ Bucket: bucketName }).promise();
67
+ this.logger.log(`Bucket deleted successfully: ${bucketName}`);
68
+ }
69
+ catch (error) {
70
+ if (error?.code === 'NoSuchBucket') {
71
+ throw new ceph_exceptions_1.BucketNotFoundError(bucketName);
72
+ }
73
+ const errorMessage = error?.message || error;
74
+ this.logger.error(`Failed to delete bucket ${bucketName}:`, errorMessage);
75
+ throw new Error(`Failed to delete bucket: ${errorMessage}`);
76
+ }
77
+ }
78
+ async listBuckets() {
79
+ try {
80
+ const s3 = this.cephS3Service.getClient();
81
+ const result = await s3.listBuckets().promise();
82
+ return result.Buckets?.map(bucket => ({
83
+ name: bucket.Name,
84
+ creationDate: bucket.CreationDate,
85
+ })) || [];
86
+ }
87
+ catch (error) {
88
+ const errorMessage = error?.message || error;
89
+ this.logger.error('Failed to list buckets:', errorMessage);
90
+ throw new Error(`Failed to list buckets: ${errorMessage}`);
91
+ }
92
+ }
93
+ async bucketExists(bucketName) {
94
+ try {
95
+ const s3 = this.cephS3Service.getClient();
96
+ await s3.headBucket({ Bucket: bucketName }).promise();
97
+ return true;
98
+ }
99
+ catch (error) {
100
+ if (error?.statusCode === 404 || error?.code === 'NotFound') {
101
+ return false;
102
+ }
103
+ const errorMessage = error?.message || error;
104
+ throw new Error(`Failed to check bucket existence: ${errorMessage}`);
105
+ }
106
+ }
107
+ async getBucketLocation(bucketName) {
108
+ try {
109
+ const s3 = this.cephS3Service.getClient();
110
+ const result = await s3.getBucketLocation({ Bucket: bucketName }).promise();
111
+ return result.LocationConstraint || 'us-east-1';
112
+ }
113
+ catch (error) {
114
+ if (error?.code === 'NoSuchBucket') {
115
+ throw new ceph_exceptions_1.BucketNotFoundError(bucketName);
116
+ }
117
+ const errorMessage = error?.message || error;
118
+ this.logger.error(`Failed to get bucket location ${bucketName}:`, errorMessage);
119
+ throw new Error(`Failed to get bucket location: ${errorMessage}`);
120
+ }
121
+ }
122
+ async setBucketPolicy(bucketName, policy) {
123
+ try {
124
+ const s3 = this.cephS3Service.getClient();
125
+ await s3.putBucketPolicy({
126
+ Bucket: bucketName,
127
+ Policy: policy,
128
+ }).promise();
129
+ this.logger.log(`Bucket policy set for: ${bucketName}`);
130
+ }
131
+ catch (error) {
132
+ const errorMessage = error?.message || error;
133
+ this.logger.error(`Failed to set bucket policy ${bucketName}:`, errorMessage);
134
+ throw new Error(`Failed to set bucket policy: ${errorMessage}`);
135
+ }
136
+ }
137
+ async getBucketPolicy(bucketName) {
138
+ try {
139
+ const s3 = this.cephS3Service.getClient();
140
+ const result = await s3.getBucketPolicy({ Bucket: bucketName }).promise();
141
+ return result.Policy;
142
+ }
143
+ catch (error) {
144
+ if (error?.statusCode === 404 || error?.code === 'NotFound') {
145
+ throw new ceph_exceptions_1.BucketNotFoundError(bucketName);
146
+ }
147
+ const errorMessage = error?.message || error;
148
+ this.logger.error(`Failed to get bucket policy ${bucketName}:`, errorMessage);
149
+ throw new Error(`Failed to get bucket policy: ${errorMessage}`);
150
+ }
151
+ }
152
+ async emptyBucket(bucketName) {
153
+ const s3 = this.cephS3Service.getClient();
154
+ let continuationToken;
155
+ do {
156
+ const listResult = await s3.listObjectsV2({
157
+ Bucket: bucketName,
158
+ ContinuationToken: continuationToken,
159
+ }).promise();
160
+ if (listResult.Contents && listResult.Contents.length > 0) {
161
+ const objectsToDelete = listResult.Contents.map(obj => ({ Key: obj.Key }));
162
+ await s3.deleteObjects({
163
+ Bucket: bucketName,
164
+ Delete: { Objects: objectsToDelete },
165
+ }).promise();
166
+ }
167
+ continuationToken = listResult.NextContinuationToken;
168
+ } while (continuationToken);
169
+ }
170
+ };
171
+ exports.BucketService = BucketService;
172
+ exports.BucketService = BucketService = BucketService_1 = __decorate([
173
+ (0, common_1.Injectable)(),
174
+ __metadata("design:paramtypes", [ceph_s3_service_1.CephS3Service])
175
+ ], BucketService);
176
+ //# sourceMappingURL=bucket.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bucket.service.js","sourceRoot":"","sources":["../../src/services/bucket.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { S3 } from 'aws-sdk';
3
+ import { CephS3ConfigService } from '../config/ceph-s3-config.service';
4
+ export declare class CephS3Service implements OnModuleInit {
5
+ private readonly configService;
6
+ private readonly logger;
7
+ private s3Client;
8
+ constructor(configService: CephS3ConfigService);
9
+ onModuleInit(): void;
10
+ private initializeS3Client;
11
+ getClient(): S3;
12
+ healthCheck(): Promise<boolean>;
13
+ }
14
+ //# sourceMappingURL=ceph-s3.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ceph-s3.service.d.ts","sourceRoot":"","sources":["../../src/services/ceph-s3.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAGvE,qBACa,aAAc,YAAW,YAAY;IAIpC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAK;gBAEQ,aAAa,EAAE,mBAAmB;IAE/D,YAAY;IAIZ,OAAO,CAAC,kBAAkB;IAgB1B,SAAS,IAAI,EAAE;IAIT,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAUtC"}
@@ -0,0 +1,59 @@
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 CephS3Service_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CephS3Service = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const aws_sdk_1 = require("aws-sdk");
16
+ const ceph_s3_config_service_1 = require("../config/ceph-s3-config.service");
17
+ const error_utils_1 = require("../utils/error.utils");
18
+ let CephS3Service = CephS3Service_1 = class CephS3Service {
19
+ constructor(configService) {
20
+ this.configService = configService;
21
+ this.logger = new common_1.Logger(CephS3Service_1.name);
22
+ }
23
+ onModuleInit() {
24
+ this.initializeS3Client();
25
+ }
26
+ initializeS3Client() {
27
+ const config = this.configService.config;
28
+ this.s3Client = new aws_sdk_1.S3({
29
+ endpoint: config.endpoint,
30
+ accessKeyId: config.accessKeyId,
31
+ secretAccessKey: config.secretAccessKey,
32
+ region: config.region,
33
+ sslEnabled: config.sslEnabled,
34
+ s3ForcePathStyle: config.pathStyle,
35
+ s3DisableBodySigning: false,
36
+ });
37
+ this.logger.log('Ceph S3 client initialized successfully');
38
+ }
39
+ getClient() {
40
+ return this.s3Client;
41
+ }
42
+ async healthCheck() {
43
+ try {
44
+ await this.s3Client.listBuckets().promise();
45
+ return true;
46
+ }
47
+ catch (error) {
48
+ const errorMessage = (0, error_utils_1.getErrorMessage)(error);
49
+ this.logger.error('Health check failed:', errorMessage);
50
+ return false;
51
+ }
52
+ }
53
+ };
54
+ exports.CephS3Service = CephS3Service;
55
+ exports.CephS3Service = CephS3Service = CephS3Service_1 = __decorate([
56
+ (0, common_1.Injectable)(),
57
+ __metadata("design:paramtypes", [ceph_s3_config_service_1.CephS3ConfigService])
58
+ ], CephS3Service);
59
+ //# sourceMappingURL=ceph-s3.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ceph-s3.service.js","sourceRoot":"","sources":["../../src/services/ceph-s3.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAkE;AAClE,qCAA6B;AAC7B,6EAAuE;AACvE,sDAAuD;AAGhD,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAIxB,YAA6B,aAAkC;QAAlC,kBAAa,GAAb,aAAa,CAAqB;QAH9C,WAAM,GAAG,IAAI,eAAM,CAAC,eAAa,CAAC,IAAI,CAAC,CAAC;IAGS,CAAC;IAEnE,YAAY;QACV,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,kBAAkB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAEzC,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAE,CAAC;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,gBAAgB,EAAE,MAAM,CAAC,SAAS;YAClC,oBAAoB,EAAE,KAAK;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,IAAA,6BAAe,EAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAA;AAxCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAKiC,4CAAmB;GAJpD,aAAa,CAwCzB"}
@@ -0,0 +1,19 @@
1
+ import { ObjectService } from './object.service';
2
+ import { CephFile } from '../interfaces/file.interface';
3
+ export declare class FileService {
4
+ private readonly objectService;
5
+ private readonly logger;
6
+ constructor(objectService: ObjectService);
7
+ getFileInfo(bucketName: string, filePath: string): Promise<CephFile>;
8
+ validateFile(bucketName: string, filePath: string): Promise<boolean>;
9
+ getFileCategory(fileName: string): Promise<string>;
10
+ analyzeFile(bucketName: string, filePath: string): Promise<{
11
+ info: CephFile;
12
+ category: string;
13
+ isImage: boolean;
14
+ isVideo: boolean;
15
+ isDocument: boolean;
16
+ isAudio: boolean;
17
+ }>;
18
+ }
19
+ //# sourceMappingURL=file.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.service.d.ts","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAIxD,qBACa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;gBAE1B,aAAa,EAAE,aAAa;IAEnD,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqBpE,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBpE,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/D,IAAI,EAAE,QAAQ,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CAaH"}
@@ -0,0 +1,85 @@
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 FileService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.FileService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const object_service_1 = require("./object.service");
16
+ const mime_helper_1 = require("../utils/mime-helper");
17
+ const path_helper_1 = require("../utils/path-helper");
18
+ let FileService = FileService_1 = class FileService {
19
+ constructor(objectService) {
20
+ this.objectService = objectService;
21
+ this.logger = new common_1.Logger(FileService_1.name);
22
+ }
23
+ async getFileInfo(bucketName, filePath) {
24
+ try {
25
+ const metadata = await this.objectService.getObjectMetadata(bucketName, filePath);
26
+ const fileName = path_helper_1.PathHelper.getFileName(filePath);
27
+ const contentType = metadata.contentType || mime_helper_1.MimeHelper.getMimeType(fileName);
28
+ return {
29
+ key: filePath,
30
+ name: fileName,
31
+ size: metadata.contentLength,
32
+ lastModified: new Date(metadata.lastModified),
33
+ etag: metadata.etag,
34
+ contentType,
35
+ isFolder: filePath.endsWith('/'),
36
+ metadata: metadata.metadata,
37
+ };
38
+ }
39
+ catch (error) {
40
+ throw error;
41
+ }
42
+ }
43
+ async validateFile(bucketName, filePath) {
44
+ try {
45
+ // Check if file exists
46
+ const exists = await this.objectService.objectExists(bucketName, filePath);
47
+ if (!exists) {
48
+ return false;
49
+ }
50
+ // Check if path is valid
51
+ if (!path_helper_1.PathHelper.isValidPath(filePath)) {
52
+ return false;
53
+ }
54
+ // Check if it's not a folder
55
+ if (filePath.endsWith('/')) {
56
+ return false;
57
+ }
58
+ return true;
59
+ }
60
+ catch (error) {
61
+ return false;
62
+ }
63
+ }
64
+ async getFileCategory(fileName) {
65
+ return mime_helper_1.MimeHelper.getFileCategory(fileName);
66
+ }
67
+ async analyzeFile(bucketName, filePath) {
68
+ const info = await this.getFileInfo(bucketName, filePath);
69
+ const category = mime_helper_1.MimeHelper.getFileCategory(info.name);
70
+ return {
71
+ info,
72
+ category,
73
+ isImage: mime_helper_1.MimeHelper.isImage(info.name),
74
+ isVideo: mime_helper_1.MimeHelper.isVideo(info.name),
75
+ isDocument: mime_helper_1.MimeHelper.isDocument(info.name),
76
+ isAudio: mime_helper_1.MimeHelper.isAudio(info.name),
77
+ };
78
+ }
79
+ };
80
+ exports.FileService = FileService;
81
+ exports.FileService = FileService = FileService_1 = __decorate([
82
+ (0, common_1.Injectable)(),
83
+ __metadata("design:paramtypes", [object_service_1.ObjectService])
84
+ ], FileService);
85
+ //# sourceMappingURL=file.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.service.js","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,qDAAiD;AAEjD,sDAAkD;AAClD,sDAAkD;AAG3C,IAAM,WAAW,mBAAjB,MAAM,WAAW;IAGtB,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QAFxC,WAAM,GAAG,IAAI,eAAM,CAAC,aAAW,CAAC,IAAI,CAAC,CAAC;IAEK,CAAC;IAE7D,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,QAAgB;QACpD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAClF,MAAM,QAAQ,GAAG,wBAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,IAAI,wBAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAE7E,OAAO;gBACL,GAAG,EAAE,QAAQ;gBACb,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ,CAAC,aAAa;gBAC5B,YAAY,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAC7C,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,WAAW;gBACX,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAChC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,QAAgB;QACrD,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,KAAK,CAAC;YACf,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,wBAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,6BAA6B;YAC7B,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,OAAO,wBAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,QAAgB;QAQpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,wBAAU,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,OAAO;YACL,IAAI;YACJ,QAAQ;YACR,OAAO,EAAE,wBAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACtC,OAAO,EAAE,wBAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACtC,UAAU,EAAE,wBAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,OAAO,EAAE,wBAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;SACvC,CAAC;IACJ,CAAC;CACF,CAAA;AA1EY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAIiC,8BAAa;GAH9C,WAAW,CA0EvB"}
@@ -0,0 +1,21 @@
1
+ import { ObjectService } from './object.service';
2
+ import { S3Object } from '../interfaces/ceph-s3-options.interface';
3
+ export declare class FolderService {
4
+ private readonly objectService;
5
+ private readonly logger;
6
+ constructor(objectService: ObjectService);
7
+ createFolder(bucketName: string, folderPath: string): Promise<void>;
8
+ deleteFolder(bucketName: string, folderPath: string): Promise<void>;
9
+ listFolderContents(bucketName: string, folderPath?: string): Promise<{
10
+ folders: string[];
11
+ files: S3Object[];
12
+ }>;
13
+ copyFolder(sourceBucket: string, sourceFolderPath: string, destBucket: string, destFolderPath: string): Promise<void>;
14
+ getFolderSize(bucketName: string, folderPath: string): Promise<{
15
+ totalSize: number;
16
+ fileCount: number;
17
+ }>;
18
+ folderExists(bucketName: string, folderPath: string): Promise<boolean>;
19
+ private ensureTrailingSlash;
20
+ }
21
+ //# sourceMappingURL=folder.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder.service.d.ts","sourceRoot":"","sources":["../../src/services/folder.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAGnE,qBACa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE5B,aAAa,EAAE,aAAa;IAEnD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnE,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnE,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;KACnB,CAAC;IAsDM,UAAU,CACd,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IA+BV,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QACnE,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IA8BI,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwB5E,OAAO,CAAC,mBAAmB;CAG5B"}
@@ -0,0 +1,181 @@
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 FolderService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.FolderService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const object_service_1 = require("./object.service");
16
+ let FolderService = FolderService_1 = class FolderService {
17
+ constructor(objectService) {
18
+ this.objectService = objectService;
19
+ this.logger = new common_1.Logger(FolderService_1.name);
20
+ }
21
+ async createFolder(bucketName, folderPath) {
22
+ try {
23
+ const folderKey = this.ensureTrailingSlash(folderPath);
24
+ await this.objectService.uploadObject(bucketName, folderKey, Buffer.alloc(0), {
25
+ contentType: 'application/x-directory',
26
+ });
27
+ this.logger.log(`Folder created successfully: ${folderKey} in ${bucketName}`);
28
+ }
29
+ catch (error) {
30
+ const errorMessage = error?.message || error;
31
+ this.logger.error(`Failed to create folder ${folderPath}:`, errorMessage);
32
+ throw new Error(`Failed to create folder: ${errorMessage}`);
33
+ }
34
+ }
35
+ async deleteFolder(bucketName, folderPath) {
36
+ try {
37
+ const folderPrefix = this.ensureTrailingSlash(folderPath);
38
+ // List all objects with the folder prefix
39
+ const listResult = await this.objectService.listObjects(bucketName, {
40
+ prefix: folderPrefix,
41
+ });
42
+ if (listResult.objects.length === 0) {
43
+ this.logger.warn(`No objects found in folder: ${folderPath}`);
44
+ return;
45
+ }
46
+ // Delete all objects in the folder
47
+ const keys = listResult.objects.map(obj => obj.key);
48
+ await this.objectService.deleteObjects(bucketName, keys);
49
+ this.logger.log(`Folder deleted successfully: ${folderPath} from ${bucketName}`);
50
+ }
51
+ catch (error) {
52
+ const errorMessage = error?.message || error;
53
+ this.logger.error(`Failed to delete folder ${folderPath}:`, errorMessage);
54
+ throw new Error(`Failed to delete folder: ${errorMessage}`);
55
+ }
56
+ }
57
+ async listFolderContents(bucketName, folderPath) {
58
+ try {
59
+ const prefix = folderPath ? this.ensureTrailingSlash(folderPath) : '';
60
+ const listResult = await this.objectService.listObjects(bucketName, {
61
+ prefix,
62
+ delimiter: '/', // This is crucial for folder detection
63
+ });
64
+ const folders = [];
65
+ const files = [];
66
+ // Process objects
67
+ listResult.objects.forEach(obj => {
68
+ const relativePath = obj.key.substring(prefix.length);
69
+ if (relativePath.endsWith('/') && relativePath.length > 1) {
70
+ // This is a folder marker - extract folder name
71
+ const folderName = relativePath.slice(0, -1);
72
+ if (folderName && !folderName.includes('/')) {
73
+ folders.push(folderName);
74
+ }
75
+ }
76
+ else if (relativePath && !relativePath.includes('/')) {
77
+ // This is a direct file in this directory
78
+ files.push(obj);
79
+ }
80
+ });
81
+ // Also check for "virtual folders" (files in subdirectories)
82
+ const virtualFolders = new Set();
83
+ listResult.objects.forEach(obj => {
84
+ const relativePath = obj.key.substring(prefix.length);
85
+ const parts = relativePath.split('/');
86
+ if (parts.length > 1 && parts[0]) {
87
+ virtualFolders.add(parts[0]);
88
+ }
89
+ });
90
+ // Add virtual folders to the folders list
91
+ virtualFolders.forEach(folder => {
92
+ if (!folders.includes(folder)) {
93
+ folders.push(folder);
94
+ }
95
+ });
96
+ return { folders: Array.from(new Set(folders)), files };
97
+ }
98
+ catch (error) {
99
+ const errorMessage = error?.message || error;
100
+ this.logger.error(`Failed to list folder contents ${folderPath}:`, errorMessage);
101
+ throw new Error(`Failed to list folder contents: ${errorMessage}`);
102
+ }
103
+ }
104
+ async copyFolder(sourceBucket, sourceFolderPath, destBucket, destFolderPath) {
105
+ try {
106
+ const sourcePrefix = this.ensureTrailingSlash(sourceFolderPath);
107
+ const destPrefix = this.ensureTrailingSlash(destFolderPath);
108
+ // List all objects in the source folder
109
+ const listResult = await this.objectService.listObjects(sourceBucket, {
110
+ prefix: sourcePrefix,
111
+ });
112
+ // Copy each object
113
+ for (const obj of listResult.objects) {
114
+ const relativePath = obj.key.substring(sourcePrefix.length);
115
+ const destKey = destPrefix + relativePath;
116
+ await this.objectService.copyObject(sourceBucket, obj.key, destBucket, destKey);
117
+ }
118
+ this.logger.log(`Folder copied from ${sourceBucket}/${sourceFolderPath} to ${destBucket}/${destFolderPath}`);
119
+ }
120
+ catch (error) {
121
+ const errorMessage = error?.message || error;
122
+ this.logger.error(`Failed to copy folder:`, errorMessage);
123
+ throw new Error(`Failed to copy folder: ${errorMessage}`);
124
+ }
125
+ }
126
+ async getFolderSize(bucketName, folderPath) {
127
+ try {
128
+ const prefix = this.ensureTrailingSlash(folderPath);
129
+ let totalSize = 0;
130
+ let fileCount = 0;
131
+ let continuationToken;
132
+ do {
133
+ const listResult = await this.objectService.listObjects(bucketName, {
134
+ prefix,
135
+ continuationToken,
136
+ });
137
+ listResult.objects.forEach(obj => {
138
+ totalSize += obj.size;
139
+ fileCount++;
140
+ });
141
+ continuationToken = listResult.nextContinuationToken;
142
+ } while (continuationToken);
143
+ return { totalSize, fileCount };
144
+ }
145
+ catch (error) {
146
+ const errorMessage = error?.message || error;
147
+ this.logger.error(`Failed to get folder size ${folderPath}:`, errorMessage);
148
+ throw new Error(`Failed to get folder size: ${errorMessage}`);
149
+ }
150
+ }
151
+ async folderExists(bucketName, folderPath) {
152
+ try {
153
+ const folderKey = this.ensureTrailingSlash(folderPath);
154
+ // Check if folder marker exists
155
+ const markerExists = await this.objectService.objectExists(bucketName, folderKey);
156
+ if (markerExists) {
157
+ return true;
158
+ }
159
+ // Check if any objects exist with this prefix
160
+ const listResult = await this.objectService.listObjects(bucketName, {
161
+ prefix: folderKey,
162
+ maxKeys: 1,
163
+ });
164
+ return listResult.objects.length > 0;
165
+ }
166
+ catch (error) {
167
+ const errorMessage = error?.message || error;
168
+ this.logger.error(`Failed to check folder existence ${folderPath}:`, errorMessage);
169
+ throw new Error(`Failed to check folder existence: ${errorMessage}`);
170
+ }
171
+ }
172
+ ensureTrailingSlash(path) {
173
+ return path.endsWith('/') ? path : `${path}/`;
174
+ }
175
+ };
176
+ exports.FolderService = FolderService;
177
+ exports.FolderService = FolderService = FolderService_1 = __decorate([
178
+ (0, common_1.Injectable)(),
179
+ __metadata("design:paramtypes", [object_service_1.ObjectService])
180
+ ], FolderService);
181
+ //# sourceMappingURL=folder.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder.service.js","sourceRoot":"","sources":["../../src/services/folder.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { CephS3Service } from './ceph-s3.service';
2
+ import { S3Object, UploadOptions, ListObjectsOptions, PresignedUrlOptions } from '../interfaces/ceph-s3-options.interface';
3
+ import { Readable } from 'stream';
4
+ export declare class ObjectService {
5
+ private readonly cephS3Service;
6
+ private readonly logger;
7
+ constructor(cephS3Service: CephS3Service);
8
+ uploadObject(bucketName: string, key: string, body: Buffer | Uint8Array | Blob | string | Readable, options?: UploadOptions): Promise<string>;
9
+ downloadObject(bucketName: string, key: string): Promise<Buffer>;
10
+ getObjectStream(bucketName: string, key: string): Promise<Readable>;
11
+ deleteObject(bucketName: string, key: string): Promise<void>;
12
+ deleteObjects(bucketName: string, keys: string[]): Promise<void>;
13
+ listObjects(bucketName: string, options?: ListObjectsOptions): Promise<{
14
+ objects: S3Object[];
15
+ isTruncated: boolean;
16
+ nextContinuationToken?: string;
17
+ commonPrefixes?: string[];
18
+ }>;
19
+ objectExists(bucketName: string, key: string): Promise<boolean>;
20
+ getObjectMetadata(bucketName: string, key: string): Promise<any>;
21
+ copyObject(sourceBucket: string, sourceKey: string, destBucket: string, destKey: string): Promise<void>;
22
+ generatePresignedUrl(bucketName: string, key: string, operation: 'getObject' | 'putObject', options?: PresignedUrlOptions): Promise<string>;
23
+ }
24
+ //# sourceMappingURL=object.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.service.d.ts","sourceRoot":"","sources":["../../src/services/object.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,qBACa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE5B,aAAa,EAAE,aAAa;IAEnD,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,EACpD,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,MAAM,CAAC;IAwBZ,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgChE,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAenE,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhE,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC;QAC7E,OAAO,EAAE,QAAQ,EAAE,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,CAAC;IAsCM,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc/D,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAqBhE,UAAU,CACd,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAkBV,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,WAAW,GAAG,WAAW,EACpC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,MAAM,CAAC;CAoBnB"}