Delete media files from filesystem in media controller

Updated the logic to ensure media files are deleted from the filesystem alongside database entries when exceeding the maximum allowed items and enabled overwrite. Replaced IDs with file paths for proper file deletion.
This commit is contained in:
dswbx
2025-01-09 15:58:35 +01:00
parent d182640981
commit eabd57cb4e

View File

@@ -2,8 +2,7 @@ import { tbValidator as tb } from "core";
import { Type } from "core/utils";
import { bodyLimit } from "hono/body-limit";
import type { StorageAdapter } from "media";
import { StorageEvents } from "media";
import { getRandomizedFilename } from "media";
import { StorageEvents, getRandomizedFilename } from "media";
import { Controller } from "modules/Controller";
import type { AppMedia } from "../AppMedia";
import { MediaField } from "../MediaField";
@@ -109,7 +108,7 @@ export class MediaController extends Controller {
return c.json({ error: `Invalid field "${field_name}"` }, 400);
}
const mediaEntity = this.media.getMediaEntity();
const media_entity = this.media.getMediaEntity().name as "media";
const reference = `${entity_name}.${field_name}`;
const mediaRef = {
scope: field_name,
@@ -119,11 +118,10 @@ export class MediaController extends Controller {
// check max items
const max_items = field.getMaxItems();
const ids_to_delete: number[] = [];
const id_field = mediaEntity.getPrimaryField().name;
const paths_to_delete: string[] = [];
if (max_items) {
const { overwrite } = c.req.valid("query");
const { count } = await this.media.em.repository(mediaEntity).count(mediaRef);
const { count } = await this.media.em.repository(media_entity).count(mediaRef);
// if there are more than or equal to max items
if (count >= max_items) {
@@ -142,18 +140,18 @@ export class MediaController extends Controller {
}
// collect items to delete
const deleteRes = await this.media.em.repo(mediaEntity).findMany({
select: [id_field],
const deleteRes = await this.media.em.repo(media_entity).findMany({
select: ["path"],
where: mediaRef,
sort: {
by: id_field,
by: "id",
dir: "asc"
},
limit: count - max_items + 1
});
if (deleteRes.data && deleteRes.data.length > 0) {
deleteRes.data.map((item) => ids_to_delete.push(item[id_field]));
deleteRes.data.map((item) => paths_to_delete.push(item.path));
}
}
}
@@ -171,7 +169,7 @@ export class MediaController extends Controller {
const file_name = getRandomizedFilename(file as File);
const info = await this.getStorage().uploadFile(file, file_name, true);
const mutator = this.media.em.mutator(mediaEntity);
const mutator = this.media.em.mutator(media_entity);
mutator.__unstable_toggleSystemEntityCreation(false);
const result = await mutator.insertOne({
...this.media.uploadedEventDataToMediaPayload(info),
@@ -180,10 +178,11 @@ export class MediaController extends Controller {
mutator.__unstable_toggleSystemEntityCreation(true);
// delete items if needed
if (ids_to_delete.length > 0) {
await this.media.em
.mutator(mediaEntity)
.deleteWhere({ [id_field]: { $in: ids_to_delete } });
if (paths_to_delete.length > 0) {
// delete files from db & adapter
for (const path of paths_to_delete) {
await this.getStorage().deleteFile(path);
}
}
return c.json({ ok: true, result: result.data, ...info });
@@ -192,4 +191,4 @@ export class MediaController extends Controller {
return hono;
}
}
}