From a857375cc10050338a40dde056beee91b9301e02 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 11 Dec 2024 21:19:37 +0530 Subject: [PATCH] feat: fixed migration issues and resolved all routes in frontend --- ...0241205160300_project-split-to-products.ts | 68 +++---- .../src/server/routes/v1/project-router.ts | 2 +- backend/src/services/org/org-service.ts | 2 +- backend/src/services/project/project-dal.ts | 10 +- .../src/services/project/project-service.ts | 8 +- backend/src/services/project/project-types.ts | 2 +- .../src/components/dashboard/AddTagsMenu.tsx | 4 +- .../integrations/NoEnvironmentsBanner.tsx | 4 +- .../v2/projects/NewProjectModal.tsx | 2 +- .../WorkspaceContext/WorkspaceContext.tsx | 4 +- frontend/src/helpers/workspace.ts | 12 ++ frontend/src/hooks/api/workspace/queries.tsx | 6 +- frontend/src/layouts/AppLayout/AppLayout.tsx | 167 +----------------- .../ProjectSelect/ProjectSelect.tsx | 3 +- .../ProjectSidebarItems.tsx | 158 +++++++++++++++++ .../components/ProjectSidebarItems/index.tsx | 1 + .../[id]/allowlist/index.tsx | 0 .../[id]/ca/[caId]/index.tsx | 0 .../[id]/certificates/index.tsx | 0 .../[id]/identities/[identityId]/index.tsx | 0 .../[id]/members/[membershipId]/index.tsx | 0 .../[id]/members/index.tsx | 0 .../pki-collections/[collectionId]/index.tsx | 0 .../[id]/roles/[roleSlug]/index.tsx | 0 .../[id]/settings/index.tsx | 0 .../src/pages/cmek/[id]/allowlist/index.tsx | 21 +++ .../[id]/identities/[identityId]/index.tsx | 20 +++ .../{project => cmek}/[id]/kms/index.tsx | 0 .../[id]/members/[membershipId]/index.tsx | 20 +++ .../src/pages/cmek/[id]/members/index.tsx | 21 +++ .../cmek/[id]/roles/[roleSlug]/index.tsx | 20 +++ .../src/pages/cmek/[id]/settings/index.tsx | 22 +++ .../pages/org/[id]/cert-manager/overview.tsx | 1 + frontend/src/pages/org/[id]/cmek/overview.tsx | 1 + .../src/pages/org/[id]/overview/index.tsx | 5 +- .../org/[id]/secret-manager/overview.tsx | 8 +- .../secret-manager/[id]/allowlist/index.tsx | 21 +++ .../[id]/approval/index.tsx | 0 .../[id]/identities/[identityId]/index.tsx | 20 +++ .../[id]/members/[membershipId]/index.tsx | 20 +++ .../secret-manager/[id]/members/index.tsx | 21 +++ .../[id]/roles/[roleSlug]/index.tsx | 20 +++ .../[id]/secret-rotation/index.tsx | 0 .../[id]/secrets/[env].tsx | 0 .../[id]/secrets/overview.tsx | 0 .../secret-manager/[id]/settings/index.tsx | 22 +++ frontend/src/pages/signup/index.tsx | 5 +- frontend/src/pages/signupinvite.tsx | 3 +- frontend/src/views/Login/Login.utils.tsx | 3 +- .../IdentityProjectRow.tsx | 4 +- .../views/Org/components/CreateOrgModal.tsx | 5 +- .../OrgAdminProjects/OrgAdminProjects.tsx | 11 +- frontend/src/views/Project/CaPage/CaPage.tsx | 5 +- .../components/CaTab/components/CaTable.tsx | 3 +- .../components/PkiCollectionModal.tsx | 3 +- .../components/PkiCollectionTable.tsx | 3 +- .../IdentityDetailPage.tsx | 4 +- .../MemberDetailsPage/MemberDetailPage.tsx | 4 +- .../components/IdentityTab/IdentityTab.tsx | 4 +- .../MembersTab/components/MembersTable.tsx | 4 +- .../ProjectRoleList/ProjectRoleList.tsx | 4 +- .../PkiCollectionPage/PkiCollectionPage.tsx | 5 +- .../src/views/Project/RolePage/RolePage.tsx | 4 +- .../Project/RolePage/components/RoleModal.tsx | 2 +- .../views/SecretMainPage/SecretMainPage.tsx | 3 +- .../SecretOverviewPage/SecretOverviewPage.tsx | 6 +- .../DeleteProjectSection.tsx | 5 +- .../BackupPDFStep/BackupPDFStep.tsx | 3 +- .../admin/DashboardPage/DashboardPage.tsx | 3 +- 69 files changed, 547 insertions(+), 265 deletions(-) create mode 100644 frontend/src/helpers/workspace.ts create mode 100644 frontend/src/layouts/AppLayout/components/ProjectSidebarItems/ProjectSidebarItems.tsx create mode 100644 frontend/src/layouts/AppLayout/components/ProjectSidebarItems/index.tsx rename frontend/src/pages/{project => cert-manager}/[id]/allowlist/index.tsx (100%) rename frontend/src/pages/{project => cert-manager}/[id]/ca/[caId]/index.tsx (100%) rename frontend/src/pages/{project => cert-manager}/[id]/certificates/index.tsx (100%) rename frontend/src/pages/{project => cert-manager}/[id]/identities/[identityId]/index.tsx (100%) rename frontend/src/pages/{project => cert-manager}/[id]/members/[membershipId]/index.tsx (100%) rename frontend/src/pages/{project => cert-manager}/[id]/members/index.tsx (100%) rename frontend/src/pages/{project => cert-manager}/[id]/pki-collections/[collectionId]/index.tsx (100%) rename frontend/src/pages/{project => cert-manager}/[id]/roles/[roleSlug]/index.tsx (100%) rename frontend/src/pages/{project => cert-manager}/[id]/settings/index.tsx (100%) create mode 100644 frontend/src/pages/cmek/[id]/allowlist/index.tsx create mode 100644 frontend/src/pages/cmek/[id]/identities/[identityId]/index.tsx rename frontend/src/pages/{project => cmek}/[id]/kms/index.tsx (100%) create mode 100644 frontend/src/pages/cmek/[id]/members/[membershipId]/index.tsx create mode 100644 frontend/src/pages/cmek/[id]/members/index.tsx create mode 100644 frontend/src/pages/cmek/[id]/roles/[roleSlug]/index.tsx create mode 100644 frontend/src/pages/cmek/[id]/settings/index.tsx create mode 100644 frontend/src/pages/secret-manager/[id]/allowlist/index.tsx rename frontend/src/pages/{project => secret-manager}/[id]/approval/index.tsx (100%) create mode 100644 frontend/src/pages/secret-manager/[id]/identities/[identityId]/index.tsx create mode 100644 frontend/src/pages/secret-manager/[id]/members/[membershipId]/index.tsx create mode 100644 frontend/src/pages/secret-manager/[id]/members/index.tsx create mode 100644 frontend/src/pages/secret-manager/[id]/roles/[roleSlug]/index.tsx rename frontend/src/pages/{project => secret-manager}/[id]/secret-rotation/index.tsx (100%) rename frontend/src/pages/{project => secret-manager}/[id]/secrets/[env].tsx (100%) rename frontend/src/pages/{project => secret-manager}/[id]/secrets/overview.tsx (100%) create mode 100644 frontend/src/pages/secret-manager/[id]/settings/index.tsx diff --git a/backend/src/db/migrations/20241205160300_project-split-to-products.ts b/backend/src/db/migrations/20241205160300_project-split-to-products.ts index bf572edfc..6ebac71e5 100644 --- a/backend/src/db/migrations/20241205160300_project-split-to-products.ts +++ b/backend/src/db/migrations/20241205160300_project-split-to-products.ts @@ -1,11 +1,12 @@ +import slugify from "@sindresorhus/slugify"; import { Knex } from "knex"; import { v4 as uuidV4 } from "uuid"; -import slugify from "@sindresorhus/slugify"; -import { ProjectType, TableName } from "../schemas"; import { alphaNumericNanoId } from "@app/lib/nanoid"; -/* eslint-disable no-await-in-loop,no-param-reassign,@typescript-eslint/ban-ts-comment */ +import { ProjectType, TableName } from "../schemas"; + +/* eslint-disable no-await-in-loop,@typescript-eslint/ban-ts-comment */ const newProject = async (knex: Knex, projectId: string, projectType: ProjectType) => { const newProjectId = uuidV4(); const project = await knex(TableName.Project).where("id", projectId).first(); @@ -24,10 +25,12 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp projectCustomRoles.map((el) => { const id = uuidV4(); customRoleMapping[el.id] = id; - el.id = id; - el.projectId = newProjectId; - el.permissions = el.permissions ? JSON.stringify(el.permissions) : el.permissions; - return el; + return { + ...el, + id, + projectId: newProjectId, + permissions: el.permissions ? JSON.stringify(el.permissions) : el.permissions + }; }) ); } @@ -38,9 +41,7 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp groupMemberships.map((el) => { const id = uuidV4(); groupMembershipMapping[el.id] = id; - el.id = id; - el.projectId = newProjectId; - return el; + return { ...el, id, projectId: newProjectId }; }) ); } @@ -53,10 +54,9 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp await knex(TableName.GroupProjectMembershipRole).insert( groupMembershipRoles.map((el) => { const id = uuidV4(); - el.id = id; - el.projectMembershipId = groupMembershipMapping[el.id]; - el.customRoleId = el.customRoleId ? customRoleMapping[el.customRoleId] : el.customRoleId; - return el; + const projectMembershipId = groupMembershipMapping[el.id]; + const customRoleId = el.customRoleId ? customRoleMapping[el.customRoleId] : el.customRoleId; + return { ...el, id, projectMembershipId, customRoleId }; }) ); } @@ -68,9 +68,7 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp identities.map((el) => { const id = uuidV4(); identityProjectMembershipMapping[el.id] = id; - el.id = id; - el.projectId = newProjectId; - return el; + return { ...el, id, projectId: newProjectId }; }) ); } @@ -83,10 +81,9 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp await knex(TableName.IdentityProjectMembershipRole).insert( identitiesRoles.map((el) => { const id = uuidV4(); - el.id = id; - el.projectMembershipId = identityProjectMembershipMapping[el.projectMembershipId]; - el.customRoleId = el.customRoleId ? customRoleMapping[el.customRoleId] : el.customRoleId; - return el; + const projectMembershipId = identityProjectMembershipMapping[el.projectMembershipId]; + const customRoleId = el.customRoleId ? customRoleMapping[el.customRoleId] : el.customRoleId; + return { ...el, id, projectMembershipId, customRoleId }; }) ); } @@ -98,9 +95,7 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp projectUserMembers.map((el) => { const id = uuidV4(); projectMembershipMapping[el.id] = id; - el.id = id; - el.projectId = newProjectId; - return el; + return { ...el, id, projectId: newProjectId }; }) ); } @@ -112,10 +107,9 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp await knex(TableName.ProjectUserMembershipRole).insert( membershipRoles.map((el) => { const id = uuidV4(); - el.id = id; - el.projectMembershipId = projectMembershipMapping[el.projectMembershipId]; - el.customRoleId = el.customRoleId ? customRoleMapping[el.customRoleId] : el.customRoleId; - return el; + const projectMembershipId = projectMembershipMapping[el.projectMembershipId]; + const customRoleId = el.customRoleId ? customRoleMapping[el.customRoleId] : el.customRoleId; + return { ...el, id, projectMembershipId, customRoleId }; }) ); } @@ -125,10 +119,8 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp await knex(TableName.KmsKey).insert( kmsKeys.map((el) => { const id = uuidV4(); - el.id = id; - el.projectId = newProjectId; - el.slug = slugify(alphaNumericNanoId(8).toLowerCase()); - return el; + const slug = slugify(alphaNumericNanoId(8).toLowerCase()); + return { ...el, id, slug, projectId: newProjectId }; }) ); } @@ -143,9 +135,7 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp await knex(TableName.ProjectKeys).insert( projectKeys.map((el) => { const id = uuidV4(); - el.id = id; - el.projectId = newProjectId; - return el; + return { ...el, id, projectId: newProjectId }; }) ); } @@ -154,16 +144,14 @@ const newProject = async (knex: Knex, projectId: string, projectType: ProjectTyp if (serviceTokens.length) { await knex(TableName.ServiceToken).insert( serviceTokens.map((el) => { - el.id = uuidV4(); - el.projectId = projectId; - el.scopes = el.scopes ? JSON.stringify(el.scopes) : el.scopes; - return el; + const id = uuidV4(); + const scopes = el.scopes ? JSON.stringify(el.scopes) : el.scopes; + return { ...el, id, scopes, projectId: newProjectId }; }) ); } return newProjectId; }; -/* eslint-enable */ const BATCH_SIZE = 500; export async function up(knex: Knex): Promise { diff --git a/backend/src/server/routes/v1/project-router.ts b/backend/src/server/routes/v1/project-router.ts index f348a7cf4..5944777ae 100644 --- a/backend/src/server/routes/v1/project-router.ts +++ b/backend/src/server/routes/v1/project-router.ts @@ -137,7 +137,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { .enum(["true", "false"]) .default("false") .transform((value) => value === "true"), - type: z.nativeEnum(ProjectType).optional() + type: z.enum([ProjectType.SecretManager, ProjectType.Cmek, ProjectType.CertificateManager, "all"]).optional() }), response: { 200: z.object({ diff --git a/backend/src/services/org/org-service.ts b/backend/src/services/org/org-service.ts index 9a48f583a..33931bf26 100644 --- a/backend/src/services/org/org-service.ts +++ b/backend/src/services/org/org-service.ts @@ -197,7 +197,7 @@ export const orgServiceFactory = ({ const findAllWorkspaces = async ({ actor, actorId, orgId, type }: TFindAllWorkspacesDTO) => { if (actor === ActorType.USER) { - const workspaces = await projectDAL.findAllProjects(actorId, orgId, type); + const workspaces = await projectDAL.findAllProjects(actorId, orgId, type || "all"); return workspaces; } diff --git a/backend/src/services/project/project-dal.ts b/backend/src/services/project/project-dal.ts index 2f1877799..c13258a39 100644 --- a/backend/src/services/project/project-dal.ts +++ b/backend/src/services/project/project-dal.ts @@ -19,7 +19,7 @@ export type TProjectDALFactory = ReturnType; export const projectDALFactory = (db: TDbClient) => { const projectOrm = ormify(db, TableName.Project); - const findAllProjects = async (userId: string, orgId: string, projectType?: ProjectType | null) => { + const findAllProjects = async (userId: string, orgId: string, projectType: ProjectType | "all") => { try { const workspaces = await db .replicaNode()(TableName.ProjectMembership) @@ -27,7 +27,7 @@ export const projectDALFactory = (db: TDbClient) => { .join(TableName.Project, `${TableName.ProjectMembership}.projectId`, `${TableName.Project}.id`) .where(`${TableName.Project}.orgId`, orgId) .andWhere((qb) => { - if (projectType) { + if (projectType !== "all") { void qb.where(`${TableName.Project}.type`, projectType); } }) @@ -130,7 +130,11 @@ export const projectDALFactory = (db: TDbClient) => { .replicaNode()(TableName.IdentityProjectMembership) .where({ identityId }) .join(TableName.Project, `${TableName.IdentityProjectMembership}.projectId`, `${TableName.Project}.id`) - .where(`${TableName.Project}.type`, projectType) + .andWhere((qb) => { + if (projectType) { + void qb.where(`${TableName.Project}.type`, projectType); + } + }) .leftJoin(TableName.Environment, `${TableName.Environment}.projectId`, `${TableName.Project}.id`) .select( selectAllTableCols(TableName.Project), diff --git a/backend/src/services/project/project-service.ts b/backend/src/services/project/project-service.ts index 2c1dabc5c..47cc48b1d 100644 --- a/backend/src/services/project/project-service.ts +++ b/backend/src/services/project/project-service.ts @@ -431,7 +431,13 @@ export const projectServiceFactory = ({ return deletedProject; }; - const getProjects = async ({ actorId, includeRoles, actorAuthMethod, actorOrgId, type }: TListProjectsDTO) => { + const getProjects = async ({ + actorId, + includeRoles, + actorAuthMethod, + actorOrgId, + type = ProjectType.SecretManager + }: TListProjectsDTO) => { const workspaces = await projectDAL.findAllProjects(actorId, actorOrgId, type); if (includeRoles) { diff --git a/backend/src/services/project/project-types.ts b/backend/src/services/project/project-types.ts index 39a3f2520..29261da4f 100644 --- a/backend/src/services/project/project-types.ts +++ b/backend/src/services/project/project-types.ts @@ -85,7 +85,7 @@ export type TDeleteProjectDTO = { export type TListProjectsDTO = { includeRoles: boolean; - type?: ProjectType | null; + type?: ProjectType | "all"; } & Omit; export type TUpgradeProjectDTO = { diff --git a/frontend/src/components/dashboard/AddTagsMenu.tsx b/frontend/src/components/dashboard/AddTagsMenu.tsx index 3a54f77ab..d2e295c14 100644 --- a/frontend/src/components/dashboard/AddTagsMenu.tsx +++ b/frontend/src/components/dashboard/AddTagsMenu.tsx @@ -5,6 +5,8 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Menu, Transition } from "@headlessui/react"; import { Tag } from "public/data/frequentInterfaces"; +import { ProjectType } from "@app/hooks/api/workspace/types"; + /** * This is the menu that is used to add more tags to a secret * @param {object} obj @@ -75,7 +77,7 @@ const AddTagsMenu = ({ router.push(`/project/${String(router.query.id)}/settings`)} + onClick={() => router.push(`/${ProjectType.SecretManager}/${String(router.query.id)}/settings`)} > Add more tags diff --git a/frontend/src/components/integrations/NoEnvironmentsBanner.tsx b/frontend/src/components/integrations/NoEnvironmentsBanner.tsx index fa900ff6d..5e185f9d0 100644 --- a/frontend/src/components/integrations/NoEnvironmentsBanner.tsx +++ b/frontend/src/components/integrations/NoEnvironmentsBanner.tsx @@ -1,5 +1,7 @@ import { useRouter } from "next/router"; +import { ProjectType } from "@app/hooks/api/workspace/types"; + import { Button } from "../v2"; interface IProps { @@ -20,7 +22,7 @@ export const NoEnvironmentsBanner = ({ projectId }: IProps) => {