feat(billing): cap each owner's stored file volume
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -17,6 +17,7 @@ import { isGenderQuestionLabel, parsePersonGenderAnswer } from '@mento/shared';
|
||||
import { Prisma } from '@prisma/client';
|
||||
import { PrismaService } from '../prisma/prisma.service';
|
||||
import { LocalFileStorage } from '../storage/local-file.storage';
|
||||
import { StorageQuotaService } from '../billing/storage-quota.service';
|
||||
import { AutomationsService } from '../automations/automations.service';
|
||||
import { MessageAutomationsService } from '../message-automations/message-automations.service';
|
||||
import {
|
||||
@@ -84,6 +85,7 @@ export class LeadFormsService {
|
||||
constructor(
|
||||
private readonly prisma: PrismaService,
|
||||
private readonly files: LocalFileStorage,
|
||||
private readonly storage: StorageQuotaService,
|
||||
private readonly automations: AutomationsService,
|
||||
private readonly messageAutomations: MessageAutomationsService,
|
||||
private readonly leadStages: LeadStagesService,
|
||||
@@ -211,7 +213,12 @@ export class LeadFormsService {
|
||||
}
|
||||
|
||||
async remove(organizationId: string, id: string): Promise<void> {
|
||||
await this.findInOrg(organizationId, id);
|
||||
const row = await this.findInOrg(organizationId, id);
|
||||
if (row.coverStorageKey) {
|
||||
const bytes = await this.files.sizeOf(row.coverStorageKey);
|
||||
await this.files.remove(row.coverStorageKey);
|
||||
if (bytes) await this.storage.addLocal(organizationId, -bytes);
|
||||
}
|
||||
await this.prisma.leadForm.delete({ where: { id } });
|
||||
}
|
||||
|
||||
@@ -835,6 +842,9 @@ export class LeadFormsService {
|
||||
throw new BadRequestException('فرمت تصویر کاور باید PNG، JPG یا WEBP باشد');
|
||||
}
|
||||
const key = `lead-forms/${id}/cover.${ext}`;
|
||||
const prevBytes = row.coverStorageKey ? await this.files.sizeOf(row.coverStorageKey) : 0;
|
||||
const delta = file.buffer.length - prevBytes;
|
||||
if (delta > 0) await this.storage.assertCanAdd(organizationId, delta);
|
||||
await this.files.save(key, file.buffer);
|
||||
if (row.coverStorageKey && row.coverStorageKey !== key) {
|
||||
await this.files.remove(row.coverStorageKey);
|
||||
@@ -843,12 +853,17 @@ export class LeadFormsService {
|
||||
where: { id },
|
||||
data: { coverStorageKey: key },
|
||||
});
|
||||
if (delta) await this.storage.addLocal(organizationId, delta);
|
||||
return this.get(organizationId, id);
|
||||
}
|
||||
|
||||
async removeCover(organizationId: string, id: string) {
|
||||
const row = await this.findInOrg(organizationId, id);
|
||||
if (row.coverStorageKey) await this.files.remove(row.coverStorageKey);
|
||||
if (row.coverStorageKey) {
|
||||
const bytes = await this.files.sizeOf(row.coverStorageKey);
|
||||
await this.files.remove(row.coverStorageKey);
|
||||
if (bytes) await this.storage.addLocal(organizationId, -bytes);
|
||||
}
|
||||
await this.prisma.leadForm.update({
|
||||
where: { id },
|
||||
data: { coverStorageKey: null },
|
||||
|
||||
Reference in New Issue
Block a user