91 lines
2.4 KiB
JavaScript
91 lines
2.4 KiB
JavaScript
|
|
import {
|
||
|
|
deleteAlbumPhoto,
|
||
|
|
deleteAlbumVideo,
|
||
|
|
} from '../../services/image.js';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 앨범 티저 라우트
|
||
|
|
* GET: 공개, DELETE: 인증 필요
|
||
|
|
*/
|
||
|
|
export default async function teasersRoutes(fastify) {
|
||
|
|
const { db } = fastify;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* GET /api/albums/:albumId/teasers
|
||
|
|
*/
|
||
|
|
fastify.get('/:albumId/teasers', {
|
||
|
|
schema: {
|
||
|
|
tags: ['albums'],
|
||
|
|
summary: '앨범 티저 목록',
|
||
|
|
},
|
||
|
|
}, async (request, reply) => {
|
||
|
|
const { albumId } = request.params;
|
||
|
|
|
||
|
|
const [albums] = await db.query('SELECT folder_name FROM albums WHERE id = ?', [albumId]);
|
||
|
|
if (albums.length === 0) {
|
||
|
|
return reply.code(404).send({ error: '앨범을 찾을 수 없습니다.' });
|
||
|
|
}
|
||
|
|
|
||
|
|
const [teasers] = await db.query(
|
||
|
|
`SELECT id, original_url, medium_url, thumb_url, video_url, sort_order, media_type
|
||
|
|
FROM album_teasers
|
||
|
|
WHERE album_id = ?
|
||
|
|
ORDER BY sort_order ASC`,
|
||
|
|
[albumId]
|
||
|
|
);
|
||
|
|
|
||
|
|
return teasers;
|
||
|
|
});
|
||
|
|
|
||
|
|
/**
|
||
|
|
* DELETE /api/albums/:albumId/teasers/:teaserId
|
||
|
|
*/
|
||
|
|
fastify.delete('/:albumId/teasers/:teaserId', {
|
||
|
|
schema: {
|
||
|
|
tags: ['albums'],
|
||
|
|
summary: '티저 삭제',
|
||
|
|
security: [{ bearerAuth: [] }],
|
||
|
|
},
|
||
|
|
preHandler: [fastify.authenticate],
|
||
|
|
}, async (request, reply) => {
|
||
|
|
const { albumId, teaserId } = request.params;
|
||
|
|
const connection = await db.getConnection();
|
||
|
|
|
||
|
|
try {
|
||
|
|
await connection.beginTransaction();
|
||
|
|
|
||
|
|
const [teasers] = await connection.query(
|
||
|
|
`SELECT t.*, a.folder_name
|
||
|
|
FROM album_teasers t
|
||
|
|
JOIN albums a ON t.album_id = a.id
|
||
|
|
WHERE t.id = ? AND t.album_id = ?`,
|
||
|
|
[teaserId, albumId]
|
||
|
|
);
|
||
|
|
|
||
|
|
if (teasers.length === 0) {
|
||
|
|
return reply.code(404).send({ error: '티저를 찾을 수 없습니다.' });
|
||
|
|
}
|
||
|
|
|
||
|
|
const teaser = teasers[0];
|
||
|
|
const filename = teaser.original_url.split('/').pop();
|
||
|
|
|
||
|
|
await deleteAlbumPhoto(teaser.folder_name, 'teaser', filename);
|
||
|
|
|
||
|
|
if (teaser.video_url) {
|
||
|
|
const videoFilename = teaser.video_url.split('/').pop();
|
||
|
|
await deleteAlbumVideo(teaser.folder_name, videoFilename);
|
||
|
|
}
|
||
|
|
|
||
|
|
await connection.query('DELETE FROM album_teasers WHERE id = ?', [teaserId]);
|
||
|
|
|
||
|
|
await connection.commit();
|
||
|
|
return { message: '티저가 삭제되었습니다.' };
|
||
|
|
} catch (error) {
|
||
|
|
await connection.rollback();
|
||
|
|
throw error;
|
||
|
|
} finally {
|
||
|
|
connection.release();
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|