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.
- 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 +41 -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 +38 -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 +23 -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 +59 -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 +3 -5
|
@@ -0,0 +1,231 @@
|
|
|
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 ObjectService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ObjectService = 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 ObjectService = ObjectService_1 = class ObjectService {
|
|
18
|
+
constructor(cephS3Service) {
|
|
19
|
+
this.cephS3Service = cephS3Service;
|
|
20
|
+
this.logger = new common_1.Logger(ObjectService_1.name);
|
|
21
|
+
}
|
|
22
|
+
async uploadObject(bucketName, key, body, options) {
|
|
23
|
+
try {
|
|
24
|
+
const s3 = this.cephS3Service.getClient();
|
|
25
|
+
const uploadParams = {
|
|
26
|
+
Bucket: bucketName,
|
|
27
|
+
Key: key,
|
|
28
|
+
Body: body,
|
|
29
|
+
ContentType: options?.contentType || 'application/octet-stream',
|
|
30
|
+
Metadata: options?.metadata,
|
|
31
|
+
ServerSideEncryption: options?.serverSideEncryption,
|
|
32
|
+
ACL: options?.acl,
|
|
33
|
+
};
|
|
34
|
+
const result = await s3.upload(uploadParams).promise();
|
|
35
|
+
this.logger.log(`Object uploaded successfully: ${key} to ${bucketName}`);
|
|
36
|
+
return result.ETag;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const errorMessage = error?.message || error;
|
|
40
|
+
this.logger.error(`Failed to upload object ${key}:`, errorMessage);
|
|
41
|
+
throw new ceph_exceptions_1.UploadFailedError(errorMessage);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async downloadObject(bucketName, key) {
|
|
45
|
+
try {
|
|
46
|
+
const s3 = this.cephS3Service.getClient();
|
|
47
|
+
const result = await s3.getObject({ Bucket: bucketName, Key: key }).promise();
|
|
48
|
+
if (result.Body instanceof Buffer) {
|
|
49
|
+
return result.Body;
|
|
50
|
+
}
|
|
51
|
+
else if (result.Body instanceof Uint8Array) {
|
|
52
|
+
return Buffer.from(result.Body);
|
|
53
|
+
}
|
|
54
|
+
else if (typeof result.Body === 'string') {
|
|
55
|
+
return Buffer.from(result.Body);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Handle Readable stream
|
|
59
|
+
const chunks = [];
|
|
60
|
+
const stream = result.Body;
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
stream.on('data', (chunk) => chunks.push(chunk));
|
|
63
|
+
stream.on('error', reject);
|
|
64
|
+
stream.on('end', () => resolve(Buffer.concat(chunks)));
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error?.statusCode === 404 || error?.code === 'NoSuchKey') {
|
|
70
|
+
throw new ceph_exceptions_1.FileNotFoundError(key);
|
|
71
|
+
}
|
|
72
|
+
const errorMessage = error?.message || error;
|
|
73
|
+
this.logger.error(`Failed to download object ${key}:`, errorMessage);
|
|
74
|
+
throw new ceph_exceptions_1.DownloadFailedError(errorMessage);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async getObjectStream(bucketName, key) {
|
|
78
|
+
try {
|
|
79
|
+
const s3 = this.cephS3Service.getClient();
|
|
80
|
+
const stream = s3.getObject({ Bucket: bucketName, Key: key }).createReadStream();
|
|
81
|
+
return stream;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error?.statusCode === 404 || error?.code === 'NoSuchKey') {
|
|
85
|
+
throw new ceph_exceptions_1.FileNotFoundError(key);
|
|
86
|
+
}
|
|
87
|
+
const errorMessage = error?.message || error;
|
|
88
|
+
this.logger.error(`Failed to get object stream ${key}:`, errorMessage);
|
|
89
|
+
throw new ceph_exceptions_1.DownloadFailedError(errorMessage);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async deleteObject(bucketName, key) {
|
|
93
|
+
try {
|
|
94
|
+
const s3 = this.cephS3Service.getClient();
|
|
95
|
+
await s3.deleteObject({ Bucket: bucketName, Key: key }).promise();
|
|
96
|
+
this.logger.log(`Object deleted successfully: ${key} from ${bucketName}`);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const errorMessage = error?.message || error;
|
|
100
|
+
this.logger.error(`Failed to delete object ${key}:`, errorMessage);
|
|
101
|
+
throw new Error(`Failed to delete object: ${errorMessage}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async deleteObjects(bucketName, keys) {
|
|
105
|
+
try {
|
|
106
|
+
const s3 = this.cephS3Service.getClient();
|
|
107
|
+
const deleteParams = {
|
|
108
|
+
Bucket: bucketName,
|
|
109
|
+
Delete: {
|
|
110
|
+
Objects: keys.map(key => ({ Key: key })),
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
await s3.deleteObjects(deleteParams).promise();
|
|
114
|
+
this.logger.log(`${keys.length} objects deleted successfully from ${bucketName}`);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const errorMessage = error?.message || error;
|
|
118
|
+
this.logger.error(`Failed to delete objects:`, errorMessage);
|
|
119
|
+
throw new Error(`Failed to delete objects: ${errorMessage}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async listObjects(bucketName, options) {
|
|
123
|
+
try {
|
|
124
|
+
const s3 = this.cephS3Service.getClient();
|
|
125
|
+
const listParams = {
|
|
126
|
+
Bucket: bucketName,
|
|
127
|
+
Prefix: options?.prefix,
|
|
128
|
+
Delimiter: options?.delimiter,
|
|
129
|
+
MaxKeys: options?.maxKeys,
|
|
130
|
+
ContinuationToken: options?.continuationToken,
|
|
131
|
+
};
|
|
132
|
+
const result = await s3.listObjectsV2(listParams).promise();
|
|
133
|
+
const objects = result.Contents?.map(obj => ({
|
|
134
|
+
key: obj.Key,
|
|
135
|
+
size: obj.Size,
|
|
136
|
+
lastModified: obj.LastModified,
|
|
137
|
+
etag: obj.ETag,
|
|
138
|
+
storageClass: obj.StorageClass,
|
|
139
|
+
})) || [];
|
|
140
|
+
// Extract common prefixes (these represent folders)
|
|
141
|
+
const commonPrefixes = result.CommonPrefixes?.map(cp => cp.Prefix) || [];
|
|
142
|
+
return {
|
|
143
|
+
objects,
|
|
144
|
+
isTruncated: result.IsTruncated || false,
|
|
145
|
+
nextContinuationToken: result.NextContinuationToken,
|
|
146
|
+
commonPrefixes,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
const errorMessage = error?.message || error;
|
|
151
|
+
this.logger.error(`Failed to list objects in ${bucketName}:`, errorMessage);
|
|
152
|
+
throw new Error(`Failed to list objects: ${errorMessage}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async objectExists(bucketName, key) {
|
|
156
|
+
try {
|
|
157
|
+
const s3 = this.cephS3Service.getClient();
|
|
158
|
+
await s3.headObject({ Bucket: bucketName, Key: key }).promise();
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (error?.statusCode === 404 || error?.code === 'NoSuchKey') {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
const errorMessage = error?.message || error;
|
|
166
|
+
throw new Error(`Failed to check object existence: ${errorMessage}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async getObjectMetadata(bucketName, key) {
|
|
170
|
+
try {
|
|
171
|
+
const s3 = this.cephS3Service.getClient();
|
|
172
|
+
const result = await s3.headObject({ Bucket: bucketName, Key: key }).promise();
|
|
173
|
+
return {
|
|
174
|
+
contentLength: result.ContentLength,
|
|
175
|
+
contentType: result.ContentType,
|
|
176
|
+
lastModified: result.LastModified,
|
|
177
|
+
etag: result.ETag,
|
|
178
|
+
metadata: result.Metadata,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (error?.statusCode === 404 || error?.code === 'NoSuchKey') {
|
|
183
|
+
throw new ceph_exceptions_1.FileNotFoundError(key);
|
|
184
|
+
}
|
|
185
|
+
const errorMessage = error?.message || error;
|
|
186
|
+
this.logger.error(`Failed to get object metadata ${key}:`, errorMessage);
|
|
187
|
+
throw new Error(`Failed to get object metadata: ${errorMessage}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async copyObject(sourceBucket, sourceKey, destBucket, destKey) {
|
|
191
|
+
try {
|
|
192
|
+
const s3 = this.cephS3Service.getClient();
|
|
193
|
+
await s3.copyObject({
|
|
194
|
+
Bucket: destBucket,
|
|
195
|
+
Key: destKey,
|
|
196
|
+
CopySource: `${sourceBucket}/${sourceKey}`,
|
|
197
|
+
}).promise();
|
|
198
|
+
this.logger.log(`Object copied from ${sourceBucket}/${sourceKey} to ${destBucket}/${destKey}`);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
const errorMessage = error?.message || error;
|
|
202
|
+
this.logger.error(`Failed to copy object:`, errorMessage);
|
|
203
|
+
throw new Error(`Failed to copy object: ${errorMessage}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async generatePresignedUrl(bucketName, key, operation, options) {
|
|
207
|
+
try {
|
|
208
|
+
const s3 = this.cephS3Service.getClient();
|
|
209
|
+
const params = {
|
|
210
|
+
Bucket: bucketName,
|
|
211
|
+
Key: key,
|
|
212
|
+
Expires: options?.expiresIn || 3600, // 1 hour default
|
|
213
|
+
ResponseContentDisposition: options?.responseHeaders?.['Content-Disposition'],
|
|
214
|
+
ResponseContentType: options?.responseHeaders?.['Content-Type'],
|
|
215
|
+
};
|
|
216
|
+
const url = await s3.getSignedUrlPromise(operation, params);
|
|
217
|
+
return url;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
const errorMessage = error?.message || error;
|
|
221
|
+
this.logger.error(`Failed to generate presigned URL:`, errorMessage);
|
|
222
|
+
throw new Error(`Failed to generate presigned URL: ${errorMessage}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
exports.ObjectService = ObjectService;
|
|
227
|
+
exports.ObjectService = ObjectService = ObjectService_1 = __decorate([
|
|
228
|
+
(0, common_1.Injectable)(),
|
|
229
|
+
__metadata("design:paramtypes", [ceph_s3_service_1.CephS3Service])
|
|
230
|
+
], ObjectService);
|
|
231
|
+
//# sourceMappingURL=object.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.service.js","sourceRoot":"","sources":["../../src/services/object.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { BucketService } from './bucket.service';
|
|
2
|
+
import { ObjectService } from './object.service';
|
|
3
|
+
import { FolderService } from './folder.service';
|
|
4
|
+
export declare class StorageService {
|
|
5
|
+
private readonly bucketService;
|
|
6
|
+
private readonly objectService;
|
|
7
|
+
private readonly folderService;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
constructor(bucketService: BucketService, objectService: ObjectService, folderService: FolderService);
|
|
10
|
+
getStorageStats(bucketName?: string): Promise<{
|
|
11
|
+
totalBuckets: number;
|
|
12
|
+
totalObjects: number;
|
|
13
|
+
totalSize: number;
|
|
14
|
+
bucketStats?: Array<{
|
|
15
|
+
name: string;
|
|
16
|
+
objectCount: number;
|
|
17
|
+
size: number;
|
|
18
|
+
}>;
|
|
19
|
+
}>;
|
|
20
|
+
optimizeStorage(bucketName: string): Promise<{
|
|
21
|
+
duplicatesFound: number;
|
|
22
|
+
emptyFoldersFound: number;
|
|
23
|
+
oldFilesFound: number;
|
|
24
|
+
totalSpaceSaved: number;
|
|
25
|
+
}>;
|
|
26
|
+
migrateData(sourceBucket: string, destBucket: string, options?: {
|
|
27
|
+
deleteSource?: boolean;
|
|
28
|
+
overwriteExisting?: boolean;
|
|
29
|
+
preserveMetadata?: boolean;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
filesMigrated: number;
|
|
32
|
+
totalSize: number;
|
|
33
|
+
errors: string[];
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=storage.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../src/services/storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,qBACa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IALhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;gBAGvC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa;IAGzC,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAClD,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,KAAK,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC;SACd,CAAC,CAAC;KACJ,CAAC;IAuDI,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IAiDI,WAAW,CACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;QACP,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;KACvB,GACL,OAAO,CAAC;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CA8CH"}
|
|
@@ -0,0 +1,165 @@
|
|
|
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 StorageService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.StorageService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const bucket_service_1 = require("./bucket.service");
|
|
16
|
+
const object_service_1 = require("./object.service");
|
|
17
|
+
const folder_service_1 = require("./folder.service");
|
|
18
|
+
let StorageService = StorageService_1 = class StorageService {
|
|
19
|
+
constructor(bucketService, objectService, folderService) {
|
|
20
|
+
this.bucketService = bucketService;
|
|
21
|
+
this.objectService = objectService;
|
|
22
|
+
this.folderService = folderService;
|
|
23
|
+
this.logger = new common_1.Logger(StorageService_1.name);
|
|
24
|
+
}
|
|
25
|
+
async getStorageStats(bucketName) {
|
|
26
|
+
try {
|
|
27
|
+
const buckets = await this.bucketService.listBuckets();
|
|
28
|
+
let totalObjects = 0;
|
|
29
|
+
let totalSize = 0;
|
|
30
|
+
const bucketStats = [];
|
|
31
|
+
if (bucketName) {
|
|
32
|
+
// Get stats for specific bucket
|
|
33
|
+
const objects = await this.objectService.listObjects(bucketName);
|
|
34
|
+
const bucketSize = objects.objects.reduce((sum, obj) => sum + obj.size, 0);
|
|
35
|
+
bucketStats.push({
|
|
36
|
+
name: bucketName,
|
|
37
|
+
objectCount: objects.objects.length,
|
|
38
|
+
size: bucketSize,
|
|
39
|
+
});
|
|
40
|
+
totalObjects = objects.objects.length;
|
|
41
|
+
totalSize = bucketSize;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Get stats for all buckets
|
|
45
|
+
for (const bucket of buckets) {
|
|
46
|
+
try {
|
|
47
|
+
const objects = await this.objectService.listObjects(bucket.name);
|
|
48
|
+
const bucketSize = objects.objects.reduce((sum, obj) => sum + obj.size, 0);
|
|
49
|
+
bucketStats.push({
|
|
50
|
+
name: bucket.name,
|
|
51
|
+
objectCount: objects.objects.length,
|
|
52
|
+
size: bucketSize,
|
|
53
|
+
});
|
|
54
|
+
totalObjects += objects.objects.length;
|
|
55
|
+
totalSize += bucketSize;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// Skip buckets we can't access
|
|
59
|
+
this.logger.warn(`Cannot access bucket ${bucket.name}: ${error}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
totalBuckets: bucketName ? 1 : buckets.length,
|
|
65
|
+
totalObjects,
|
|
66
|
+
totalSize,
|
|
67
|
+
bucketStats,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const errorMessage = error?.message || error;
|
|
72
|
+
this.logger.error('Failed to get storage stats:', errorMessage);
|
|
73
|
+
throw new Error(`Failed to get storage stats: ${errorMessage}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async optimizeStorage(bucketName) {
|
|
77
|
+
let duplicatesFound = 0;
|
|
78
|
+
let emptyFoldersFound = 0;
|
|
79
|
+
let oldFilesFound = 0;
|
|
80
|
+
let totalSpaceSaved = 0;
|
|
81
|
+
try {
|
|
82
|
+
// Find duplicates (same size and name)
|
|
83
|
+
const allObjects = await this.objectService.listObjects(bucketName);
|
|
84
|
+
const sizeMap = new Map();
|
|
85
|
+
allObjects.objects.forEach(obj => {
|
|
86
|
+
if (!sizeMap.has(obj.size)) {
|
|
87
|
+
sizeMap.set(obj.size, []);
|
|
88
|
+
}
|
|
89
|
+
sizeMap.get(obj.size).push(obj.key);
|
|
90
|
+
});
|
|
91
|
+
// Count potential duplicates
|
|
92
|
+
sizeMap.forEach((files, size) => {
|
|
93
|
+
if (files.length > 1) {
|
|
94
|
+
duplicatesFound += files.length - 1;
|
|
95
|
+
totalSpaceSaved += (files.length - 1) * size;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
// Find old files (older than 1 year)
|
|
99
|
+
const oneYearAgo = new Date();
|
|
100
|
+
oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);
|
|
101
|
+
oldFilesFound = allObjects.objects.filter(obj => obj.lastModified < oneYearAgo).length;
|
|
102
|
+
this.logger.log(`Storage optimization analysis for ${bucketName} completed`);
|
|
103
|
+
return {
|
|
104
|
+
duplicatesFound,
|
|
105
|
+
emptyFoldersFound,
|
|
106
|
+
oldFilesFound,
|
|
107
|
+
totalSpaceSaved,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
const errorMessage = error?.message || error;
|
|
112
|
+
this.logger.error(`Failed to optimize storage for ${bucketName}:`, errorMessage);
|
|
113
|
+
throw new Error(`Failed to optimize storage: ${errorMessage}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async migrateData(sourceBucket, destBucket, options = {}) {
|
|
117
|
+
let filesMigrated = 0;
|
|
118
|
+
let totalSize = 0;
|
|
119
|
+
const errors = [];
|
|
120
|
+
try {
|
|
121
|
+
const sourceObjects = await this.objectService.listObjects(sourceBucket);
|
|
122
|
+
for (const obj of sourceObjects.objects) {
|
|
123
|
+
try {
|
|
124
|
+
// Check if destination exists
|
|
125
|
+
if (!options.overwriteExisting) {
|
|
126
|
+
const destExists = await this.objectService.objectExists(destBucket, obj.key);
|
|
127
|
+
if (destExists) {
|
|
128
|
+
continue; // Skip existing files
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Copy object
|
|
132
|
+
await this.objectService.copyObject(sourceBucket, obj.key, destBucket, obj.key);
|
|
133
|
+
filesMigrated++;
|
|
134
|
+
totalSize += obj.size;
|
|
135
|
+
// Delete source if requested
|
|
136
|
+
if (options.deleteSource) {
|
|
137
|
+
await this.objectService.deleteObject(sourceBucket, obj.key);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
errors.push(`Failed to migrate ${obj.key}: ${error.message}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
this.logger.log(`Migration completed: ${filesMigrated} files migrated`);
|
|
145
|
+
return {
|
|
146
|
+
filesMigrated,
|
|
147
|
+
totalSize,
|
|
148
|
+
errors,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
const errorMessage = error?.message || error;
|
|
153
|
+
this.logger.error(`Failed to migrate data:`, errorMessage);
|
|
154
|
+
throw new Error(`Failed to migrate data: ${errorMessage}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
exports.StorageService = StorageService;
|
|
159
|
+
exports.StorageService = StorageService = StorageService_1 = __decorate([
|
|
160
|
+
(0, common_1.Injectable)(),
|
|
161
|
+
__metadata("design:paramtypes", [bucket_service_1.BucketService,
|
|
162
|
+
object_service_1.ObjectService,
|
|
163
|
+
folder_service_1.FolderService])
|
|
164
|
+
], StorageService);
|
|
165
|
+
//# sourceMappingURL=storage.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../src/services/storage.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error utilities for safe error handling in TypeScript
|
|
3
|
+
*/
|
|
4
|
+
export interface ExtractedError {
|
|
5
|
+
message: string;
|
|
6
|
+
statusCode?: number;
|
|
7
|
+
code?: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Safely extract error information from unknown error types
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractErrorInfo(error: unknown): ExtractedError;
|
|
14
|
+
/**
|
|
15
|
+
* Check if error has statusCode property
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasStatusCode(error: unknown): error is {
|
|
18
|
+
statusCode: number;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Safe error message extraction
|
|
22
|
+
*/
|
|
23
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
24
|
+
/**
|
|
25
|
+
* Safe status code extraction
|
|
26
|
+
*/
|
|
27
|
+
export declare function getErrorStatusCode(error: unknown): number | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Check if error is a 404 not found error
|
|
30
|
+
*/
|
|
31
|
+
export declare function isNotFoundError(error: unknown): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Create a standardized error response
|
|
34
|
+
*/
|
|
35
|
+
export declare function createErrorResponse(error: unknown, context: string): {
|
|
36
|
+
message: string;
|
|
37
|
+
context: string;
|
|
38
|
+
statusCode?: number;
|
|
39
|
+
code?: string;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=error.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.utils.d.ts","sourceRoot":"","sources":["../../src/utils/error.utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAyC/D;AAmCD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAO7E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAErE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAQA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error utilities for safe error handling in TypeScript
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.extractErrorInfo = extractErrorInfo;
|
|
7
|
+
exports.hasStatusCode = hasStatusCode;
|
|
8
|
+
exports.getErrorMessage = getErrorMessage;
|
|
9
|
+
exports.getErrorStatusCode = getErrorStatusCode;
|
|
10
|
+
exports.isNotFoundError = isNotFoundError;
|
|
11
|
+
exports.createErrorResponse = createErrorResponse;
|
|
12
|
+
/**
|
|
13
|
+
* Safely extract error information from unknown error types
|
|
14
|
+
*/
|
|
15
|
+
function extractErrorInfo(error) {
|
|
16
|
+
// Handle Error instances
|
|
17
|
+
if (error instanceof Error) {
|
|
18
|
+
return {
|
|
19
|
+
message: error.message,
|
|
20
|
+
name: error.name,
|
|
21
|
+
statusCode: error.statusCode,
|
|
22
|
+
code: error.code,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Handle AWS SDK errors
|
|
26
|
+
if (isAWSError(error)) {
|
|
27
|
+
return {
|
|
28
|
+
message: error.message,
|
|
29
|
+
statusCode: error.statusCode,
|
|
30
|
+
code: error.code,
|
|
31
|
+
name: error.name,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Handle objects with message property
|
|
35
|
+
if (isErrorLike(error)) {
|
|
36
|
+
return {
|
|
37
|
+
message: error.message,
|
|
38
|
+
statusCode: error.statusCode,
|
|
39
|
+
code: error.code,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Handle string errors
|
|
43
|
+
if (typeof error === 'string') {
|
|
44
|
+
return {
|
|
45
|
+
message: error,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Fallback for unknown error types
|
|
49
|
+
return {
|
|
50
|
+
message: 'An unknown error occurred',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if error is AWS SDK error-like
|
|
55
|
+
*/
|
|
56
|
+
function isAWSError(error) {
|
|
57
|
+
return (typeof error === 'object' &&
|
|
58
|
+
error !== null &&
|
|
59
|
+
'message' in error &&
|
|
60
|
+
typeof error.message === 'string');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if error has message property
|
|
64
|
+
*/
|
|
65
|
+
function isErrorLike(error) {
|
|
66
|
+
return (typeof error === 'object' &&
|
|
67
|
+
error !== null &&
|
|
68
|
+
'message' in error &&
|
|
69
|
+
typeof error.message === 'string');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if error has statusCode property
|
|
73
|
+
*/
|
|
74
|
+
function hasStatusCode(error) {
|
|
75
|
+
return (typeof error === 'object' &&
|
|
76
|
+
error !== null &&
|
|
77
|
+
'statusCode' in error &&
|
|
78
|
+
typeof error.statusCode === 'number');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Safe error message extraction
|
|
82
|
+
*/
|
|
83
|
+
function getErrorMessage(error) {
|
|
84
|
+
return extractErrorInfo(error).message;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Safe status code extraction
|
|
88
|
+
*/
|
|
89
|
+
function getErrorStatusCode(error) {
|
|
90
|
+
return extractErrorInfo(error).statusCode;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if error is a 404 not found error
|
|
94
|
+
*/
|
|
95
|
+
function isNotFoundError(error) {
|
|
96
|
+
const statusCode = getErrorStatusCode(error);
|
|
97
|
+
return statusCode === 404;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create a standardized error response
|
|
101
|
+
*/
|
|
102
|
+
function createErrorResponse(error, context) {
|
|
103
|
+
const errorInfo = extractErrorInfo(error);
|
|
104
|
+
return {
|
|
105
|
+
message: errorInfo.message,
|
|
106
|
+
context,
|
|
107
|
+
statusCode: errorInfo.statusCode,
|
|
108
|
+
code: errorInfo.code,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=error.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.utils.js","sourceRoot":"","sources":["../../src/utils/error.utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAYH,4CAyCC;AAsCD,sCAOC;AAKD,0CAEC;AAKD,gDAEC;AAKD,0CAGC;AAKD,kDAaC;AAjID;;GAEG;AACH,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,yBAAyB;IACzB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAG,KAAa,CAAC,UAAU;YACrC,IAAI,EAAG,KAAa,CAAC,IAAI;SAC1B,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,OAAO;QACL,OAAO,EAAE,2BAA2B;KACrC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,KAAc;IAMhC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,OAAQ,KAAa,CAAC,OAAO,KAAK,QAAQ,CAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAc;IAKjC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,OAAQ,KAAa,CAAC,OAAO,KAAK,QAAQ,CAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAc;IAC1C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,YAAY,IAAI,KAAK;QACrB,OAAQ,KAAa,CAAC,UAAU,KAAK,QAAQ,CAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAc;IAC5C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAc;IAC5C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,UAAU,KAAK,GAAG,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,KAAc,EAAE,OAAe;IAMjE,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,OAAO;QACP,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,IAAI,EAAE,SAAS,CAAC,IAAI;KACrB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class MimeHelper {
|
|
2
|
+
private static readonly mimeTypes;
|
|
3
|
+
static getMimeType(filename: string): string;
|
|
4
|
+
static isImage(filename: string): boolean;
|
|
5
|
+
static isVideo(filename: string): boolean;
|
|
6
|
+
static isAudio(filename: string): boolean;
|
|
7
|
+
static isDocument(filename: string): boolean;
|
|
8
|
+
static getFileCategory(filename: string): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mime-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime-helper.d.ts","sourceRoot":"","sources":["../../src/utils/mime-helper.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAkD/B;IAEF,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK5C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKzC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKzC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKzC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAO5C,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAOjD"}
|