54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
// src/file/file.service.ts
|
|
import { Injectable, Inject } from '@nestjs/common';
|
|
import { PrismaService } from 'src/prisma/prisma.service';
|
|
import type { IStorageProvider } from './storage-providers/storage-provider.interface';
|
|
|
|
@Injectable()
|
|
export class FileService {
|
|
constructor(
|
|
private prisma: PrismaService,
|
|
|
|
@Inject('StorageProvider')
|
|
private readonly storageProvider: IStorageProvider,
|
|
) {}
|
|
|
|
async uploadFile(file: any, folder: string) {
|
|
const lastVersion = await this.prisma.file.findFirst({
|
|
where: { folder, originalName: file.originalname },
|
|
orderBy: { version: 'desc' },
|
|
});
|
|
|
|
const nextVersion = lastVersion ? lastVersion.version + 1 : 1;
|
|
|
|
const storagePath = await this.storageProvider.upload(file, folder);
|
|
|
|
return this.prisma.file.create({
|
|
data: {
|
|
originalName: file.originalname,
|
|
storagePath,
|
|
folder,
|
|
mimeType: file.mimetype,
|
|
size: file.size,
|
|
version: nextVersion,
|
|
},
|
|
});
|
|
}
|
|
|
|
async deleteFile(id: string) {
|
|
const file = await this.prisma.file.findUnique({ where: { id } });
|
|
|
|
if (!file) return;
|
|
|
|
await this.storageProvider.delete(file.storagePath);
|
|
|
|
await this.prisma.file.delete({ where: { id } });
|
|
}
|
|
|
|
async getFileVersions(originalName: string, folder: string) {
|
|
return this.prisma.file.findMany({
|
|
where: { folder, originalName },
|
|
orderBy: { version: 'asc' },
|
|
});
|
|
}
|
|
}
|