92 lines
2.1 KiB
TypeScript
92 lines
2.1 KiB
TypeScript
import { eventHandler, getQuery } from 'h3'
|
|
import { getDatabase } from '../../utils/database'
|
|
|
|
export default eventHandler((event) => {
|
|
const db = getDatabase()
|
|
const query = getQuery(event)
|
|
|
|
const search = (query.search as string) || ''
|
|
const page = parseInt(query.page as string) || 1
|
|
const limit = parseInt(query.limit as string) || 50
|
|
const offset = (page - 1) * limit
|
|
|
|
// Construction de la requête de recherche
|
|
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,
|
|
a.url as artist_url
|
|
FROM tracks t
|
|
LEFT JOIN artists a ON t.artist_id = a.id
|
|
WHERE 1=1
|
|
`
|
|
|
|
const params: any[] = []
|
|
|
|
// Recherche par titre ou artiste
|
|
if (search) {
|
|
sql += ` AND (t.title LIKE ? OR a.name LIKE ?)`
|
|
const searchPattern = `%${search}%`
|
|
params.push(searchPattern, searchPattern)
|
|
}
|
|
|
|
sql += ' ORDER BY t.box_id, t.track_order'
|
|
sql += ' LIMIT ? OFFSET ?'
|
|
params.push(limit, offset)
|
|
|
|
const tracks = db.prepare(sql).all(...params)
|
|
|
|
// Compter le total
|
|
let countSql = `
|
|
SELECT COUNT(*) as total
|
|
FROM tracks t
|
|
LEFT JOIN artists a ON t.artist_id = a.id
|
|
WHERE 1=1
|
|
`
|
|
|
|
const countParams: any[] = []
|
|
|
|
if (search) {
|
|
countSql += ` AND (t.title LIKE ? OR a.name LIKE ?)`
|
|
const searchPattern = `%${search}%`
|
|
countParams.push(searchPattern, searchPattern)
|
|
}
|
|
|
|
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,
|
|
artistUrl: track.artist_url,
|
|
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)
|
|
},
|
|
search
|
|
}
|
|
})
|