feat : update
CI / Verify (push) Successful in 1m21s
CI / Build immutable images and deploy (push) Successful in 3m12s

This commit is contained in:
2026-09-06 14:47:11 +07:00 Unverified
parent 37d6d6703f
commit c3a7a44d02
19 changed files with 4218 additions and 38 deletions
+27
View File
@@ -126,16 +126,40 @@ export async function updateGuideBasics(guideId: string, input: unknown) {
const [cover] = await getDb().select().from(media).where(and(eq(media.id, data.coverMediaId), eq(media.status, "ready"))).limit(1);
if (!cover) throw new Error("ไม่พบภาพ Guide ที่อัปโหลดแล้ว");
return getDb().transaction(async (tx) => {
const posterArtMediaId = data.posterArtMediaId === undefined
? current.posterArtMediaId
: data.posterArtMediaId;
if (posterArtMediaId) {
const [poster] = await tx
.select({ id: media.id })
.from(media)
.where(and(eq(media.id, posterArtMediaId), eq(media.status, "ready")))
.limit(1);
if (!poster) throw new Error("ไม่พบภาพตัวละครที่อัปโหลดแล้ว");
}
const updated = await advanceGuideVersion(tx, guideId, data.expectedVersion);
await tx.update(guides).set({
overview: data.overview,
coverMediaId: data.coverMediaId,
...(data.youtubeUrl !== undefined ? { youtubeUrl: data.youtubeUrl } : {}),
...(data.posterArtMediaId !== undefined ? { posterArtMediaId } : {}),
...(data.posterArtOffsetX !== undefined ? { posterArtOffsetX: Math.round(data.posterArtOffsetX) } : {}),
...(data.posterArtOffsetY !== undefined ? { posterArtOffsetY: Math.round(data.posterArtOffsetY) } : {}),
...(data.posterTopColors !== undefined ? { posterTopColors: data.posterTopColors } : {}),
...(data.posterBottomColors !== undefined ? { posterBottomColors: data.posterBottomColors } : {}),
}).where(eq(guides.id, guideId));
if (current.coverMediaId !== data.coverMediaId) {
await tx.update(media).set({ currentReferenceCount: sql`greatest(${media.currentReferenceCount} - 1, 0)` }).where(eq(media.id, current.coverMediaId));
await tx.update(media).set({ currentReferenceCount: sql`${media.currentReferenceCount} + 1` }).where(eq(media.id, data.coverMediaId));
}
if (current.posterArtMediaId !== posterArtMediaId) {
if (current.posterArtMediaId) {
await tx.update(media).set({ currentReferenceCount: sql`greatest(${media.currentReferenceCount} - 1, 0)` }).where(eq(media.id, current.posterArtMediaId));
}
if (posterArtMediaId) {
await tx.update(media).set({ currentReferenceCount: sql`${media.currentReferenceCount} + 1` }).where(eq(media.id, posterArtMediaId));
}
}
return updated;
});
}
@@ -390,6 +414,9 @@ export async function permanentlyDeleteGuide(guideId: string) {
if (!guide?.trashedAt) throw new Error("Guide ต้องอยู่ในถังขยะก่อนลบถาวร");
await tx.delete(guides).where(eq(guides.id, guideId));
await tx.update(media).set({ currentReferenceCount: sql`greatest(${media.currentReferenceCount} - 1, 0)` }).where(eq(media.id, guide.coverMediaId));
if (guide.posterArtMediaId) {
await tx.update(media).set({ currentReferenceCount: sql`greatest(${media.currentReferenceCount} - 1, 0)` }).where(eq(media.id, guide.posterArtMediaId));
}
await emitGuideEvents(tx, guide.id, guide.version + 1);
return { version: guide.version + 1 };
});