import * as api from '../../client/src/api'; import { EndpointError, EndpointHandler, catchUnhandledErrors } from './types'; import Knex from 'knex'; export const ModifyTagEndpointHandler: EndpointHandler = async (req: any, res: any, knex: Knex) => { if (!api.checkModifyTagRequest(req)) { const e: EndpointError = { internalMessage: 'Invalid ModifyTag request: ' + JSON.stringify(req.body), httpStatus: 400 }; throw e; } const reqObject: api.ModifyTagRequest = req.body; const { id: userId } = req.user; console.log("User ", userId, ": Modify Tag ", reqObject); await knex.transaction(async (trx) => { try { // Start retrieving the parent tag. const parentTagPromise = reqObject.parentId ? trx.select('id') .from('tags') .where({ 'user': userId }) .where({ 'id': reqObject.parentId }) .then((ts: any) => ts.map((t: any) => t['tagId'])) : (async () => { return [] })(); // Start retrieving the tag itself. const tagPromise = trx.select('id') .from('tags') .where({ 'user': userId }) .where({ id: req.params.id }) .then((r: any) => (r && r[0]) ? r[0]['id'] : undefined) // Wait for the requests to finish. var [tag, parent] = await Promise.all([tagPromise, parentTagPromise]);; // Check that we found all objects we need. if ((reqObject.parentId && !parent) || !tag) { const e: EndpointError = { internalMessage: 'Tag or parent does not exist for ModifyTag request: ' + JSON.stringify(req.body), httpStatus: 400 }; throw e; } // Modify the tag. await trx('tags') .where({ 'user': userId }) .where({ 'id': req.params.id }) .update({ name: reqObject.name, parentId: reqObject.parentId || null, }) // Respond to the request. res.status(200).send(); } catch (e) { catchUnhandledErrors(e); trx.rollback(); } }) }