feat(media): add reference-aware S3 image delivery

This commit is contained in:
2026-08-28 19:45:53 +00:00 Unverified
parent 35a786156a
commit 56460dcf13
13 changed files with 591 additions and 9 deletions
+25 -9
View File
@@ -8,6 +8,7 @@ import {
characters,
dataSources,
dataSourceVersions,
media,
pageDataSources,
pages,
slugAliases,
@@ -307,11 +308,18 @@ export async function getMediaVisibility(mediaId: string): Promise<{
retained: boolean;
}> {
const db = getDb();
const referencedBlocks = await db
.select({ block: blocks, page: pages, character: characters })
.from(blocks)
.innerJoin(pages, eq(pages.id, blocks.pageId))
.innerJoin(characters, eq(characters.id, pages.characterId));
const [referencedBlocks, portraitCharacters, [mediaRecord]] = await Promise.all([
db
.select({ block: blocks, page: pages, character: characters })
.from(blocks)
.innerJoin(pages, eq(pages.id, blocks.pageId))
.innerJoin(characters, eq(characters.id, pages.characterId)),
db
.select({ character: characters })
.from(characters)
.where(eq(characters.portraitMediaId, mediaId)),
db.select().from(media).where(eq(media.id, mediaId)).limit(1),
]);
const hasMediaId = (value: unknown): boolean => {
if (Array.isArray(value)) return value.some(hasMediaId);
@@ -325,9 +333,17 @@ export async function getMediaVisibility(mediaId: string): Promise<{
hasMediaId(block.config),
);
return {
public: references.some(
({ page, character }) => page.visible && character.visible,
),
retained: references.length > 0,
public:
references.some(
({ page, character }) => page.visible && character.visible,
) || portraitCharacters.some(({ character }) => character.visible),
retained:
references.length > 0 ||
portraitCharacters.length > 0 ||
Boolean(
mediaRecord &&
(mediaRecord.currentReferenceCount > 0 ||
mediaRecord.revisionReferenceCount > 0),
),
};
}