You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.6 KiB
48 lines
1.6 KiB
const models = require('../models'); |
|
import * as api from '../../client/src/api'; |
|
import { EndpointError, EndpointHandler, catchUnhandledErrors } from './types'; |
|
|
|
export const CreateTagEndpointHandler: EndpointHandler = async (req: any, res: any) => { |
|
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 getTag = async (id: Number) => { |
|
const tag = await models.Tag.findAll({ |
|
where: { |
|
id: id |
|
} |
|
}); |
|
if (tag.length != 1) { |
|
const e: EndpointError = { |
|
internalMessage: 'There is no tag with id ' + id + '.', |
|
httpStatus: 400 |
|
}; |
|
throw e; |
|
} |
|
return tag[0]; |
|
} |
|
|
|
// If applicable, start retrieving the new parent tag. |
|
const maybeNewParentPromise: Promise<any> | Promise<undefined> = |
|
(reqObject.parentId) ? getTag(reqObject.parentId) : (async () => { return undefined })(); |
|
|
|
(async () => { |
|
const maybeParent = await maybeNewParentPromise; |
|
const tag = await models.Tag.create({ |
|
name: reqObject.name |
|
}); |
|
reqObject.parentId && await tag.setParent(maybeParent); |
|
await tag.save(); |
|
const responseObject: api.CreateTagResponse = { |
|
id: tag.id |
|
}; |
|
res.status(200).send(responseObject); |
|
})() |
|
.catch(catchUnhandledErrors); |
|
} |