63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import mongoose from "mongoose";
|
|
import { FileModel, File } from "../../db/models/file";
|
|
|
|
export class FileService {
|
|
private static instance: FileService;
|
|
|
|
private constructor() {}
|
|
|
|
public static getInstance(): FileService {
|
|
if (!this.instance) {
|
|
this.instance = new FileService();
|
|
}
|
|
return this.instance;
|
|
}
|
|
|
|
async createFileRecord(
|
|
userId: string,
|
|
objectKey: string,
|
|
originalName: string,
|
|
mimeType: string,
|
|
size: number
|
|
): Promise<File> {
|
|
const fileRecord = new FileModel({
|
|
userId: new mongoose.Types.ObjectId(userId),
|
|
objectKey,
|
|
originalName,
|
|
mimeType,
|
|
size,
|
|
uploadedAt: new Date(),
|
|
});
|
|
|
|
return await fileRecord.save();
|
|
}
|
|
|
|
async getFilesByUserId(userId: string): Promise<File[]> {
|
|
return FileModel.find({ userId: new mongoose.Types.ObjectId(userId) })
|
|
.sort({ uploadedAt: -1 })
|
|
.exec();
|
|
}
|
|
|
|
async getFileByObjectKey(objectKey: string): Promise<File | null> {
|
|
return FileModel.findOne({ objectKey }).exec();
|
|
}
|
|
|
|
async deleteFileRecord(objectKey: string): Promise<boolean> {
|
|
const result = await FileModel.deleteOne({ objectKey });
|
|
return result.deletedCount > 0;
|
|
}
|
|
|
|
async isFileDuplicate(originalName: string, userId: string): Promise<boolean> {
|
|
const count = await FileModel.countDocuments({
|
|
userId: new mongoose.Types.ObjectId(userId),
|
|
originalName: originalName,
|
|
});
|
|
|
|
return count > 0;
|
|
}
|
|
|
|
async updateObjectKey(fileId: string, objectKey: string): Promise<File | null> {
|
|
return FileModel.findByIdAndUpdate(fileId, { objectKey }, { new: true }).exec();
|
|
}
|
|
}
|