From 88bfc86f36536e5d75ca40e811a39d67a1a886f6 Mon Sep 17 00:00:00 2001 From: Sander Vocke Date: Thu, 24 Sep 2020 09:07:50 +0200 Subject: [PATCH] Further fix of PUT handlers. --- .../endpoints/ModifyAlbumEndpointHandler.ts | 33 ++++++-------- .../endpoints/ModifyArtistEndpointHandler.ts | 25 +++++------ server/endpoints/ModifySongEndpointHandler.ts | 45 ++++++++----------- 3 files changed, 43 insertions(+), 60 deletions(-) diff --git a/server/endpoints/ModifyAlbumEndpointHandler.ts b/server/endpoints/ModifyAlbumEndpointHandler.ts index 97f24e8..8d01eb0 100644 --- a/server/endpoints/ModifyAlbumEndpointHandler.ts +++ b/server/endpoints/ModifyAlbumEndpointHandler.ts @@ -18,38 +18,33 @@ export const ModifyAlbumEndpointHandler: EndpointHandler = async (req: any, res: try { // Start retrieving the album itself. - const album = await trx.select('id') + const albumPromise = trx.select('id') .from('albums') .where({ id: req.params.id }) .then((r: any) => (r && r[0]) ? r[0]['id'] : undefined); - const newAlbum = { - ...album, - ...reqObject - }; - // Start retrieving artists. - const artistIdsPromise = newAlbum.artistIds ? + const artistIdsPromise = reqObject.artistIds ? trx.select('artistId') .from('artists_albums') - .whereIn('id', newAlbum.artistIds) + .whereIn('id', reqObject.artistIds) .then((as: any) => as.map((a: any) => a['artistId'])) : (async () => { return undefined })(); // Start retrieving tags. - const tagIdsPromise = newAlbum.tagIds ? + const tagIdsPromise = reqObject.tagIds ? trx.select('id') .from('albums_tags') - .whereIn('id', newAlbum.tagIds) + .whereIn('id', reqObject.tagIds) .then((ts: any) => ts.map((t: any) => t['tagId'])) : (async () => { return undefined })(); // Wait for the requests to finish. - var [artists, tags] = await Promise.all([artistIdsPromise, tagIdsPromise]);; + var [album, artists, tags] = await Promise.all([albumPromise, artistIdsPromise, tagIdsPromise]);; // Check that we found all objects we need. - if ((newAlbum.artistIds && artists.length !== newAlbum.artistIds.length) || - (newAlbum.tagIds && tags.length !== newAlbum.tagIds.length) || + if ((reqObject.artistIds && artists.length !== reqObject.artistIds.length) || + (reqObject.tagIds && tags.length !== reqObject.tagIds.length) || !album) { const e: EndpointError = { internalMessage: 'Not all albums and/or artists and/or tags exist for ModifyAlbum request: ' + JSON.stringify(req.body), @@ -59,25 +54,25 @@ export const ModifyAlbumEndpointHandler: EndpointHandler = async (req: any, res: } // Modify the album. + var update: any = {}; + if ("name" in reqObject) { update["name"] = reqObject.name; } + if ("storeLinks" in reqObject) { update["storeLinks"] = JSON.stringify(reqObject.storeLinks || []); } const modifyAlbumPromise = trx('albums') .where({ 'id': req.params.id }) - .update({ - name: newAlbum.name, - storeLinks: JSON.stringify(newAlbum.storeLinks || []), - }) + .update(update) // Remove unlinked artists. // TODO: test this! const removeUnlinkedArtists = artists ? trx('artists_albums') .where({ 'albumId': req.params.id }) - .whereNotIn('artistId', newAlbum.artistIds || []) + .whereNotIn('artistId', reqObject.artistIds || []) .delete() : undefined; // Remove unlinked tags. // TODO: test this! const removeUnlinkedTags = tags ? trx('albums_tags') .where({ 'albumId': req.params.id }) - .whereNotIn('tagId', newAlbum.tagIds || []) + .whereNotIn('tagId', reqObject.tagIds || []) .delete() : undefined; // Link new artists. diff --git a/server/endpoints/ModifyArtistEndpointHandler.ts b/server/endpoints/ModifyArtistEndpointHandler.ts index 6741952..b0cc77e 100644 --- a/server/endpoints/ModifyArtistEndpointHandler.ts +++ b/server/endpoints/ModifyArtistEndpointHandler.ts @@ -18,29 +18,24 @@ export const ModifyArtistEndpointHandler: EndpointHandler = async (req: any, res const artistId = parseInt(req.params.id); // Start retrieving the artist itself. - const artist = await trx.select('id') + const artistPromise = trx.select('id') .from('artists') .where({ id: artistId }) .then((r: any) => (r && r[0]) ? r[0]['id'] : undefined) - const newArtist = { - ...artist, - ...reqObject - } - // Start retrieving tags. - const tagIdsPromise = newArtist.tagIds ? + const tagIdsPromise = reqObject.tagIds ? trx.select('id') .from('artists_tags') - .whereIn('id', newArtist.tagIds) + .whereIn('id', reqObject.tagIds) .then((ts: any) => ts.map((t: any) => t['tagId'])) : (async () => { return undefined })(); // Wait for the requests to finish. - var [tags] = await Promise.all([tagIdsPromise]);; + var [artist, tags] = await Promise.all([artistPromise, tagIdsPromise]);; // Check that we found all objects we need. - if ((newArtist.tagIds && tags.length !== newArtist.tagIds.length) || + if ((reqObject.tagIds && tags.length !== reqObject.tagIds.length) || !artist) { const e: EndpointError = { internalMessage: 'Not all artists and/or tags exist for ModifyArtist request: ' + JSON.stringify(req.body), @@ -50,19 +45,19 @@ export const ModifyArtistEndpointHandler: EndpointHandler = async (req: any, res } // Modify the artist. + var update: any = {}; + if ("name" in reqObject) { update["name"] = reqObject.name; } + if ("storeLinks" in reqObject) { update["storeLinks"] = JSON.stringify(reqObject.storeLinks || []); } const modifyArtistPromise = trx('artists') .where({ 'id': artistId }) - .update({ - name: newArtist.name, - storeLinks: JSON.stringify(newArtist.storeLinks || []), - }) + .update(update) // Remove unlinked tags. // TODO: test this! const removeUnlinkedTags = tags ? trx('artists_tags') .where({ 'artistId': artistId }) - .whereNotIn('tagId', newArtist.tagIds || []) + .whereNotIn('tagId', reqObject.tagIds || []) .delete() : undefined; diff --git a/server/endpoints/ModifySongEndpointHandler.ts b/server/endpoints/ModifySongEndpointHandler.ts index 6b31ef4..9a280f4 100644 --- a/server/endpoints/ModifySongEndpointHandler.ts +++ b/server/endpoints/ModifySongEndpointHandler.ts @@ -17,50 +17,43 @@ export const ModifySongEndpointHandler: EndpointHandler = async (req: any, res: await knex.transaction(async (trx) => { try { // Retrieve the song to be modified itself. - const song = await trx.select('id') + const songPromise = trx.select('id') .from('songs') .where({ id: req.params.id }) .then((r: any) => (r && r[0]) ? r[0]['id'] : undefined) - // Construct the new object from the original plus the - // changes included in the PUT. - const newSong = { - ...song, - ...reqObject, - }; - // Start retrieving artists. - const artistIdsPromise = newSong.artistIds ? + const artistIdsPromise = reqObject.artistIds ? trx.select('artistId') .from('songs_artists') - .whereIn('id', newSong.artistIds) + .whereIn('id', reqObject.artistIds) .then((as: any) => as.map((a: any) => a['artistId'])) : (async () => { return undefined })(); // Start retrieving tags. - const tagIdsPromise = newSong.tagIds ? + const tagIdsPromise = reqObject.tagIds ? trx.select('id') .from('songs_tags') - .whereIn('id', newSong.tagIds) + .whereIn('id', reqObject.tagIds) .then((ts: any) => ts.map((t: any) => t['tagId'])) : (async () => { return undefined })(); // Start retrieving albums. - const albumIdsPromise = newSong.albumIds ? + const albumIdsPromise = reqObject.albumIds ? trx.select('id') .from('songs_albums') - .whereIn('id', newSong.albumIds) + .whereIn('id', reqObject.albumIds) .then((as: any) => as.map((a: any) => a['albumId'])) : (async () => { return undefined })(); // Wait for the requests to finish. - var [artists, tags, albums] = - await Promise.all([artistIdsPromise, tagIdsPromise, albumIdsPromise]);; + var [song, artists, tags, albums] = + await Promise.all([songPromise, artistIdsPromise, tagIdsPromise, albumIdsPromise]);; // Check that we found all objects we need. - if ((newSong.artistIds && artists.length !== newSong.artistIds.length) || - (newSong.tagIds && tags.length !== newSong.tagIds.length) || - (newSong.albumIds && albums.length !== newSong.albumIds.length) || + if ((reqObject.artistIds && artists.length !== reqObject.artistIds.length) || + (reqObject.tagIds && tags.length !== reqObject.tagIds.length) || + (reqObject.albumIds && albums.length !== reqObject.albumIds.length) || !song) { const e: EndpointError = { internalMessage: 'Not all albums and/or artists and/or tags exist for ModifySong request: ' + JSON.stringify(req.body), @@ -70,32 +63,32 @@ export const ModifySongEndpointHandler: EndpointHandler = async (req: any, res: } // Modify the song. + var update: any = {}; + if ("title" in reqObject) { update["title"] = reqObject.title; } + if ("storeLinks" in reqObject) { update["storeLinks"] = JSON.stringify(reqObject.storeLinks || []); } const modifySongPromise = trx('songs') .where({ 'id': req.params.id }) - .update({ - title: newSong.title, - storeLinks: JSON.stringify(newSong.storeLinks || []), - }) + .update(update) // Remove unlinked artists. // TODO: test this! const removeUnlinkedArtists = artists ? trx('songs_artists') .where({ 'songId': req.params.id }) - .whereNotIn('artistId', newSong.artistIds || []) + .whereNotIn('artistId', reqObject.artistIds || []) .delete() : undefined; // Remove unlinked tags. // TODO: test this! const removeUnlinkedTags = tags ? trx('songs_tags') .where({ 'songId': req.params.id }) - .whereNotIn('tagId', newSong.tagIds || []) + .whereNotIn('tagId', reqObject.tagIds || []) .delete() : undefined; // Remove unlinked albums. // TODO: test this! const removeUnlinkedAlbums = albums ? trx('songs_albums') .where({ 'songId': req.params.id }) - .whereNotIn('albumId', newSong.albumIds || []) + .whereNotIn('albumId', reqObject.albumIds || []) .delete() : undefined; // Link new artists.