ceph-link 1.0.0 → 1.2.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 +26 -11
- package/dist/app.controller.d.ts +7 -0
- package/dist/app.controller.d.ts.map +1 -0
- package/dist/app.controller.js +34 -0
- package/dist/app.controller.js.map +1 -0
- package/dist/app.module.d.ts +3 -0
- package/dist/app.module.d.ts.map +1 -0
- package/dist/app.module.js +29 -0
- package/dist/app.module.js.map +1 -0
- package/dist/app.service.d.ts +4 -0
- package/dist/app.service.d.ts.map +1 -0
- package/dist/app.service.js +20 -0
- package/dist/app.service.js.map +1 -0
- package/dist/ceph-s3-sdk.d.ts +15 -0
- package/dist/ceph-s3-sdk.d.ts.map +1 -0
- package/dist/ceph-s3-sdk.js +27 -0
- package/dist/ceph-s3-sdk.js.map +1 -0
- package/dist/ceph-s3-sdk.module.d.ts +10 -0
- package/dist/ceph-s3-sdk.module.d.ts.map +1 -0
- package/dist/ceph-s3-sdk.module.js +72 -0
- package/dist/ceph-s3-sdk.module.js.map +1 -0
- package/dist/cephcore-sdk.d.ts +44 -0
- package/dist/cephcore-sdk.d.ts.map +1 -0
- package/dist/cephcore-sdk.js +98 -0
- package/dist/cephcore-sdk.js.map +1 -0
- package/dist/config/ceph-s3-config.service.d.ts +7 -0
- package/dist/config/ceph-s3-config.service.d.ts.map +1 -0
- package/dist/config/ceph-s3-config.service.js +42 -0
- package/dist/config/ceph-s3-config.service.js.map +1 -0
- package/dist/core/types.d.ts +22 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/dto/bucket.dto.d.ts +9 -0
- package/dist/dto/bucket.dto.d.ts.map +1 -0
- package/dist/dto/bucket.dto.js +40 -0
- package/dist/dto/bucket.dto.js.map +1 -0
- package/dist/dto/object.dto.d.ts +14 -0
- package/dist/dto/object.dto.d.ts.map +1 -0
- package/dist/dto/object.dto.js +65 -0
- package/dist/dto/object.dto.js.map +1 -0
- package/dist/exceptions/ceph-exceptions.d.ts +28 -0
- package/dist/exceptions/ceph-exceptions.d.ts.map +1 -0
- package/dist/exceptions/ceph-exceptions.js +56 -0
- package/dist/exceptions/ceph-exceptions.js.map +1 -0
- package/dist/helpers/download-helper.d.ts +32 -0
- package/dist/helpers/download-helper.d.ts.map +1 -0
- package/dist/helpers/download-helper.js +218 -0
- package/dist/helpers/download-helper.js.map +1 -0
- package/dist/helpers/search-helper.d.ts +57 -0
- package/dist/helpers/search-helper.d.ts.map +1 -0
- package/dist/helpers/search-helper.js +279 -0
- package/dist/helpers/search-helper.js.map +1 -0
- package/dist/helpers/upload-helper.d.ts +37 -0
- package/dist/helpers/upload-helper.d.ts.map +1 -0
- package/dist/helpers/upload-helper.js +204 -0
- package/dist/helpers/upload-helper.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/bucket.interface.d.ts +26 -0
- package/dist/interfaces/bucket.interface.d.ts.map +1 -0
- package/dist/interfaces/bucket.interface.js +3 -0
- package/dist/interfaces/bucket.interface.js.map +1 -0
- package/dist/interfaces/ceph-s3-options.interface.d.ts +39 -0
- package/dist/interfaces/ceph-s3-options.interface.d.ts.map +1 -0
- package/dist/interfaces/ceph-s3-options.interface.js +3 -0
- package/dist/interfaces/ceph-s3-options.interface.js.map +1 -0
- package/dist/interfaces/config.interface.d.ts +25 -0
- package/dist/interfaces/config.interface.d.ts.map +1 -0
- package/dist/interfaces/config.interface.js +3 -0
- package/dist/interfaces/config.interface.js.map +1 -0
- package/dist/interfaces/file.interface.d.ts +54 -0
- package/dist/interfaces/file.interface.d.ts.map +1 -0
- package/dist/interfaces/file.interface.js +3 -0
- package/dist/interfaces/file.interface.js.map +1 -0
- package/dist/interfaces/folder.interface.d.ts +31 -0
- package/dist/interfaces/folder.interface.d.ts.map +1 -0
- package/dist/interfaces/folder.interface.js +3 -0
- package/dist/interfaces/folder.interface.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -0
- package/dist/managers/bucket-manager.d.ts +36 -0
- package/dist/managers/bucket-manager.d.ts.map +1 -0
- package/dist/managers/bucket-manager.js +195 -0
- package/dist/managers/bucket-manager.js.map +1 -0
- package/dist/managers/file-manager.d.ts +35 -0
- package/dist/managers/file-manager.d.ts.map +1 -0
- package/dist/managers/file-manager.js +238 -0
- package/dist/managers/file-manager.js.map +1 -0
- package/dist/managers/folder-manager.d.ts +31 -0
- package/dist/managers/folder-manager.d.ts.map +1 -0
- package/dist/managers/folder-manager.js +231 -0
- package/dist/managers/folder-manager.js.map +1 -0
- package/dist/services/bucket.service.d.ts +16 -0
- package/dist/services/bucket.service.d.ts.map +1 -0
- package/dist/services/bucket.service.js +176 -0
- package/dist/services/bucket.service.js.map +1 -0
- package/dist/services/ceph-s3.service.d.ts +14 -0
- package/dist/services/ceph-s3.service.d.ts.map +1 -0
- package/dist/services/ceph-s3.service.js +71 -0
- package/dist/services/ceph-s3.service.js.map +1 -0
- package/dist/services/file.service.d.ts +19 -0
- package/dist/services/file.service.d.ts.map +1 -0
- package/dist/services/file.service.js +85 -0
- package/dist/services/file.service.js.map +1 -0
- package/dist/services/folder.service.d.ts +21 -0
- package/dist/services/folder.service.d.ts.map +1 -0
- package/dist/services/folder.service.js +181 -0
- package/dist/services/folder.service.js.map +1 -0
- package/dist/services/object.service.d.ts +24 -0
- package/dist/services/object.service.d.ts.map +1 -0
- package/dist/services/object.service.js +231 -0
- package/dist/services/object.service.js.map +1 -0
- package/dist/services/storage.service.d.ts +36 -0
- package/dist/services/storage.service.d.ts.map +1 -0
- package/dist/services/storage.service.js +165 -0
- package/dist/services/storage.service.js.map +1 -0
- package/dist/utils/error.utils.d.ts +41 -0
- package/dist/utils/error.utils.d.ts.map +1 -0
- package/dist/utils/error.utils.js +111 -0
- package/dist/utils/error.utils.js.map +1 -0
- package/dist/utils/mime-helper.d.ts +10 -0
- package/dist/utils/mime-helper.d.ts.map +1 -0
- package/dist/utils/mime-helper.js +87 -0
- package/dist/utils/mime-helper.js.map +1 -0
- package/dist/utils/path-helper.d.ts +12 -0
- package/dist/utils/path-helper.d.ts.map +1 -0
- package/dist/utils/path-helper.js +46 -0
- package/dist/utils/path-helper.js.map +1 -0
- package/dist/utils/validators.d.ts +37 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +218 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +7 -7
|
@@ -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":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uDAAkD;AAElD,mEAA2F;AAGpF,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAGxB,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QAFxC,WAAM,GAAG,IAAI,eAAM,CAAC,eAAa,CAAC,IAAI,CAAC,CAAC;IAEG,CAAC;IAE7D,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,MAAe;QACpD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAE1C,MAAM,EAAE,CAAC,YAAY,CAAC;gBACpB,MAAM,EAAE,UAAU;gBAClB,yBAAyB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;aAC/E,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,qCAAqC;YACrC,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,iCAAiC,CAAC;gBAC3D,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAExC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6DAA6D,UAAU,EAAE,CAAC,CAAC;gBAE5F,gCAAgC;gBAChC,IAAI,CAAC;oBACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBACzD,IAAI,YAAY,EAAE,CAAC;wBACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;wBACzE,OAAO;oBACT,CAAC;gBACH,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,+BAA+B;gBACjC,CAAC;YACH,CAAC;YAED,IAAI,KAAK,EAAE,IAAI,KAAK,qBAAqB,IAAI,KAAK,EAAE,IAAI,KAAK,yBAAyB,EAAE,CAAC;gBACvF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;YAED,IAAI,KAAK,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;gBACnC,MAAM,IAAI,uCAAqB,CAAC,iBAAiB,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,UAAU,GAAG,EAAE,YAAY,CAAC,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,QAAiB,KAAK;QAC3D,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAE1C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;gBACnC,MAAM,IAAI,qCAAmB,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,UAAU,GAAG,EAAE,YAAY,CAAC,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;YAEhD,OAAO,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,EAAE,MAAM,CAAC,IAAK;gBAClB,YAAY,EAAE,MAAM,CAAC,YAAa;aACnC,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,EAAE,UAAU,KAAK,GAAG,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5D,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,qCAAqC,YAAY,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAAkB;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5E,OAAO,MAAM,CAAC,kBAAkB,IAAI,WAAW,CAAC;QAClD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;gBACnC,MAAM,IAAI,qCAAmB,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,UAAU,GAAG,EAAE,YAAY,CAAC,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,UAAkB,EAAE,MAAc;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,EAAE,CAAC,eAAe,CAAC;gBACvB,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,MAAM;aACf,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,UAAU,GAAG,EAAE,YAAY,CAAC,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1E,OAAO,MAAM,CAAC,MAAO,CAAC;QACxB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,EAAE,UAAU,KAAK,GAAG,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5D,MAAM,IAAI,qCAAmB,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,UAAU,GAAG,EAAE,YAAY,CAAC,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,UAAkB;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAE1C,IAAI,iBAAqC,CAAC;QAE1C,GAAG,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC;gBACxC,MAAM,EAAE,UAAU;gBAClB,iBAAiB,EAAE,iBAAiB;aACrC,CAAC,CAAC,OAAO,EAAE,CAAC;YAEb,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1D,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAI,EAAE,CAAC,CAAC,CAAC;gBAE5E,MAAM,EAAE,CAAC,aAAa,CAAC;oBACrB,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;iBACrC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,CAAC;YAED,iBAAiB,GAAG,UAAU,CAAC,qBAAqB,CAAC;QACvD,CAAC,QAAQ,iBAAiB,EAAE;IAC9B,CAAC;CACF,CAAA;AAxKY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAIiC,+BAAa;GAH9C,aAAa,CAwKzB"}
|
|
@@ -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;AAE7B,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;IA6B1B,SAAS,IAAI,EAAE;IAIT,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAUtC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
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 proxy_agent_1 = require("proxy-agent");
|
|
17
|
+
const ceph_s3_config_service_1 = require("../config/ceph-s3-config.service");
|
|
18
|
+
const error_utils_1 = require("../utils/error.utils");
|
|
19
|
+
let CephS3Service = CephS3Service_1 = class CephS3Service {
|
|
20
|
+
constructor(configService) {
|
|
21
|
+
this.configService = configService;
|
|
22
|
+
this.logger = new common_1.Logger(CephS3Service_1.name);
|
|
23
|
+
}
|
|
24
|
+
onModuleInit() {
|
|
25
|
+
this.initializeS3Client();
|
|
26
|
+
}
|
|
27
|
+
initializeS3Client() {
|
|
28
|
+
const config = this.configService.config;
|
|
29
|
+
const clientConfig = {
|
|
30
|
+
endpoint: config.endpoint,
|
|
31
|
+
accessKeyId: config.accessKeyId,
|
|
32
|
+
secretAccessKey: config.secretAccessKey,
|
|
33
|
+
region: config.region,
|
|
34
|
+
sslEnabled: config.sslEnabled,
|
|
35
|
+
s3ForcePathStyle: config.pathStyle,
|
|
36
|
+
s3DisableBodySigning: false,
|
|
37
|
+
};
|
|
38
|
+
if (config.proxy) {
|
|
39
|
+
const proxyAgent = new proxy_agent_1.ProxyAgent({
|
|
40
|
+
getProxyForUrl: () => config.proxy,
|
|
41
|
+
});
|
|
42
|
+
clientConfig.httpOptions = {
|
|
43
|
+
...clientConfig.httpOptions,
|
|
44
|
+
agent: proxyAgent,
|
|
45
|
+
};
|
|
46
|
+
this.logger.log('Using proxy for Ceph S3 client');
|
|
47
|
+
}
|
|
48
|
+
this.s3Client = new aws_sdk_1.S3(clientConfig);
|
|
49
|
+
this.logger.log('Ceph S3 client initialized successfully');
|
|
50
|
+
}
|
|
51
|
+
getClient() {
|
|
52
|
+
return this.s3Client;
|
|
53
|
+
}
|
|
54
|
+
async healthCheck() {
|
|
55
|
+
try {
|
|
56
|
+
await this.s3Client.listBuckets().promise();
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const errorMessage = (0, error_utils_1.getErrorMessage)(error);
|
|
61
|
+
this.logger.error('Health check failed:', errorMessage);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
exports.CephS3Service = CephS3Service;
|
|
67
|
+
exports.CephS3Service = CephS3Service = CephS3Service_1 = __decorate([
|
|
68
|
+
(0, common_1.Injectable)(),
|
|
69
|
+
__metadata("design:paramtypes", [ceph_s3_config_service_1.CephS3ConfigService])
|
|
70
|
+
], CephS3Service);
|
|
71
|
+
//# 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,6CAAyC;AACzC,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,MAAM,YAAY,GAA2B;YAC3C,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;QAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,IAAI,wBAAU,CAAC;gBAChC,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAe;aAC7C,CAAC,CAAC;YACH,YAAY,CAAC,WAAW,GAAG;gBACzB,GAAG,YAAY,CAAC,WAAW;gBAC3B,KAAK,EAAE,UAAU;aAClB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAE,CAAC,YAAY,CAAC,CAAC;QAErC,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;AArDY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAKiC,4CAAmB;GAJpD,aAAa,CAqDzB"}
|
|
@@ -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
|