Further fix of PUT handlers.

pull/21/head
Sander Vocke 5 years ago
parent f4ee82fa2c
commit 88bfc86f36
  1. 33
      server/endpoints/ModifyAlbumEndpointHandler.ts
  2. 25
      server/endpoints/ModifyArtistEndpointHandler.ts
  3. 45
      server/endpoints/ModifySongEndpointHandler.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.

@ -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;

@ -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.

Loading…
Cancel
Save