import * as api from '../../client/src/api'; import { EndpointError, EndpointHandler, catchUnhandledErrors } from './types'; import Knex from 'knex'; export const CreateArtistEndpointHandler: EndpointHandler = async (req: any, res: any, knex: Knex) => { if (!api.checkCreateArtistRequest(req)) { const e: EndpointError = { internalMessage: 'Invalid CreateArtist request: ' + JSON.stringify(req.body), httpStatus: 400 }; throw e; } const reqObject: api.CreateArtistRequest = req.body; console.log("Create artist:", reqObject) await knex.transaction(async (trx) => { try { // Retrieve tag instances to link the artist to. const tags: number[] = reqObject.tagIds ? Array.from(new Set( (await trx.select('id').from('tags') .whereIn('id', reqObject.tagIds)) .map((tag: any) => tag['id']) )) : []; console.log("Found artist tags:", tags) if (reqObject.tagIds && tags && tags.length !== reqObject.tagIds.length) { const e: EndpointError = { internalMessage: 'Not all tags exist for CreateArtist request: ' + JSON.stringify(req.body), httpStatus: 400 }; throw e; } // Create the artist. const artistId = (await trx('artists') .insert({ name: reqObject.name, storeLinks: JSON.stringify(reqObject.storeLinks || []), }) .returning('id') // Needed for Postgres )[0]; // Link the tags via the linking table. if (tags && tags.length) { await trx('artists_tags').insert( tags.map((tagId: number) => { return { artistId: artistId, tagId: tagId, } }) ) } const responseObject: api.CreateSongResponse = { id: artistId }; await res.status(200).send(responseObject); } catch (e) { catchUnhandledErrors(e); trx.rollback(); } }); }