// (C) 2007-2019 GoodData Corporation import { Application } from "express"; import { has, isString } from "lodash"; import * as HttpStatusCodes from "http-status-codes"; import { IMockProject } from "../../model/MockProject"; import { ValidationError } from "../ValidationError"; import * as logErrors from "../../constants/ProjectLogErrors"; import * as errors from "../errors/errors"; interface ILogMessagesRequest { logMessages: string[]; } const areStrings = (messages: string[]): boolean => messages.every(isString); function validate(request: ILogMessagesRequest): void { if (Object.keys(request).length !== 1) { throw new ValidationError(errors.moreThanOneRootElement()); } if (!has(request, "logMessages")) { throw new ValidationError(errors.invalidElementKey("logMessages", Object.keys(request)[0])); } if (!Array.isArray(request.logMessages)) { throw new ValidationError(logErrors.INVALID_ELEMENT_TYPE); } if (!areStrings(request.logMessages)) { throw new ValidationError(logErrors.INVALID_TYPES_IN_ELEMENT); } } export const log = { register(app: Application, project: IMockProject) { app.post(`/gdc/app/projects/${project.project.meta.identifier}/log`, (req, res) => { const request: ILogMessagesRequest = req.body; try { validate(request); res.status(HttpStatusCodes.NO_CONTENT).end(); } catch (error) { if (error instanceof ValidationError) { res.status(HttpStatusCodes.BAD_REQUEST).json(error.getValidationError()); } else { res.status(HttpStatusCodes.INTERNAL_SERVER_ERROR).json(error); } } }); return app; }, };