From c968044160fcabc155612e6951574150e03f6674 Mon Sep 17 00:00:00 2001 From: Joao Correia Date: Thu, 30 Jan 2025 11:50:28 +0000 Subject: [PATCH] switch to mongo's id handling --- src/interfaces/approval.workflow.ts | 11 +++----- src/pages/approval-workflows/[id]/clone.tsx | 4 +-- src/pages/approval-workflows/[id]/edit.tsx | 4 +-- src/pages/approval-workflows/create.tsx | 2 +- src/pages/approval-workflows/index.tsx | 11 ++++---- src/utils/approval.workflows.be.ts | 29 +++++++++++---------- 6 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/interfaces/approval.workflow.ts b/src/interfaces/approval.workflow.ts index 8b7efcf1..b3f5aa7d 100644 --- a/src/interfaces/approval.workflow.ts +++ b/src/interfaces/approval.workflow.ts @@ -1,8 +1,9 @@ +import { ObjectId } from "mongodb"; import { Module } from "."; import { Type, User, userTypeLabels, userTypeLabelsShort } from "./user"; export interface ApprovalWorkflow { - id: string, + _id?: ObjectId, name: string, entityId: string, requester: User["id"], @@ -12,14 +13,8 @@ export interface ApprovalWorkflow { steps: WorkflowStep[], } -export interface EditableApprovalWorkflow { +export interface EditableApprovalWorkflow extends Omit { id: string, - name: string, - entityId: string, - requester: User["id"], - startDate: number, - modules: Module[], - status: ApprovalWorkflowStatus, steps: EditableWorkflowStep[], } diff --git a/src/pages/approval-workflows/[id]/clone.tsx b/src/pages/approval-workflows/[id]/clone.tsx index 8bb620f7..e62ee2d7 100644 --- a/src/pages/approval-workflows/[id]/clone.tsx +++ b/src/pages/approval-workflows/[id]/clone.tsx @@ -108,7 +108,7 @@ export default function Home({ user, workflow, userEntitiesWithLabel, userEntiti })); const editableWorkflow: EditableApprovalWorkflow = { - id: uuidv4(), + id: uuidv4(), // this id is only used in UI. it is ommited on submission to DB and lets mongo handle unique id. name: workflow.name, entityId: workflow.entityId, requester: user.id, @@ -141,7 +141,7 @@ export default function Home({ user, workflow, userEntitiesWithLabel, userEntiti }; axios - .post(`/api/approval-workflows/${workflow.id}/clone`, filteredWorkflow) + .post(`/api/approval-workflows/${workflow._id}/clone`, filteredWorkflow) .then(() => { toast.success("Approval Workflow cloned successfully."); setIsRedirecting(true); diff --git a/src/pages/approval-workflows/[id]/edit.tsx b/src/pages/approval-workflows/[id]/edit.tsx index 6d8b477d..7765e009 100644 --- a/src/pages/approval-workflows/[id]/edit.tsx +++ b/src/pages/approval-workflows/[id]/edit.tsx @@ -71,7 +71,7 @@ export default function Home({ user, workflow, workflowEntityTeachers, workflowE })); const editableWorkflow: EditableApprovalWorkflow = { - id: workflow.id, + id: workflow._id?.toString() ?? "", name: workflow.name, entityId: workflow.entityId, requester: user.id, // should it change to the editor? @@ -104,7 +104,7 @@ export default function Home({ user, workflow, workflowEntityTeachers, workflowE }; axios - .put(`/api/approval-workflows/${workflow.id}/edit`, filteredWorkflow) + .put(`/api/approval-workflows/${updatedWorkflow.id}/edit`, filteredWorkflow) .then(() => { toast.success("Approval Workflow edited successfully."); setIsRedirecting(true); diff --git a/src/pages/approval-workflows/create.tsx b/src/pages/approval-workflows/create.tsx index 8e34dca1..5fafb405 100644 --- a/src/pages/approval-workflows/create.tsx +++ b/src/pages/approval-workflows/create.tsx @@ -137,7 +137,7 @@ export default function Home({ user, userEntitiesWithLabel, userEntitiesTeachers if (isAdding) return; setIsAdding(true); - const newId = uuidv4(); + const newId = uuidv4(); // this id is only used in UI. it is ommited on submission to DB and lets mongo handle unique id. const newWorkflow: EditableApprovalWorkflow = { id: newId, name: "", diff --git a/src/pages/approval-workflows/index.tsx b/src/pages/approval-workflows/index.tsx index ac042851..c7c71731 100644 --- a/src/pages/approval-workflows/index.tsx +++ b/src/pages/approval-workflows/index.tsx @@ -145,7 +145,8 @@ export default function ApprovalWorkflows({ user, workflows, workflowsAssignees, setNameFilter(name); }; - const deleteApprovalWorkflow = (id: string, name: string) => { + const deleteApprovalWorkflow = (id: string | undefined, name: string) => { + if (id === undefined) return; if (!confirm(`Are you sure you want to delete this Approval Workflow?`)) return; axios @@ -267,7 +268,7 @@ export default function ApprovalWorkflows({ user, workflows, workflowsAssignees, className="cursor-pointer tooltip" onClick={(e) => { e.stopPropagation(); - deleteApprovalWorkflow(row.original.id, row.original.name); + deleteApprovalWorkflow(row.original._id?.toString(), row.original.name); }} > @@ -276,7 +277,7 @@ export default function ApprovalWorkflows({ user, workflows, workflowsAssignees, e.stopPropagation()} data-tip="Clone" - href={`/approval-workflows/${row.original.id}/clone`} + href={`/approval-workflows/${row.original._id?.toString()}/clone`} className="cursor-pointer tooltip" > @@ -286,7 +287,7 @@ export default function ApprovalWorkflows({ user, workflows, workflowsAssignees, e.stopPropagation()} data-tip="Edit" - href={`/approval-workflows/${row.original.id}/edit`} + href={`/approval-workflows/${row.original._id?.toString()}/edit`} className="cursor-pointer tooltip" > @@ -391,7 +392,7 @@ export default function ApprovalWorkflows({ user, workflows, workflowsAssignees, {table.getRowModel().rows.map((row) => ( window.location.href = `/approval-workflows/${row.original.id}`} + onClick={() => window.location.href = `/approval-workflows/${row.original._id?.toString()}`} style={{ cursor: "pointer" }} className="bg-purple-50" > diff --git a/src/utils/approval.workflows.be.ts b/src/utils/approval.workflows.be.ts index a09489a2..e876a279 100644 --- a/src/utils/approval.workflows.be.ts +++ b/src/utils/approval.workflows.be.ts @@ -1,32 +1,33 @@ +import { ObjectId } from "mongodb"; import { ApprovalWorkflow } from "@/interfaces/approval.workflow"; import client from "@/lib/mongodb"; const db = client.db(process.env.MONGODB_DB); export const getApprovalWorkflows = async (ids?: string[]) => { - return await db - .collection("approval-workflows") - .find(ids ? { id: { $in: ids } } : {}) - .toArray(); + return await db + .collection("approval-workflows") + .find(ids ? { _id: { $in: ids.map((id) => new ObjectId(id)) } } : {}) + .toArray(); }; export const getApprovalWorkflow = async (id: string) => { - return await db.collection("approval-workflows").findOne({ id }); + return await db.collection("approval-workflows").findOne({ _id: new ObjectId(id) }); }; -export const createApprovalWorkflow = async (workflow: ApprovalWorkflow) => { - return await db.collection("approval-workflows").insertOne(workflow); +export const createApprovalWorkflow = async (workflow: Omit) => { + return await db.collection("approval-workflows").insertOne(workflow); }; -export const createApprovalWorkflows = async (workflows: ApprovalWorkflow[]) => { - if (workflows.length === 0) return; - return await db.collection("approval-workflows").insertMany(workflows); +export const createApprovalWorkflows = async (workflows: Omit[]) => { + if (workflows.length === 0) return; + return await db.collection("approval-workflows").insertMany(workflows); }; -export const updateApprovalWorkflow = async (id: string, workflow: ApprovalWorkflow) => { - return await db.collection("approval-workflows").replaceOne({ id }, workflow); +export const updateApprovalWorkflow = async (id: string, workflow: Omit) => { + return await db.collection("approval-workflows").replaceOne({ _id: new ObjectId(id) }, workflow); }; export const deleteApprovalWorkflow = async (id: string) => { - return await db.collection("approval-workflows").deleteOne({ id }); -}; \ No newline at end of file + return await db.collection("approval-workflows").deleteOne({ _id: new ObjectId(id) }); +};