unattached-media: delete orphaned attachments after 15 minutes

This commit is contained in:
Alex Gleason 2023-09-09 19:27:39 -05:00
parent 46b9deffce
commit 0b867afd8e
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
3 changed files with 49 additions and 2 deletions

View File

@ -1,6 +1,9 @@
import * as eventsDB from '@/db/events.ts';
import { deleteUnattachedMediaByUrl, getUnattachedMedia } from '@/db/unattached-media.ts';
import { cron } from '@/deps.ts';
import { Time } from '@/utils/time.ts';
import { configUploader as uploader } from '@/uploaders/config.ts';
import { cidFromUrl } from '@/utils/ipfs.ts';
/** Clean up old remote events. */
async function cleanupEvents() {
@ -14,6 +17,29 @@ async function cleanupEvents() {
console.log(`Cleaned up ${result?.numDeletedRows ?? 0} old remote events.`);
}
/** Delete files that aren't attached to any events. */
async function cleanupMedia() {
console.log('Deleting orphaned media files...');
const until = new Date(Date.now() - Time.minutes(15));
const media = await getUnattachedMedia(until);
for (const { url } of media) {
const cid = cidFromUrl(new URL(url))!;
try {
await uploader.delete(cid);
await deleteUnattachedMediaByUrl(url);
} catch (e) {
console.error(`Failed to delete file ${url}`);
console.error(e);
}
}
console.log(`Removed ${media?.length ?? 0} orphaned media files.`);
}
await cleanupEvents();
await cleanupMedia();
cron.every15Minute(cleanupEvents);
cron.every15Minute(cleanupMedia);

View File

@ -27,4 +27,25 @@ function insertUnattachedMedia(media: Omit<UnattachedMedia, 'id' | 'uploaded_at'
.execute();
}
export { insertUnattachedMedia };
/** Find attachments that exist but aren't attached to any events. */
function getUnattachedMedia(until: Date) {
return db.selectFrom('unattached_media')
.select([
'unattached_media.id',
'unattached_media.pukey',
'unattached_media.url',
'unattached_media.data',
'unattached_media.uploaded_at',
])
.leftJoin('tags', 'unattached_media.url', 'tags.value')
.where('uploaded_at', '<', until)
.execute();
}
function deleteUnattachedMediaByUrl(url: string) {
return db.deleteFrom('unattached_media')
.where('url', '=', url)
.execute();
}
export { deleteUnattachedMediaByUrl, getUnattachedMedia, insertUnattachedMedia };