import * as api from '../../client/src/api'; import { EndpointError, EndpointHandler, catchUnhandledErrors } from './types'; import Knex from 'knex'; export const CreateTagEndpointHandler: EndpointHandler = async (req: any, res: any, knex: Knex) => { if (!api.checkCreateTagRequest(req)) { const e: EndpointError = { internalMessage: 'Invalid CreateTag request: ' + JSON.stringify(req.body), httpStatus: 400 }; throw e; } const reqObject: api.CreateTagRequest = req.body; const { id: userId } = req.user; console.log("User ", userId, ": Create Tag ", reqObject); await knex.transaction(async (trx) => { try { // If applicable, retrieve the parent tag. const maybeParent: number | undefined = reqObject.parentId ? (await trx.select('id') .from('tags') .where({ 'user': userId }) .where({ 'id': reqObject.parentId }))[0]['id'] : undefined; // Check if the parent was found, if applicable. if (reqObject.parentId && maybeParent !== reqObject.parentId) { const e: EndpointError = { internalMessage: 'Could not find parent tag for CreateTag request: ' + JSON.stringify(req.body), httpStatus: 400 }; throw e; } // Create the new tag. var tag: any = { name: reqObject.name, user: userId, }; if (maybeParent) { tag['parentId'] = maybeParent; } const tagId = (await trx('tags') .insert(tag) .returning('id') // Needed for Postgres )[0]; // Respond to the request. const responseObject: api.CreateTagResponse = { id: tagId }; res.status(200).send(responseObject); } catch (e) { catchUnhandledErrors(e); trx.rollback(); } }) }