A11yWatch/a11ywatch-core

View on GitHub
src/web/response.ts

Summary

Maintainability
A
25 mins
Test Coverage
import { SUPER_MODE } from "../config/config";
import { responseModel } from "../core/models/response";
import { validateUID } from "./params/extracter";
import { HttpMessage, StatusCode } from "./messages/message";
import type { FastifyContext } from "apollo-server-fastify";

/*
 * Response wrapper for expres API
 * performs validation for allowed request.
 * This allows from moving between middleware coupling
 * and migrating between future web frameworks.
 *
 * @param res - Response
 * @param source - {callback, userId}
 * @return Promise<void>
 */
export const responseWrap = async (res: FastifyContext["reply"], source) => {
  const { callback, userId } = source ?? {};

  let message = HttpMessage.Ok;
  let code = StatusCode.Ok;
  let data = null;

  // prevent callback from running not authed
  if (!SUPER_MODE && !validateUID(userId)) {
    message = HttpMessage.Unauthorized;
    code = StatusCode.Unauthorized;
  } else if (typeof callback === "function") {
    try {
      data = await callback(); // must return datasource directly and not attached to the data property
    } catch (e) {
      message = e.message;
      code = StatusCode.Error; // TODO: parse rejection for error code or pass in on-rejection error code
    }
  }

  res.statusCode = code;

  res.send(
    responseModel({
      code,
      data,
      message,
    })
  );
};