diff --git a/Servers/controllers/complianceList.ctrl.ts b/Servers/controllers/complianceList.ctrl.ts new file mode 100644 index 0000000000..d3f3d7aeef --- /dev/null +++ b/Servers/controllers/complianceList.ctrl.ts @@ -0,0 +1,173 @@ +import { Request, Response } from "express"; +const MOCK_DATA_ON = process.env.MOCK_DATA_ON; + +import { STATUS_CODE } from "../utils/statusCode.utils"; +import { + createMockComplianceList, + deleteMockComplianceListById, + getAllMockComplianceLists, + getMockComplianceListById, + updateMockComplianceListById +} from "../mocks/tools/complianceList.mock.db" +import { + createNewComplianceListQuery, + deleteComplianceListByIdQuery, + getAllComplianceListsQuery, + getComplianceListByIdQuery, + updateComplianceListByIdQuery +} from "../utils/complianceList.util"; + +export async function getAllComplianceLists(req: Request, res: Response): Promise { + try { + if (MOCK_DATA_ON === "true") { + const complianceLists = getAllMockComplianceLists(); + + if (complianceLists) { + return res.status(200).json(STATUS_CODE[200](complianceLists)); + } + + return res.status(204).json(STATUS_CODE[204](complianceLists)); + } else { + const complianceLists = await getAllComplianceListsQuery(); + + if (complianceLists) { + return res.status(200).json(STATUS_CODE[200](complianceLists)); + } + + return res.status(204).json(STATUS_CODE[204](complianceLists)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function getComplianceListById(req: Request, res: Response): Promise { + try { + const complianceListId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const complianceList = getMockComplianceListById(complianceListId); + + if (complianceList) { + return res.status(200).json(STATUS_CODE[200](complianceList)); + } + + return res.status(404).json(STATUS_CODE[404](complianceList)); + } else { + const complianceList = await getComplianceListByIdQuery(complianceListId); + + if (complianceList) { + return res.status(200).json(STATUS_CODE[200](complianceList)); + } + + return res.status(404).json(STATUS_CODE[404](complianceList)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function createComplianceList(req: Request, res: Response): Promise { + try { + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const newComplianceList = createMockComplianceList({ name, description }); + + if (newComplianceList) { + return res.status(201).json(STATUS_CODE[201](newComplianceList)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } else { + const newComplianceList = await createNewComplianceListQuery({ name, description }); + + if (newComplianceList) { + return res.status(201).json(STATUS_CODE[201](newComplianceList)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function updateComplianceListById( + req: Request, + res: Response +): Promise { + console.log("updateComplianceListById"); + try { + const complianceListId = parseInt(req.params.id); + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const updatedComplianceList = updateMockComplianceListById(complianceListId, { name, description }); + + if (updatedComplianceList) { + return res.status(202).json(STATUS_CODE[202](updatedComplianceList)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const updatedComplianceList = await updateComplianceListByIdQuery(complianceListId, { + name, + description, + }); + + if (updatedComplianceList) { + return res.status(202).json(STATUS_CODE[202](updatedComplianceList)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function deleteComplianceListById( + req: Request, + res: Response +): Promise { + try { + const complianceListId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const deletedComplianceList = deleteMockComplianceListById(complianceListId); + + if (deletedComplianceList) { + return res.status(202).json(STATUS_CODE[202](deletedComplianceList)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const deletedComplianceList = await deleteComplianceListByIdQuery(complianceListId); + + if (deletedComplianceList) { + return res.status(202).json(STATUS_CODE[202](deletedComplianceList)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} diff --git a/Servers/controllers/evidence.ctrl.ts b/Servers/controllers/evidence.ctrl.ts new file mode 100644 index 0000000000..411a52997d --- /dev/null +++ b/Servers/controllers/evidence.ctrl.ts @@ -0,0 +1,173 @@ +import { Request, Response } from "express"; +const MOCK_DATA_ON = process.env.MOCK_DATA_ON; + +import { STATUS_CODE } from "../utils/statusCode.utils"; +import { + createMockEvidence, + deleteMockEvidenceById, + getAllMockEvidences, + getMockEvidenceById, + updateMockEvidenceById +} from "../mocks/tools/evidence.mock.db" +import { + createNewEvidenceQuery, + deleteEvidenceByIdQuery, + getAllEvidencesQuery, + getEvidenceByIdQuery, + updateEvidenceByIdQuery +} from "../utils/evidence.util"; + +export async function getAllEvidences(req: Request, res: Response): Promise { + try { + if (MOCK_DATA_ON === "true") { + const evidences = getAllMockEvidences(); + + if (evidences) { + return res.status(200).json(STATUS_CODE[200](evidences)); + } + + return res.status(204).json(STATUS_CODE[204](evidences)); + } else { + const evidences = await getAllEvidencesQuery(); + + if (evidences) { + return res.status(200).json(STATUS_CODE[200](evidences)); + } + + return res.status(204).json(STATUS_CODE[204](evidences)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function getEvidenceById(req: Request, res: Response): Promise { + try { + const evidenceId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const evidence = getMockEvidenceById(evidenceId); + + if (evidence) { + return res.status(200).json(STATUS_CODE[200](evidence)); + } + + return res.status(404).json(STATUS_CODE[404](evidence)); + } else { + const evidence = await getEvidenceByIdQuery(evidenceId); + + if (evidence) { + return res.status(200).json(STATUS_CODE[200](evidence)); + } + + return res.status(404).json(STATUS_CODE[404](evidence)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function createEvidence(req: Request, res: Response): Promise { + try { + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const newEvidence = createMockEvidence({ name, description }); + + if (newEvidence) { + return res.status(201).json(STATUS_CODE[201](newEvidence)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } else { + const newEvidence = await createNewEvidenceQuery({ name, description }); + + if (newEvidence) { + return res.status(201).json(STATUS_CODE[201](newEvidence)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function updateEvidenceById( + req: Request, + res: Response +): Promise { + console.log("updateEvidenceById"); + try { + const evidenceId = parseInt(req.params.id); + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const updatedEvidence = updateMockEvidenceById(evidenceId, { name, description }); + + if (updatedEvidence) { + return res.status(202).json(STATUS_CODE[202](updatedEvidence)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const updatedEvidence = await updateEvidenceByIdQuery(evidenceId, { + name, + description, + }); + + if (updatedEvidence) { + return res.status(202).json(STATUS_CODE[202](updatedEvidence)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function deleteEvidenceById( + req: Request, + res: Response +): Promise { + try { + const evidenceId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const deletedEvidence = deleteMockEvidenceById(evidenceId); + + if (deletedEvidence) { + return res.status(202).json(STATUS_CODE[202](deletedEvidence)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const deletedEvidence = await deleteEvidenceByIdQuery(evidenceId); + + if (deletedEvidence) { + return res.status(202).json(STATUS_CODE[202](deletedEvidence)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} diff --git a/Servers/controllers/overview.ctrl.ts b/Servers/controllers/overview.ctrl.ts new file mode 100644 index 0000000000..9ab12b0789 --- /dev/null +++ b/Servers/controllers/overview.ctrl.ts @@ -0,0 +1,173 @@ +import { Request, Response } from "express"; +const MOCK_DATA_ON = process.env.MOCK_DATA_ON; + +import { STATUS_CODE } from "../utils/statusCode.utils"; +import { + createMockOverview, + deleteMockOverviewById, + getAllMockOverviews, + getMockOverviewById, + updateMockOverviewById +} from "../mocks/tools/overview.mock.db" +import { + createNewOverviewQuery, + deleteOverviewByIdQuery, + getAllOverviewsQuery, + getOverviewByIdQuery, + updateOverviewByIdQuery +} from "../utils/overview.util"; + +export async function getAllOverviews(req: Request, res: Response): Promise { + try { + if (MOCK_DATA_ON === "true") { + const overviews = getAllMockOverviews(); + + if (overviews) { + return res.status(200).json(STATUS_CODE[200](overviews)); + } + + return res.status(204).json(STATUS_CODE[204](overviews)); + } else { + const overviews = await getAllOverviewsQuery(); + + if (overviews) { + return res.status(200).json(STATUS_CODE[200](overviews)); + } + + return res.status(204).json(STATUS_CODE[204](overviews)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function getOverviewById(req: Request, res: Response): Promise { + try { + const overviewId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const overview = getMockOverviewById(overviewId); + + if (overview) { + return res.status(200).json(STATUS_CODE[200](overview)); + } + + return res.status(404).json(STATUS_CODE[404](overview)); + } else { + const overview = await getOverviewByIdQuery(overviewId); + + if (overview) { + return res.status(200).json(STATUS_CODE[200](overview)); + } + + return res.status(404).json(STATUS_CODE[404](overview)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function createOverview(req: Request, res: Response): Promise { + try { + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const newOverview = createMockOverview({ name, description }); + + if (newOverview) { + return res.status(201).json(STATUS_CODE[201](newOverview)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } else { + const newOverview = await createNewOverviewQuery({ name, description }); + + if (newOverview) { + return res.status(201).json(STATUS_CODE[201](newOverview)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function updateOverviewById( + req: Request, + res: Response +): Promise { + console.log("updateOverviewById"); + try { + const overviewId = parseInt(req.params.id); + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const updatedOverview = updateMockOverviewById(overviewId, { name, description }); + + if (updatedOverview) { + return res.status(202).json(STATUS_CODE[202](updatedOverview)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const updatedOverview = await updateOverviewByIdQuery(overviewId, { + name, + description, + }); + + if (updatedOverview) { + return res.status(202).json(STATUS_CODE[202](updatedOverview)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function deleteOverviewById( + req: Request, + res: Response +): Promise { + try { + const overviewId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const deletedOverview = deleteMockOverviewById(overviewId); + + if (deletedOverview) { + return res.status(202).json(STATUS_CODE[202](deletedOverview)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const deletedOverview = await deleteOverviewByIdQuery(overviewId); + + if (deletedOverview) { + return res.status(202).json(STATUS_CODE[202](deletedOverview)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} diff --git a/Servers/controllers/requirement.ctrl.ts b/Servers/controllers/requirement.ctrl.ts new file mode 100644 index 0000000000..b0443302c5 --- /dev/null +++ b/Servers/controllers/requirement.ctrl.ts @@ -0,0 +1,173 @@ +import { Request, Response } from "express"; +const MOCK_DATA_ON = process.env.MOCK_DATA_ON; + +import { STATUS_CODE } from "../utils/statusCode.utils"; +import { + createMockRequirement, + deleteMockRequirementById, + getAllMockRequirements, + getMockRequirementById, + updateMockRequirementById +} from "../mocks/tools/requirement.mock.db" +import { + createNewRequirementQuery, + deleteRequirementByIdQuery, + getAllRequirementsQuery, + getRequirementByIdQuery, + updateRequirementByIdQuery +} from "../utils/requirement.util"; + +export async function getAllRequirements(req: Request, res: Response): Promise { + try { + if (MOCK_DATA_ON === "true") { + const requirements = getAllMockRequirements(); + + if (requirements) { + return res.status(200).json(STATUS_CODE[200](requirements)); + } + + return res.status(204).json(STATUS_CODE[204](requirements)); + } else { + const requirements = await getAllRequirementsQuery(); + + if (requirements) { + return res.status(200).json(STATUS_CODE[200](requirements)); + } + + return res.status(204).json(STATUS_CODE[204](requirements)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function getRequirementById(req: Request, res: Response): Promise { + try { + const requirementId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const requirement = getMockRequirementById(requirementId); + + if (requirement) { + return res.status(200).json(STATUS_CODE[200](requirement)); + } + + return res.status(404).json(STATUS_CODE[404](requirement)); + } else { + const requirement = await getRequirementByIdQuery(requirementId); + + if (requirement) { + return res.status(200).json(STATUS_CODE[200](requirement)); + } + + return res.status(404).json(STATUS_CODE[404](requirement)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function createRequirement(req: Request, res: Response): Promise { + try { + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const newRequirement = createMockRequirement({ name, description }); + + if (newRequirement) { + return res.status(201).json(STATUS_CODE[201](newRequirement)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } else { + const newRequirement = await createNewRequirementQuery({ name, description }); + + if (newRequirement) { + return res.status(201).json(STATUS_CODE[201](newRequirement)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function updateRequirementById( + req: Request, + res: Response +): Promise { + console.log("updateRequirementById"); + try { + const requirementId = parseInt(req.params.id); + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const updatedRequirement = updateMockRequirementById(requirementId, { name, description }); + + if (updatedRequirement) { + return res.status(202).json(STATUS_CODE[202](updatedRequirement)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const updatedRequirement = await updateRequirementByIdQuery(requirementId, { + name, + description, + }); + + if (updatedRequirement) { + return res.status(202).json(STATUS_CODE[202](updatedRequirement)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function deleteRequirementById( + req: Request, + res: Response +): Promise { + try { + const requirementId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const deletedRequirement = deleteMockRequirementById(requirementId); + + if (deletedRequirement) { + return res.status(202).json(STATUS_CODE[202](deletedRequirement)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const deletedRequirement = await deleteRequirementByIdQuery(requirementId); + + if (deletedRequirement) { + return res.status(202).json(STATUS_CODE[202](deletedRequirement)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} diff --git a/Servers/controllers/subrequirement.ctrl.ts b/Servers/controllers/subrequirement.ctrl.ts new file mode 100644 index 0000000000..e4cc73163a --- /dev/null +++ b/Servers/controllers/subrequirement.ctrl.ts @@ -0,0 +1,173 @@ +import { Request, Response } from "express"; +const MOCK_DATA_ON = process.env.MOCK_DATA_ON; + +import { STATUS_CODE } from "../utils/statusCode.utils"; +import { + createMockSubrequirement, + deleteMockSubrequirementById, + getAllMockSubrequirements, + getMockSubrequirementById, + updateMockSubrequirementById +} from "../mocks/tools/subrequirement.mock.db" +import { + createNewSubrequirementQuery, + deleteSubrequirementByIdQuery, + getAllSubrequirementsQuery, + getSubrequirementByIdQuery, + updateSubrequirementByIdQuery +} from "../utils/subrequirement.util"; + +export async function getAllSubrequirements(req: Request, res: Response): Promise { + try { + if (MOCK_DATA_ON === "true") { + const subrequirements = getAllMockSubrequirements(); + + if (subrequirements) { + return res.status(200).json(STATUS_CODE[200](subrequirements)); + } + + return res.status(204).json(STATUS_CODE[204](subrequirements)); + } else { + const subrequirements = await getAllSubrequirementsQuery(); + + if (subrequirements) { + return res.status(200).json(STATUS_CODE[200](subrequirements)); + } + + return res.status(204).json(STATUS_CODE[204](subrequirements)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function getSubrequirementById(req: Request, res: Response): Promise { + try { + const subrequirementId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const subrequirement = getMockSubrequirementById(subrequirementId); + + if (subrequirement) { + return res.status(200).json(STATUS_CODE[200](subrequirement)); + } + + return res.status(404).json(STATUS_CODE[404](subrequirement)); + } else { + const subrequirement = await getSubrequirementByIdQuery(subrequirementId); + + if (subrequirement) { + return res.status(200).json(STATUS_CODE[200](subrequirement)); + } + + return res.status(404).json(STATUS_CODE[404](subrequirement)); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function createSubrequirement(req: Request, res: Response): Promise { + try { + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const newSubrequirement = createMockSubrequirement({ name, description }); + + if (newSubrequirement) { + return res.status(201).json(STATUS_CODE[201](newSubrequirement)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } else { + const newSubrequirement = await createNewSubrequirementQuery({ name, description }); + + if (newSubrequirement) { + return res.status(201).json(STATUS_CODE[201](newSubrequirement)); + } + + return res.status(503).json(STATUS_CODE[503]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function updateSubrequirementById( + req: Request, + res: Response +): Promise { + console.log("updateSubrequirementById"); + try { + const subrequirementId = parseInt(req.params.id); + const { name, description } = req.body; + + if (!name || !description) { + return res + .status(400) + .json( + STATUS_CODE[400]({ message: "name and description are required" }) + ); + } + + if (MOCK_DATA_ON === "true") { + const updatedSubrequirement = updateMockSubrequirementById(subrequirementId, { name, description }); + + if (updatedSubrequirement) { + return res.status(202).json(STATUS_CODE[202](updatedSubrequirement)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const updatedSubrequirement = await updateSubrequirementByIdQuery(subrequirementId, { + name, + description, + }); + + if (updatedSubrequirement) { + return res.status(202).json(STATUS_CODE[202](updatedSubrequirement)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} + +export async function deleteSubrequirementById( + req: Request, + res: Response +): Promise { + try { + const subrequirementId = parseInt(req.params.id); + + if (MOCK_DATA_ON === "true") { + const deletedSubrequirement = deleteMockSubrequirementById(subrequirementId); + + if (deletedSubrequirement) { + return res.status(202).json(STATUS_CODE[202](deletedSubrequirement)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } else { + const deletedSubrequirement = await deleteSubrequirementByIdQuery(subrequirementId); + + if (deletedSubrequirement) { + return res.status(202).json(STATUS_CODE[202](deletedSubrequirement)); + } + + return res.status(404).json(STATUS_CODE[404]({})); + } + } catch (error) { + return res.status(500).json(STATUS_CODE[500]((error as Error).message)); + } +} diff --git a/Servers/index.ts b/Servers/index.ts index 342b30cfe0..26b99b0743 100644 --- a/Servers/index.ts +++ b/Servers/index.ts @@ -9,6 +9,11 @@ import riskRoutes from "./routes/risk.route"; import projectRoutes from "./routes/project.route"; import complianceTrackerRoutes from "./routes/complianceTracker.route"; import vendorRiskRoutes from "./routes/vendorRisk.route"; +import complianceListRoutes from "./routes/complianceList.route"; +import requirementsRoutes from "./routes/requirement.route"; +import subrequirementsRoutes from "./routes/subrequirement.route"; +import overviewsRoutes from "./routes/overview.route"; +import evidencesRoutes from "./routes/evidence.route"; dotenv.config(); @@ -26,6 +31,11 @@ app.use("/risks", riskRoutes); app.use("/projects", projectRoutes); app.use("/complianceTrackers", complianceTrackerRoutes); app.use("/vendorRisks", vendorRiskRoutes); +app.use("/complianceLists", complianceListRoutes); +app.use("/requirements", requirementsRoutes); +app.use("/subrequirements", subrequirementsRoutes); +app.use("/overviews", overviewsRoutes); +app.use("/evidences", evidencesRoutes); app.use("/", (req, res) => { res.json("Hello buddy!"); diff --git a/Servers/mocks/complianceLists/complianceLists.data.ts b/Servers/mocks/complianceLists/complianceLists.data.ts new file mode 100644 index 0000000000..3a813fa4c7 --- /dev/null +++ b/Servers/mocks/complianceLists/complianceLists.data.ts @@ -0,0 +1,32 @@ +export const complianceLists = [ + { + id: 1, + compliance_tracker_id: 1, + name: "GDPR Compliance", + description: "Ensure all user data handling is in compliance with GDPR regulations." + }, + { + id: 2, + compliance_tracker_id: 1, + name: "ISO 27001 Certification", + description: "Maintain security protocols in line with ISO 27001 certification requirements." + }, + { + id: 3, + compliance_tracker_id: 2, + name: "HIPAA Compliance", + description: "Ensure the protection of health information in compliance with HIPAA." + }, + { + id: 4, + compliance_tracker_id: 3, + name: "PCI DSS Compliance", + description: "Adhere to PCI DSS standards for secure payment processing." + }, + { + id: 5, + compliance_tracker_id: 4, + name: "SOX Compliance", + description: "Ensure financial controls meet the Sarbanes-Oxley Act requirements." + } +]; diff --git a/Servers/mocks/evidences/evidences.data.ts b/Servers/mocks/evidences/evidences.data.ts new file mode 100644 index 0000000000..03513a0db1 --- /dev/null +++ b/Servers/mocks/evidences/evidences.data.ts @@ -0,0 +1,72 @@ +export const evidences = [ + { + id: 1, + subrequirement_id: 1, + document_name: "Privacy Policy v2.1", + document_type: "PDF", + file_path: "/documents/privacy_policy_v2.1.pdf", + upload_date: new Date("2024-06-05"), + uploader_id: 1, + description: "Updated privacy policy to comply with new consent regulations.", + status: "Approved", + last_reviewed: new Date("2024-09-01"), + reviewer_id: 2, + review_comments: "Policy aligns with current standards." + }, + { + id: 2, + subrequirement_id: 2, + document_name: "Consent Form Template", + document_type: "DOCX", + file_path: "/documents/consent_form_template.docx", + upload_date: new Date("2024-10-01"), + uploader_id: 3, + description: "Template for collecting user consent.", + status: "Pending", + last_reviewed: new Date("2024-10-05"), + reviewer_id: 4, + review_comments: "Requires additional clarity on data usage." + }, + { + id: 3, + subrequirement_id: 3, + document_name: "Risk Assessment Report", + document_type: "PDF", + file_path: "/documents/risk_assessment_report.pdf", + upload_date: new Date("2024-08-15"), + uploader_id: 2, + description: "Initial risk assessment for compliance with ISO 27001.", + status: "Approved", + last_reviewed: new Date("2024-09-10"), + reviewer_id: 3, + review_comments: "Well documented and thorough." + }, + { + id: 4, + subrequirement_id: 4, + document_name: "Data Encryption Protocols", + document_type: "TXT", + file_path: "/documents/data_encryption_protocols.txt", + upload_date: new Date("2024-09-20"), + uploader_id: 4, + description: "Draft protocols for data encryption in transit.", + status: "Under Review", + last_reviewed: new Date("2024-09-30"), + reviewer_id: 5, + review_comments: "Needs more details on implementation." + }, + { + id: 5, + subrequirement_id: 1, + document_name: "User Consent Log", + document_type: "CSV", + file_path: "/documents/user_consent_log.csv", + upload_date: new Date("2024-07-01"), + uploader_id: 1, + description: "Log of user consent status and timestamps.", + status: "Approved", + last_reviewed: new Date("2024-08-01"), + reviewer_id: 2, + review_comments: "Data is accurate and well-organized." + } +]; diff --git a/Servers/mocks/overviews/overviews.data.ts b/Servers/mocks/overviews/overviews.data.ts new file mode 100644 index 0000000000..71397b3c8f --- /dev/null +++ b/Servers/mocks/overviews/overviews.data.ts @@ -0,0 +1,67 @@ +export const overviews = [ + { + id: 1, + subrequirement_id: 1, + control_name: "Privacy Policy Review", + control_description: "Review and update the privacy policy to align with current consent requirements.", + control_owner: "John Doe", + control_status: "Completed", + implementation_description: "Updated the privacy policy to reflect changes in user consent collection.", + implementation_evidence: "Privacy Policy Document (v2.1)", + effective_date: new Date("2024-06-01"), + review_date: new Date("2024-12-01"), + comments: "No issues encountered during implementation." + }, + { + id: 2, + subrequirement_id: 1, + control_name: "Opt-in Mechanism", + control_description: "Develop and implement a user opt-in mechanism for consent collection.", + control_owner: "Jane Smith", + control_status: "In Progress", + implementation_description: "Working on the integration of opt-in consent collection with the web platform.", + implementation_evidence: "Partial integration completed.", + effective_date: new Date("2024-10-10"), + review_date: new Date("2025-03-01"), + comments: "Integration testing in progress." + }, + { + id: 3, + subrequirement_id: 2, + control_name: "Data Encryption Protocols", + control_description: "Develop standards for data encryption in transit.", + control_owner: "Alice Johnson", + control_status: "Not Started", + implementation_description: "Encryption protocols have yet to be defined.", + implementation_evidence: "N/A", + effective_date: new Date("2025-01-01"), + review_date: new Date("2025-07-01"), + comments: "Work to begin Q1 2025." + }, + { + id: 4, + subrequirement_id: 3, + control_name: "Initial Risk Assessment", + control_description: "Conduct an initial risk assessment for compliance with ISO 27001.", + control_owner: "Mike Brown", + control_status: "Completed", + implementation_description: "Risk assessment completed and documented.", + implementation_evidence: "Risk Assessment Report", + effective_date: new Date("2024-08-15"), + review_date: new Date("2025-02-15"), + comments: "Assessment completed without major risks identified." + }, + { + id: 5, + subrequirement_id: 4, + control_name: "AES-256 Data Encryption", + control_description: "Implement AES-256 encryption for data at rest.", + control_owner: "Sarah Davis", + control_status: "In Progress", + implementation_description: "Partial encryption for key databases.", + implementation_evidence: "Database logs showing partial encryption.", + effective_date: new Date("2024-09-01"), + review_date: new Date("2025-03-01"), + comments: "Targeting full encryption by Q2 2025." + } +]; diff --git a/Servers/mocks/requirements/requirements.data.ts b/Servers/mocks/requirements/requirements.data.ts new file mode 100644 index 0000000000..adaf2ed6c4 --- /dev/null +++ b/Servers/mocks/requirements/requirements.data.ts @@ -0,0 +1,44 @@ +export const requirements = [ + { + id: 1, + compliance_list_id: 1, + name: "User Consent", + description: "Obtain explicit consent from users before processing their personal data.", + status: "Completed" + }, + { + id: 2, + compliance_list_id: 1, + name: "Data Encryption", + description: "Ensure all personal data is encrypted both at rest and in transit.", + status: "In Progress" + }, + { + id: 3, + compliance_list_id: 2, + name: "Risk Assessment", + description: "Conduct regular risk assessments as per ISO 27001 requirements.", + status: "Not Started" + }, + { + id: 4, + compliance_list_id: 3, + name: "Patient Data Protection", + description: "Protect all patient data as per HIPAA regulations.", + status: "Completed" + }, + { + id: 5, + compliance_list_id: 4, + name: "Payment Data Encryption", + description: "Encrypt all payment data to comply with PCI DSS standards.", + status: "In Progress" + }, + { + id: 6, + compliance_list_id: 5, + name: "Financial Audit Controls", + description: "Ensure all financial controls are compliant with the Sarbanes-Oxley Act.", + status: "Completed" + } +]; diff --git a/Servers/mocks/subrequirements/subrequirements.data.ts b/Servers/mocks/subrequirements/subrequirements.data.ts new file mode 100644 index 0000000000..7ae193274c --- /dev/null +++ b/Servers/mocks/subrequirements/subrequirements.data.ts @@ -0,0 +1,44 @@ +export const subrequirements = [ + { + id: 1, + requirement_id: 1, + name: "Privacy Policy Update", + description: "Ensure the privacy policy reflects changes regarding user consent.", + status: "Completed" + }, + { + id: 2, + requirement_id: 1, + name: "User Opt-in Mechanism", + description: "Implement an opt-in mechanism for users to give explicit consent.", + status: "In Progress" + }, + { + id: 3, + requirement_id: 2, + name: "Data Encryption Standards", + description: "Establish and implement encryption standards for data in transit.", + status: "Not Started" + }, + { + id: 4, + requirement_id: 2, + name: "Data Encryption Implementation", + description: "Ensure all sensitive data is encrypted at rest using AES-256.", + status: "In Progress" + }, + { + id: 5, + requirement_id: 3, + name: "Initial Risk Assessment", + description: "Perform an initial risk assessment to identify potential vulnerabilities.", + status: "Completed" + }, + { + id: 6, + requirement_id: 3, + name: "Periodic Risk Assessment", + description: "Schedule periodic assessments every six months.", + status: "Not Started" + } +]; diff --git a/Servers/mocks/tools/complianceList.mock.db.ts b/Servers/mocks/tools/complianceList.mock.db.ts new file mode 100644 index 0000000000..997aaf6359 --- /dev/null +++ b/Servers/mocks/tools/complianceList.mock.db.ts @@ -0,0 +1,32 @@ +import { complianceLists } from "../complianceLists/complianceLists.data"; + +export const getAllMockComplianceLists = (): Array => { + return complianceLists; +}; + +export const getMockComplianceListById = (id: number): object | undefined => { + return complianceLists.find((complianceList) => complianceList.id === id); +}; + +export const createMockComplianceList = (newComplianceList: any): object => { + complianceLists.push(newComplianceList); + return newComplianceList; +}; + +export const updateMockComplianceListById = (id: number, updatedComplianceList: any): object | null => { + const index = complianceLists.findIndex((complianceList) => complianceList.id === id); + if (index !== -1) { + complianceLists[index] = { ...complianceLists[index], ...updatedComplianceList }; + return complianceLists[index]; + } + return null; +}; + +export const deleteMockComplianceListById = (id: number): object | null => { + const index = complianceLists.findIndex((complianceList) => complianceList.id === id); + if (index !== -1) { + const deletedComplianceList = complianceLists.splice(index, 1)[0]; + return deletedComplianceList; + } + return null; +}; diff --git a/Servers/mocks/tools/evidence.mock.db.ts b/Servers/mocks/tools/evidence.mock.db.ts new file mode 100644 index 0000000000..5b3d7d6011 --- /dev/null +++ b/Servers/mocks/tools/evidence.mock.db.ts @@ -0,0 +1,32 @@ +import { evidences } from "../evidences/evidences.data"; + +export const getAllMockEvidences = (): Array => { + return evidences; +}; + +export const getMockEvidenceById = (id: number): object | undefined => { + return evidences.find((evidence) => evidence.id === id); +}; + +export const createMockEvidence = (newEvidence: any): object => { + evidences.push(newEvidence); + return newEvidence; +}; + +export const updateMockEvidenceById = (id: number, updatedEvidence: any): object | null => { + const index = evidences.findIndex((evidence) => evidence.id === id); + if (index !== -1) { + evidences[index] = { ...evidences[index], ...updatedEvidence }; + return evidences[index]; + } + return null; +}; + +export const deleteMockEvidenceById = (id: number): object | null => { + const index = evidences.findIndex((evidence) => evidence.id === id); + if (index !== -1) { + const deletedEvidence = evidences.splice(index, 1)[0]; + return deletedEvidence; + } + return null; +}; diff --git a/Servers/mocks/tools/overview.mock.db.ts b/Servers/mocks/tools/overview.mock.db.ts new file mode 100644 index 0000000000..28abe058b5 --- /dev/null +++ b/Servers/mocks/tools/overview.mock.db.ts @@ -0,0 +1,32 @@ +import { overviews } from "../overviews/overviews.data"; + +export const getAllMockOverviews = (): Array => { + return overviews; +}; + +export const getMockOverviewById = (id: number): object | undefined => { + return overviews.find((overview) => overview.id === id); +}; + +export const createMockOverview = (newOverview: any): object => { + overviews.push(newOverview); + return newOverview; +}; + +export const updateMockOverviewById = (id: number, updatedOverview: any): object | null => { + const index = overviews.findIndex((overview) => overview.id === id); + if (index !== -1) { + overviews[index] = { ...overviews[index], ...updatedOverview }; + return overviews[index]; + } + return null; +}; + +export const deleteMockOverviewById = (id: number): object | null => { + const index = overviews.findIndex((overview) => overview.id === id); + if (index !== -1) { + const deletedOverview = overviews.splice(index, 1)[0]; + return deletedOverview; + } + return null; +}; diff --git a/Servers/mocks/tools/requirement.mock.db.ts b/Servers/mocks/tools/requirement.mock.db.ts new file mode 100644 index 0000000000..43470bf493 --- /dev/null +++ b/Servers/mocks/tools/requirement.mock.db.ts @@ -0,0 +1,32 @@ +import { requirements } from "../requirements/requirements.data"; + +export const getAllMockRequirements = (): Array => { + return requirements; +}; + +export const getMockRequirementById = (id: number): object | undefined => { + return requirements.find((requirement) => requirement.id === id); +}; + +export const createMockRequirement = (newRequirement: any): object => { + requirements.push(newRequirement); + return newRequirement; +}; + +export const updateMockRequirementById = (id: number, updatedRequirement: any): object | null => { + const index = requirements.findIndex((requirement) => requirement.id === id); + if (index !== -1) { + requirements[index] = { ...requirements[index], ...updatedRequirement }; + return requirements[index]; + } + return null; +}; + +export const deleteMockRequirementById = (id: number): object | null => { + const index = requirements.findIndex((requirement) => requirement.id === id); + if (index !== -1) { + const deletedRequirement = requirements.splice(index, 1)[0]; + return deletedRequirement; + } + return null; +}; diff --git a/Servers/mocks/tools/subrequirement.mock.db.ts b/Servers/mocks/tools/subrequirement.mock.db.ts new file mode 100644 index 0000000000..88e46f2548 --- /dev/null +++ b/Servers/mocks/tools/subrequirement.mock.db.ts @@ -0,0 +1,32 @@ +import { subrequirements } from "../subrequirements/subrequirements.data"; + +export const getAllMockSubrequirements = (): Array => { + return subrequirements; +}; + +export const getMockSubrequirementById = (id: number): object | undefined => { + return subrequirements.find((subrequirement) => subrequirement.id === id); +}; + +export const createMockSubrequirement = (newSubrequirement: any): object => { + subrequirements.push(newSubrequirement); + return newSubrequirement; +}; + +export const updateMockSubrequirementById = (id: number, updatedSubrequirement: any): object | null => { + const index = subrequirements.findIndex((subrequirement) => subrequirement.id === id); + if (index !== -1) { + subrequirements[index] = { ...subrequirements[index], ...updatedSubrequirement }; + return subrequirements[index]; + } + return null; +}; + +export const deleteMockSubrequirementById = (id: number): object | null => { + const index = subrequirements.findIndex((subrequirement) => subrequirement.id === id); + if (index !== -1) { + const deletedSubrequirement = subrequirements.splice(index, 1)[0]; + return deletedSubrequirement; + } + return null; +}; diff --git a/Servers/models/ComplianceList.ts b/Servers/models/ComplianceList.ts new file mode 100644 index 0000000000..69d13973cb --- /dev/null +++ b/Servers/models/ComplianceList.ts @@ -0,0 +1,6 @@ +export interface ComplianceList { + id: number + compliance_tracker_id: number + name: string + description: string +} \ No newline at end of file diff --git a/Servers/models/Evidence.ts b/Servers/models/Evidence.ts new file mode 100644 index 0000000000..c2b9d3efb2 --- /dev/null +++ b/Servers/models/Evidence.ts @@ -0,0 +1,14 @@ +export interface Evidence { + id: number + subrequirement_id: number + document_name: string + document_type: string + file_path: string + upload_date: Date + uploader_id: number + description: string + status: string + last_reviewed: Date + reviewer_id: number + review_comments: string +} \ No newline at end of file diff --git a/Servers/models/Overview.ts b/Servers/models/Overview.ts new file mode 100644 index 0000000000..317ce106c1 --- /dev/null +++ b/Servers/models/Overview.ts @@ -0,0 +1,13 @@ +export interface Overview { + id: number + subrequirement_id: number + control_name: string + control_description: string + control_owner: string + control_status: string + implementation_description: string + implementation_evidence: string + effective_date: Date + review_date: Date + comments: string +} \ No newline at end of file diff --git a/Servers/models/Requirement.ts b/Servers/models/Requirement.ts new file mode 100644 index 0000000000..5a141dd7a4 --- /dev/null +++ b/Servers/models/Requirement.ts @@ -0,0 +1,7 @@ +export interface Requirement { + id: number + compliance_list_id: number + name: string + description: string + status: string +} \ No newline at end of file diff --git a/Servers/models/Subrequirement.ts b/Servers/models/Subrequirement.ts new file mode 100644 index 0000000000..1ebeb00623 --- /dev/null +++ b/Servers/models/Subrequirement.ts @@ -0,0 +1,7 @@ +export interface Subrequirement { + id: number + requirement_id: number + name: string + description: string + status: string +} \ No newline at end of file diff --git a/Servers/routes/complianceList.route.ts b/Servers/routes/complianceList.route.ts new file mode 100644 index 0000000000..f96630db81 --- /dev/null +++ b/Servers/routes/complianceList.route.ts @@ -0,0 +1,24 @@ +import express from "express"; +const router = express.Router(); + +import { + createComplianceList, + deleteComplianceListById, + getAllComplianceLists, + getComplianceListById, + updateComplianceListById +} from "../controllers/complianceList.ctrl" + +import authenticateJWT from "../middleware/auth.middleware"; + +// GET requests +router.get("/", authenticateJWT, getAllComplianceLists); +router.get("/:id", authenticateJWT, getComplianceListById); + +// POST, PUT, DELETE requests +router.post("/", authenticateJWT, createComplianceList); +router.put("/:id", authenticateJWT, updateComplianceListById); +router.delete("/:id", authenticateJWT, deleteComplianceListById); + + +export default router; \ No newline at end of file diff --git a/Servers/routes/evidence.route.ts b/Servers/routes/evidence.route.ts new file mode 100644 index 0000000000..89b8a4eac1 --- /dev/null +++ b/Servers/routes/evidence.route.ts @@ -0,0 +1,24 @@ +import express from "express"; +const router = express.Router(); + +import { + createEvidence, + deleteEvidenceById, + getAllEvidences, + getEvidenceById, + updateEvidenceById +} from "../controllers/evidence.ctrl" + +import authenticateJWT from "../middleware/auth.middleware"; + +// GET requests +router.get("/", authenticateJWT, getAllEvidences); +router.get("/:id", authenticateJWT, getEvidenceById); + +// POST, PUT, DELETE requests +router.post("/", authenticateJWT, createEvidence); +router.put("/:id", authenticateJWT, updateEvidenceById); +router.delete("/:id", authenticateJWT, deleteEvidenceById); + + +export default router; \ No newline at end of file diff --git a/Servers/routes/overview.route.ts b/Servers/routes/overview.route.ts new file mode 100644 index 0000000000..a58617b1f0 --- /dev/null +++ b/Servers/routes/overview.route.ts @@ -0,0 +1,24 @@ +import express from "express"; +const router = express.Router(); + +import { + createOverview, + deleteOverviewById, + getAllOverviews, + getOverviewById, + updateOverviewById +} from "../controllers/overview.ctrl" + +import authenticateJWT from "../middleware/auth.middleware"; + +// GET requests +router.get("/", authenticateJWT, getAllOverviews); +router.get("/:id", authenticateJWT, getOverviewById); + +// POST, PUT, DELETE requests +router.post("/", authenticateJWT, createOverview); +router.put("/:id", authenticateJWT, updateOverviewById); +router.delete("/:id", authenticateJWT, deleteOverviewById); + + +export default router; \ No newline at end of file diff --git a/Servers/routes/requirement.route.ts b/Servers/routes/requirement.route.ts new file mode 100644 index 0000000000..407923dadf --- /dev/null +++ b/Servers/routes/requirement.route.ts @@ -0,0 +1,24 @@ +import express from "express"; +const router = express.Router(); + +import { + createRequirement, + deleteRequirementById, + getAllRequirements, + getRequirementById, + updateRequirementById +} from "../controllers/requirement.ctrl" + +import authenticateJWT from "../middleware/auth.middleware"; + +// GET requests +router.get("/", authenticateJWT, getAllRequirements); +router.get("/:id", authenticateJWT, getRequirementById); + +// POST, PUT, DELETE requests +router.post("/", authenticateJWT, createRequirement); +router.put("/:id", authenticateJWT, updateRequirementById); +router.delete("/:id", authenticateJWT, deleteRequirementById); + + +export default router; \ No newline at end of file diff --git a/Servers/routes/subrequirement.route.ts b/Servers/routes/subrequirement.route.ts new file mode 100644 index 0000000000..9b1f544aa8 --- /dev/null +++ b/Servers/routes/subrequirement.route.ts @@ -0,0 +1,24 @@ +import express from "express"; +const router = express.Router(); + +import { + createSubrequirement, + deleteSubrequirementById, + getAllSubrequirements, + getSubrequirementById, + updateSubrequirementById +} from "../controllers/subrequirement.ctrl" + +import authenticateJWT from "../middleware/auth.middleware"; + +// GET requests +router.get("/", authenticateJWT, getAllSubrequirements); +router.get("/:id", authenticateJWT, getSubrequirementById); + +// POST, PUT, DELETE requests +router.post("/", authenticateJWT, createSubrequirement); +router.put("/:id", authenticateJWT, updateSubrequirementById); +router.delete("/:id", authenticateJWT, deleteSubrequirementById); + + +export default router; \ No newline at end of file diff --git a/Servers/utils/complianceList.util.ts b/Servers/utils/complianceList.util.ts new file mode 100644 index 0000000000..885bfe7a3e --- /dev/null +++ b/Servers/utils/complianceList.util.ts @@ -0,0 +1,64 @@ +import { ComplianceList } from "../models/ComplianceList"; +import pool from "../database/db"; + +export const getAllComplianceListsQuery = async (): Promise => { + console.log("getAllComplianceLists"); + const complianceLists = await pool.query("SELECT * FROM complianceLists"); + return complianceLists.rows; +}; + +export const getComplianceListByIdQuery = async (id: number): Promise => { + console.log("getComplianceListById", id); + const result = await pool.query("SELECT * FROM complianceLists WHERE id = $1", [id]); + return result.rows.length ? result.rows[0] : null; +}; + +export const createNewComplianceListQuery = async (complianceList: { + name: string; + description: string; +}): Promise => { + console.log("createNewComplianceList", complianceList); + const result = await pool.query( + "INSERT INTO complianceLists (name, description) VALUES ($1, $2) RETURNING *", + [complianceList.name, complianceList.description] + ); + return result.rows[0]; +}; + +export const updateComplianceListByIdQuery = async ( + id: number, + complianceList: { name?: string; description?: string } +): Promise => { + console.log("updateComplianceListById", id, complianceList); + const fields = []; + const values = []; + let query = "UPDATE complianceLists SET "; + + if (complianceList.name) { + fields.push("name = $1"); + values.push(complianceList.name); + } + if (complianceList.description) { + fields.push("description = $2"); + values.push(complianceList.description); + } + + if (fields.length === 0) { + throw new Error("No fields to update"); + } + + query += fields.join(", ") + " WHERE id = $3 RETURNING *"; + values.push(id); + + const result = await pool.query(query, values); + return result.rows.length ? result.rows[0] : null; +}; + +export const deleteComplianceListByIdQuery = async (id: number): Promise => { + console.log("deleteComplianceListById", id); + const result = await pool.query( + "DELETE FROM complianceLists WHERE id = $1 RETURNING id", + [id] + ); + return result.rowCount !== null && result.rowCount > 0; +}; diff --git a/Servers/utils/evidence.util.ts b/Servers/utils/evidence.util.ts new file mode 100644 index 0000000000..8496ced3fb --- /dev/null +++ b/Servers/utils/evidence.util.ts @@ -0,0 +1,64 @@ +import { Evidence } from "../models/Evidence"; +import pool from "../database/db"; + +export const getAllEvidencesQuery = async (): Promise => { + console.log("getAllEvidences"); + const evidences = await pool.query("SELECT * FROM evidences"); + return evidences.rows; +}; + +export const getEvidenceByIdQuery = async (id: number): Promise => { + console.log("getEvidenceById", id); + const result = await pool.query("SELECT * FROM evidences WHERE id = $1", [id]); + return result.rows.length ? result.rows[0] : null; +}; + +export const createNewEvidenceQuery = async (evidence: { + name: string; + description: string; +}): Promise => { + console.log("createNewEvidence", evidence); + const result = await pool.query( + "INSERT INTO evidences (name, description) VALUES ($1, $2) RETURNING *", + [evidence.name, evidence.description] + ); + return result.rows[0]; +}; + +export const updateEvidenceByIdQuery = async ( + id: number, + evidence: { name?: string; description?: string } +): Promise => { + console.log("updateEvidenceById", id, evidence); + const fields = []; + const values = []; + let query = "UPDATE evidences SET "; + + if (evidence.name) { + fields.push("name = $1"); + values.push(evidence.name); + } + if (evidence.description) { + fields.push("description = $2"); + values.push(evidence.description); + } + + if (fields.length === 0) { + throw new Error("No fields to update"); + } + + query += fields.join(", ") + " WHERE id = $3 RETURNING *"; + values.push(id); + + const result = await pool.query(query, values); + return result.rows.length ? result.rows[0] : null; +}; + +export const deleteEvidenceByIdQuery = async (id: number): Promise => { + console.log("deleteEvidenceById", id); + const result = await pool.query( + "DELETE FROM evidences WHERE id = $1 RETURNING id", + [id] + ); + return result.rowCount !== null && result.rowCount > 0; +}; diff --git a/Servers/utils/overview.util.ts b/Servers/utils/overview.util.ts new file mode 100644 index 0000000000..c17f6b6990 --- /dev/null +++ b/Servers/utils/overview.util.ts @@ -0,0 +1,64 @@ +import { Overview } from "../models/Overview"; +import pool from "../database/db"; + +export const getAllOverviewsQuery = async (): Promise => { + console.log("getAllOverviews"); + const overviews = await pool.query("SELECT * FROM overviews"); + return overviews.rows; +}; + +export const getOverviewByIdQuery = async (id: number): Promise => { + console.log("getOverviewById", id); + const result = await pool.query("SELECT * FROM overviews WHERE id = $1", [id]); + return result.rows.length ? result.rows[0] : null; +}; + +export const createNewOverviewQuery = async (overview: { + name: string; + description: string; +}): Promise => { + console.log("createNewOverview", overview); + const result = await pool.query( + "INSERT INTO overviews (name, description) VALUES ($1, $2) RETURNING *", + [overview.name, overview.description] + ); + return result.rows[0]; +}; + +export const updateOverviewByIdQuery = async ( + id: number, + overview: { name?: string; description?: string } +): Promise => { + console.log("updateOverviewById", id, overview); + const fields = []; + const values = []; + let query = "UPDATE overviews SET "; + + if (overview.name) { + fields.push("name = $1"); + values.push(overview.name); + } + if (overview.description) { + fields.push("description = $2"); + values.push(overview.description); + } + + if (fields.length === 0) { + throw new Error("No fields to update"); + } + + query += fields.join(", ") + " WHERE id = $3 RETURNING *"; + values.push(id); + + const result = await pool.query(query, values); + return result.rows.length ? result.rows[0] : null; +}; + +export const deleteOverviewByIdQuery = async (id: number): Promise => { + console.log("deleteOverviewById", id); + const result = await pool.query( + "DELETE FROM overviews WHERE id = $1 RETURNING id", + [id] + ); + return result.rowCount !== null && result.rowCount > 0; +}; diff --git a/Servers/utils/requirement.util.ts b/Servers/utils/requirement.util.ts new file mode 100644 index 0000000000..d2f11521bc --- /dev/null +++ b/Servers/utils/requirement.util.ts @@ -0,0 +1,64 @@ +import { Requirement } from "../models/Requirement"; +import pool from "../database/db"; + +export const getAllRequirementsQuery = async (): Promise => { + console.log("getAllRequirements"); + const requirements = await pool.query("SELECT * FROM requirements"); + return requirements.rows; +}; + +export const getRequirementByIdQuery = async (id: number): Promise => { + console.log("getRequirementById", id); + const result = await pool.query("SELECT * FROM requirements WHERE id = $1", [id]); + return result.rows.length ? result.rows[0] : null; +}; + +export const createNewRequirementQuery = async (requirement: { + name: string; + description: string; +}): Promise => { + console.log("createNewRequirement", requirement); + const result = await pool.query( + "INSERT INTO requirements (name, description) VALUES ($1, $2) RETURNING *", + [requirement.name, requirement.description] + ); + return result.rows[0]; +}; + +export const updateRequirementByIdQuery = async ( + id: number, + requirement: { name?: string; description?: string } +): Promise => { + console.log("updateRequirementById", id, requirement); + const fields = []; + const values = []; + let query = "UPDATE requirements SET "; + + if (requirement.name) { + fields.push("name = $1"); + values.push(requirement.name); + } + if (requirement.description) { + fields.push("description = $2"); + values.push(requirement.description); + } + + if (fields.length === 0) { + throw new Error("No fields to update"); + } + + query += fields.join(", ") + " WHERE id = $3 RETURNING *"; + values.push(id); + + const result = await pool.query(query, values); + return result.rows.length ? result.rows[0] : null; +}; + +export const deleteRequirementByIdQuery = async (id: number): Promise => { + console.log("deleteRequirementById", id); + const result = await pool.query( + "DELETE FROM requirements WHERE id = $1 RETURNING id", + [id] + ); + return result.rowCount !== null && result.rowCount > 0; +}; diff --git a/Servers/utils/subrequirement.util.ts b/Servers/utils/subrequirement.util.ts new file mode 100644 index 0000000000..0a2134c57b --- /dev/null +++ b/Servers/utils/subrequirement.util.ts @@ -0,0 +1,64 @@ +import { Subrequirement } from "../models/Subrequirement"; +import pool from "../database/db"; + +export const getAllSubrequirementsQuery = async (): Promise => { + console.log("getAllSubrequirements"); + const subrequirements = await pool.query("SELECT * FROM subrequirements"); + return subrequirements.rows; +}; + +export const getSubrequirementByIdQuery = async (id: number): Promise => { + console.log("getSubrequirementById", id); + const result = await pool.query("SELECT * FROM subrequirements WHERE id = $1", [id]); + return result.rows.length ? result.rows[0] : null; +}; + +export const createNewSubrequirementQuery = async (subrequirement: { + name: string; + description: string; +}): Promise => { + console.log("createNewSubrequirement", subrequirement); + const result = await pool.query( + "INSERT INTO subrequirements (name, description) VALUES ($1, $2) RETURNING *", + [subrequirement.name, subrequirement.description] + ); + return result.rows[0]; +}; + +export const updateSubrequirementByIdQuery = async ( + id: number, + subrequirement: { name?: string; description?: string } +): Promise => { + console.log("updateSubrequirementById", id, subrequirement); + const fields = []; + const values = []; + let query = "UPDATE subrequirements SET "; + + if (subrequirement.name) { + fields.push("name = $1"); + values.push(subrequirement.name); + } + if (subrequirement.description) { + fields.push("description = $2"); + values.push(subrequirement.description); + } + + if (fields.length === 0) { + throw new Error("No fields to update"); + } + + query += fields.join(", ") + " WHERE id = $3 RETURNING *"; + values.push(id); + + const result = await pool.query(query, values); + return result.rows.length ? result.rows[0] : null; +}; + +export const deleteSubrequirementByIdQuery = async (id: number): Promise => { + console.log("deleteSubrequirementById", id); + const result = await pool.query( + "DELETE FROM subrequirements WHERE id = $1 RETURNING id", + [id] + ); + return result.rowCount !== null && result.rowCount > 0; +};