Ctrl K
ComunidadGuías…

server/api/IntegrationRoute.js

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
const integrationController = require("../controllers/IntegrationController");
const TeamController = require("../controllers/TeamController");
const accessControl = require("../modules/accessControl");
const verifyToken = require("../modules/verifyToken");

module.exports = (app) => {
  const teamController = new TeamController();

  const checkAccess = (team_id, integration_id, user, teamAccess, integrationAccess) => {
    return teamController.getTeamRole(team_id, user.id)
      .then((teamRole) => {
        const permission = accessControl.can(teamRole.role)[teamAccess]("team");
        if (!permission.granted) {
          return new Promise((resolve, reject) => reject(new Error(401)));
        }

        if (integration_id) {
          const integrationPermission = accessControl.can(teamRole.role)[integrationAccess]("integration");
          if (!integrationPermission.granted) {
            return new Promise((resolve, reject) => reject(new Error(401)));
          }
        }

        return teamRole;
      });
  };
  // ----------------------------------------------

  /*
  ** Get an integration by id
  */
  app.get("/team/:team_id/integration/:id", verifyToken, (req, res) => {
    return checkAccess(req.params.team_id, req.params.id, req.user, "readOwn", "readAny")
      .then(() => {
        return integrationController.findById(req.params.id, req.params.team_id);
      })
      .then((integration) => {
        if (!integration) {
          throw new Error(404);
        }
        return res.status(200).send(integrationController.toPublicIntegration(integration));
      })
      .catch((err) => {
        if (err.message === "401") {
          return res.status(401).send("Unauthorized");
        }
        if (err.message === "404") {
          return res.status(404).send("Not Found");
        }

        return res.status(400).send(err);
      });
  });
  // ----------------------------------------------

  /*
  ** Get all integrations for a team
  */
  app.get("/team/:team_id/integration", verifyToken, (req, res) => {
    return checkAccess(req.params.team_id, null, req.user, "readOwn", "readAny")
      .then(() => {
        return integrationController.findByTeam(req.params.team_id);
      })
      .then((integrations) => {
        return res.status(200).send(integrations.map(integrationController.toPublicIntegration));
      })
      .catch((err) => {
        if (err.message === "401") {
          return res.status(401).send("Unauthorized");
        }

        return res.status(400).send(err);
      });
  });
  // ----------------------------------------------

  /*
  ** Create an integration
  */
  app.post("/team/:team_id/integration", verifyToken, (req, res) => {
    if (!req.body.team_id || `${req.body.team_id}` !== `${req.params.team_id}`) {
      return res.status(400).send("Invalid team id");
    }

    return checkAccess(req.params.team_id, null, req.user, "updateOwn", "createAny")
      .then(() => {
        return integrationController.create(req.body);
      })
      .then((integration) => {
        return res.status(200).send(integrationController.toPublicIntegration(integration));
      })
      .catch((err) => {
        if (err.message === "401") {
          return res.status(401).send("Unauthorized");
        }

        return res.status(400).send(err);
      });
  });
  // ----------------------------------------------

  /*
  ** Update an integration
  */
  app.put("/team/:team_id/integration/:id", verifyToken, (req, res) => {
    req.body.team_id = req.params.team_id;

    return checkAccess(req.params.team_id, req.params.id, req.user, "updateOwn", "updateAny")
      .then(() => {
        return integrationController.update(req.params.id, req.body, req.params.team_id);
      })
      .then((integration) => {
        return res.status(200).send(integrationController.toPublicIntegration(integration));
      })
      .catch((err) => {
        if (err.message === "401") {
          return res.status(401).send("Unauthorized");
        }
        if (err.message === "404") {
          return res.status(404).send("Not Found");
        }

        return res.status(400).send(err);
      });
  });
  // ----------------------------------------------

  /*
  ** Delete an integration
  */
  app.delete("/team/:team_id/integration/:id", verifyToken, (req, res) => {
    return checkAccess(req.params.team_id, req.params.id, req.user, "updateOwn", "deleteAny")
      .then(() => {
        return integrationController.remove(req.params.id, req.params.team_id);
      })
      .then(() => {
        return res.status(200).send({ deleted: true });
      })
      .catch((err) => {
        if (err.message === "401") {
          return res.status(401).send("Unauthorized");
        }
        if (err.message === "404") {
          return res.status(404).send("Not Found");
        }

        return res.status(400).send(err);
      });
  });
  // ----------------------------------------------

  return (req, res, next) => {
    next();
  };
};