proper expire remote user drivefile over limits at adding time

This commit is contained in:
cgsama 2023-06-30 06:26:22 +00:00
parent 97e74198ff
commit 7a93c81a3f
1 changed files with 11 additions and 5 deletions

View File

@ -368,7 +368,7 @@ async function upload(
); );
} }
async function deleteOldFile(user: IRemoteUser) { async function expireOldFile(user: IRemoteUser, driveCapacity: number) {
const q = DriveFiles.createQueryBuilder("file") const q = DriveFiles.createQueryBuilder("file")
.where("file.userId = :userId", { userId: user.id }) .where("file.userId = :userId", { userId: user.id })
.andWhere("file.isLink = FALSE"); .andWhere("file.isLink = FALSE");
@ -381,12 +381,17 @@ async function deleteOldFile(user: IRemoteUser) {
q.andWhere("file.id != :bannerId", { bannerId: user.bannerId }); q.andWhere("file.id != :bannerId", { bannerId: user.bannerId });
} }
//This selete is hard coded, be careful if change database schema
q.addSelect('SUM("file"."size") OVER (ORDER BY "file"."id" DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)', 'acc_usage');
q.orderBy("file.id", "ASC"); q.orderBy("file.id", "ASC");
const oldFile = await q.getOne(); const fileList = await q.getRawMany();
const exceedFileIds = fileList.filter((x: any) => x.acc_usage > driveCapacity).map((x: any) => x.file_id);
if (oldFile) { for (const fileId of exceedFileIds) {
deleteFile(oldFile, true); const file = await DriveFiles.findOneBy({ id: fileId });
deleteFile(file, true);
} }
} }
@ -529,8 +534,9 @@ export async function addFile({
); );
} else { } else {
// (アバターまたはバナーを含まず)最も古いファイルを削除する // (アバターまたはバナーを含まず)最も古いファイルを削除する
deleteOldFile( expireOldFile(
(await Users.findOneByOrFail({ id: user.id })) as IRemoteUser, (await Users.findOneByOrFail({ id: user.id })) as IRemoteUser,
driveCapacity - info.size
); );
} }
} }