94 lines
2.0 KiB
TypeScript
94 lines
2.0 KiB
TypeScript
import { eventHandler, getQuery } from 'h3'
|
|
import { getDatabase } from '../../utils/database'
|
|
|
|
export default eventHandler((event) => {
|
|
const db = getDatabase()
|
|
const query = getQuery(event)
|
|
|
|
// Paramètres de pagination
|
|
const page = parseInt(query.page as string) || 1
|
|
const limit = parseInt(query.limit as string) || 50
|
|
const offset = (page - 1) * limit
|
|
|
|
// Filtres optionnels
|
|
const boxId = query.boxId as string | undefined
|
|
const side = query.side as string | undefined
|
|
|
|
// Construction de la requête
|
|
let sql = `
|
|
SELECT
|
|
t.id,
|
|
t.box_id,
|
|
t.side,
|
|
t.track_order,
|
|
t.title,
|
|
t.artist_id,
|
|
t.start,
|
|
t.link,
|
|
t.cover_id,
|
|
t.url,
|
|
t.type,
|
|
a.name as artist_name
|
|
FROM tracks t
|
|
LEFT JOIN artists a ON t.artist_id = a.id
|
|
WHERE t.type = 'compilation'
|
|
`
|
|
|
|
const params: any[] = []
|
|
|
|
if (boxId) {
|
|
sql += ' AND t.box_id = ?'
|
|
params.push(boxId)
|
|
}
|
|
|
|
if (side) {
|
|
sql += ' AND t.side = ?'
|
|
params.push(side)
|
|
}
|
|
|
|
sql += ' ORDER BY t.box_id, t.side, t.track_order'
|
|
sql += ' LIMIT ? OFFSET ?'
|
|
params.push(limit, offset)
|
|
|
|
const tracks = db.prepare(sql).all(...params)
|
|
|
|
// Compter le total pour la pagination
|
|
let countSql = "SELECT COUNT(*) as total FROM tracks WHERE type = 'compilation'"
|
|
const countParams: any[] = []
|
|
|
|
if (boxId) {
|
|
countSql += ' AND box_id = ?'
|
|
countParams.push(boxId)
|
|
}
|
|
|
|
if (side) {
|
|
countSql += ' AND side = ?'
|
|
countParams.push(side)
|
|
}
|
|
|
|
const { total } = db.prepare(countSql).get(...countParams) as { total: number }
|
|
|
|
return {
|
|
tracks: tracks.map((track: any) => ({
|
|
id: track.id,
|
|
boxId: track.box_id,
|
|
side: track.side,
|
|
order: track.track_order,
|
|
title: track.title,
|
|
artist: track.artist_id,
|
|
artistName: track.artist_name,
|
|
start: track.start,
|
|
link: track.link,
|
|
coverId: track.cover_id,
|
|
url: track.url,
|
|
type: track.type
|
|
})),
|
|
pagination: {
|
|
page,
|
|
limit,
|
|
total,
|
|
totalPages: Math.ceil(total / limit)
|
|
}
|
|
}
|
|
})
|