import * as api from '../../client/src/api'; import { EndpointError, EndpointHandler, catchUnhandledErrors } from './types'; import Knex from 'knex'; import asJson from '../lib/asJson'; export const SongDetailsEndpointHandler: EndpointHandler = async (req: any, res: any, knex: Knex) => { if (!api.checkSongDetailsRequest(req)) { const e: EndpointError = { internalMessage: 'Invalid SongDetails request: ' + JSON.stringify(req.body), httpStatus: 400 }; throw e; } try { const tagIdsPromise: Promise = knex.select('tagId') .from('songs_tags') .where({ 'songId': req.params.id }) .then((ts: any) => { return Array.from(new Set( ts.map((tag: any) => tag['tagId']) )); }) const albumIdsPromise: Promise = knex.select('albumId') .from('songs_albums') .where({ 'songId': req.params.id }) .then((as: any) => { return Array.from(new Set( as.map((album: any) => album['albumId']) )); }) const artistIdsPromise: Promise = knex.select('artistId') .from('songs_artists') .where({ 'songId': req.params.id }) .then((as: any) => { return Array.from(new Set( as.map((artist: any) => artist['artistId']) )); }) const songPromise = await knex.select(['id', 'title', 'storeLinks']) .from('songs') .where({ 'id': req.params.id }) .then((ss: any) => ss[0]) const [tags, albums, artists, song] = await Promise.all([tagIdsPromise, albumIdsPromise, artistIdsPromise, songPromise]); const response: api.SongDetailsResponse = { title: song.title, tagIds: tags, artistIds: artists, albumIds: albums, storeLinks: asJson(song.storeLinks), } await res.send(response); } catch (e) { catchUnhandledErrors(e) } }