import * as api from '../../client/src/api'; import { EndpointError, EndpointHandler, catchUnhandledErrors } from './types'; import Knex from 'knex'; import asJson from '../lib/asJson'; export const AlbumDetailsEndpointHandler: EndpointHandler = async (req: any, res: any, knex: Knex) => { if (!api.checkAlbumDetailsRequest(req)) { const e: EndpointError = { internalMessage: 'Invalid AlbumDetails request: ' + JSON.stringify(req.body), httpStatus: 400 }; throw e; } const { id: userId } = req.user; try { // Start transfers for songs, tags and artists. // Also request the album itself. const tagIdsPromise = knex.select('tagId') .from('albums_tags') .where({ 'albumId': req.params.id }) .then((tags: any) => { return tags.map((tag: any) => tag['tagId']) }); const songIdsPromise = knex.select('songId') .from('songs_albums') .where({ 'albumId': req.params.id }) .then((songs: any) => { return songs.map((song: any) => song['songId']) }); const artistIdsPromise = knex.select('artistId') .from('artists_albums') .where({ 'albumId': req.params.id }) .then((artists: any) => { return artists.map((artist: any) => artist['artistId']) }); const albumPromise = knex.select('name', 'storeLinks') .from('albums') .where({ 'user': userId }) .where({ id: req.params.id }) .then((albums: any) => albums[0]); // Wait for the requests to finish. const [album, tags, songs, artists] = await Promise.all([albumPromise, tagIdsPromise, songIdsPromise, artistIdsPromise]); // Respond to the request. const response: api.AlbumDetailsResponse = { name: album['name'], artistIds: artists, tagIds: tags, songIds: songs, storeLinks: asJson(album['storeLinks']), }; await res.send(response); } catch (e) { catchUnhandledErrors(e); } }