diff --git a/backend/src/routes/albums/photos.js b/backend/src/routes/albums/photos.js index 2da6b74..c87d7d0 100644 --- a/backend/src/routes/albums/photos.js +++ b/backend/src/routes/albums/photos.js @@ -3,6 +3,7 @@ import { deleteAlbumPhoto, uploadAlbumVideo, } from '../../services/image.js'; +import { invalidateAlbumCache } from '../../services/album.js'; import { withTransaction } from '../../utils/transaction.js'; import { notFound } from '../../utils/error.js'; import { logActivity } from '../../utils/log.js'; @@ -12,7 +13,7 @@ import { logActivity } from '../../utils/log.js'; * GET: 공개, POST/DELETE: 인증 필요 */ export default async function photosRoutes(fastify) { - const { db } = fastify; + const { db, redis } = fastify; /** * GET /api/albums/:albumId/photos @@ -196,6 +197,9 @@ export default async function photosRoutes(fastify) { await connection.commit(); + // 앨범 캐시 무효화 + await invalidateAlbumCache(redis, parseInt(albumId)); + logActivity(db, { actor: 'admin', action: 'upload', category: 'album', targetType: 'photo', targetId: parseInt(albumId), summary: `사진 업로드: ${uploadedPhotos.length}장 (앨범 ${albumId})` }); reply.raw.write(`data: ${JSON.stringify({ @@ -248,6 +252,9 @@ export default async function photosRoutes(fastify) { await connection.query('DELETE FROM album_photo_members WHERE photo_id = ?', [photoId]); await connection.query('DELETE FROM album_photos WHERE id = ?', [photoId]); + // 앨범 캐시 무효화 + await invalidateAlbumCache(redis, parseInt(albumId)); + logActivity(db, { actor: 'admin', action: 'delete', category: 'album', targetType: 'photo', targetId: parseInt(photoId), summary: `사진 삭제: 앨범 ${albumId}` }); return { message: '사진이 삭제되었습니다.' }; }); diff --git a/backend/src/routes/albums/teasers.js b/backend/src/routes/albums/teasers.js index e7f4f34..e1160a2 100644 --- a/backend/src/routes/albums/teasers.js +++ b/backend/src/routes/albums/teasers.js @@ -2,6 +2,7 @@ import { deleteAlbumPhoto, deleteAlbumVideo, } from '../../services/image.js'; +import { invalidateAlbumCache } from '../../services/album.js'; import { withTransaction } from '../../utils/transaction.js'; import { notFound } from '../../utils/error.js'; import { logActivity } from '../../utils/log.js'; @@ -11,7 +12,7 @@ import { logActivity } from '../../utils/log.js'; * GET: 공개, DELETE: 인증 필요 */ export default async function teasersRoutes(fastify) { - const { db } = fastify; + const { db, redis } = fastify; /** * GET /api/albums/:albumId/teasers @@ -79,6 +80,8 @@ export default async function teasersRoutes(fastify) { await connection.query('DELETE FROM album_teasers WHERE id = ?', [teaserId]); + await invalidateAlbumCache(redis, parseInt(albumId)); + logActivity(db, { actor: 'admin', action: 'delete', category: 'album', targetType: 'teaser', targetId: parseInt(teaserId), summary: `티저 삭제: 앨범 ${albumId}` }); return { message: '티저가 삭제되었습니다.' }; });