From 2ccc77ef40a2acf8e52703282c973c0b4e279625 Mon Sep 17 00:00:00 2001 From: = Date: Fri, 17 May 2024 16:15:05 +0530 Subject: [PATCH 1/6] feat: split project api description for identities and users into seperate --- backend/src/lib/api-docs/constants.ts | 66 ++++++++++--------- .../routes/v1/project-membership-router.ts | 10 +-- .../routes/v2/identity-project-router.ts | 14 ++-- .../routes/v2/project-membership-router.ts | 14 ++-- 4 files changed, 55 insertions(+), 49 deletions(-) diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 483f8e54c..8e9cdf3bb 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -145,36 +145,6 @@ export const PROJECTS = { name: "The new name of the project.", autoCapitalization: "Disable or enable auto-capitalization for the project." }, - INVITE_MEMBER: { - projectId: "The ID of the project to invite the member to.", - emails: "A list of organization member emails to invite to the project.", - usernames: "A list of usernames to invite to the project." - }, - REMOVE_MEMBER: { - projectId: "The ID of the project to remove the member from.", - emails: "A list of organization member emails to remove from the project.", - usernames: "A list of usernames to remove from the project." - }, - GET_USER_MEMBERSHIPS: { - workspaceId: "The ID of the project to get memberships from." - }, - UPDATE_USER_MEMBERSHIP: { - workspaceId: "The ID of the project to update the membership for.", - membershipId: "The ID of the membership to update.", - roles: "A list of roles to update the membership to." - }, - LIST_IDENTITY_MEMBERSHIPS: { - projectId: "The ID of the project to get identity memberships from." - }, - UPDATE_IDENTITY_MEMBERSHIP: { - projectId: "The ID of the project to update the identity membership for.", - identityId: "The ID of the identity to update the membership for.", - roles: "A list of roles to update the membership to." - }, - DELETE_IDENTITY_MEMBERSHIP: { - projectId: "The ID of the project to delete the identity membership from.", - identityId: "The ID of the identity to delete the membership from." - }, GET_KEY: { workspaceId: "The ID of the project to get the key from." }, @@ -213,6 +183,42 @@ export const PROJECTS = { } } as const; +export const PROJECT_USERS = { + INVITE_MEMBER: { + projectId: "The ID of the project to invite the member to.", + emails: "A list of organization member emails to invite to the project.", + usernames: "A list of usernames to invite to the project." + }, + REMOVE_MEMBER: { + projectId: "The ID of the project to remove the member from.", + emails: "A list of organization member emails to remove from the project.", + usernames: "A list of usernames to remove from the project." + }, + GET_USER_MEMBERSHIPS: { + workspaceId: "The ID of the project to get memberships from." + }, + UPDATE_USER_MEMBERSHIP: { + workspaceId: "The ID of the project to update the membership for.", + membershipId: "The ID of the membership to update.", + roles: "A list of roles to update the membership to." + } +}; + +export const PROJECT_IDENTITIES = { + LIST_IDENTITY_MEMBERSHIPS: { + projectId: "The ID of the project to get identity memberships from." + }, + UPDATE_IDENTITY_MEMBERSHIP: { + projectId: "The ID of the project to update the identity membership for.", + identityId: "The ID of the identity to update the membership for.", + roles: "A list of roles to update the membership to." + }, + DELETE_IDENTITY_MEMBERSHIP: { + projectId: "The ID of the project to delete the identity membership from.", + identityId: "The ID of the identity to delete the membership from." + } +}; + export const ENVIRONMENTS = { CREATE: { workspaceId: "The ID of the project to create the environment in.", diff --git a/backend/src/server/routes/v1/project-membership-router.ts b/backend/src/server/routes/v1/project-membership-router.ts index d2ed649db..001775d96 100644 --- a/backend/src/server/routes/v1/project-membership-router.ts +++ b/backend/src/server/routes/v1/project-membership-router.ts @@ -9,7 +9,7 @@ import { UsersSchema } from "@app/db/schemas"; import { EventType } from "@app/ee/services/audit-log/audit-log-types"; -import { PROJECTS } from "@app/lib/api-docs"; +import { PROJECT_USERS } from "@app/lib/api-docs"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; @@ -30,7 +30,7 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider } ], params: z.object({ - workspaceId: z.string().trim().describe(PROJECTS.GET_USER_MEMBERSHIPS.workspaceId) + workspaceId: z.string().trim().describe(PROJECT_USERS.GET_USER_MEMBERSHIPS.workspaceId) }), response: { 200: z.object({ @@ -142,8 +142,8 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider } ], params: z.object({ - workspaceId: z.string().trim().describe(PROJECTS.UPDATE_USER_MEMBERSHIP.workspaceId), - membershipId: z.string().trim().describe(PROJECTS.UPDATE_USER_MEMBERSHIP.membershipId) + workspaceId: z.string().trim().describe(PROJECT_USERS.UPDATE_USER_MEMBERSHIP.workspaceId), + membershipId: z.string().trim().describe(PROJECT_USERS.UPDATE_USER_MEMBERSHIP.membershipId) }), body: z.object({ roles: z @@ -164,7 +164,7 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider ) .min(1) .refine((data) => data.some(({ isTemporary }) => !isTemporary), "At least one long lived role is required") - .describe(PROJECTS.UPDATE_USER_MEMBERSHIP.roles) + .describe(PROJECT_USERS.UPDATE_USER_MEMBERSHIP.roles) }), response: { 200: z.object({ diff --git a/backend/src/server/routes/v2/identity-project-router.ts b/backend/src/server/routes/v2/identity-project-router.ts index a4068053f..476b09343 100644 --- a/backend/src/server/routes/v2/identity-project-router.ts +++ b/backend/src/server/routes/v2/identity-project-router.ts @@ -7,7 +7,7 @@ import { ProjectMembershipRole, ProjectUserMembershipRolesSchema } from "@app/db/schemas"; -import { PROJECTS } from "@app/lib/api-docs"; +import { PROJECT_IDENTITIES } from "@app/lib/api-docs"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; @@ -64,8 +64,8 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) } ], params: z.object({ - projectId: z.string().trim().describe(PROJECTS.UPDATE_IDENTITY_MEMBERSHIP.projectId), - identityId: z.string().trim().describe(PROJECTS.UPDATE_IDENTITY_MEMBERSHIP.identityId) + projectId: z.string().trim().describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.projectId), + identityId: z.string().trim().describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.identityId) }), body: z.object({ roles: z @@ -85,7 +85,7 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) ]) ) .min(1) - .describe(PROJECTS.UPDATE_IDENTITY_MEMBERSHIP.roles) + .describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles) }), response: { 200: z.object({ @@ -122,8 +122,8 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) } ], params: z.object({ - projectId: z.string().trim().describe(PROJECTS.DELETE_IDENTITY_MEMBERSHIP.projectId), - identityId: z.string().trim().describe(PROJECTS.DELETE_IDENTITY_MEMBERSHIP.identityId) + projectId: z.string().trim().describe(PROJECT_IDENTITIES.DELETE_IDENTITY_MEMBERSHIP.projectId), + identityId: z.string().trim().describe(PROJECT_IDENTITIES.DELETE_IDENTITY_MEMBERSHIP.identityId) }), response: { 200: z.object({ @@ -159,7 +159,7 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) } ], params: z.object({ - projectId: z.string().trim().describe(PROJECTS.LIST_IDENTITY_MEMBERSHIPS.projectId) + projectId: z.string().trim().describe(PROJECT_IDENTITIES.LIST_IDENTITY_MEMBERSHIPS.projectId) }), response: { 200: z.object({ diff --git a/backend/src/server/routes/v2/project-membership-router.ts b/backend/src/server/routes/v2/project-membership-router.ts index 96471dc2c..a9592faab 100644 --- a/backend/src/server/routes/v2/project-membership-router.ts +++ b/backend/src/server/routes/v2/project-membership-router.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { ProjectMembershipsSchema } from "@app/db/schemas"; import { EventType } from "@app/ee/services/audit-log/audit-log-types"; -import { PROJECTS } from "@app/lib/api-docs"; +import { PROJECT_USERS } from "@app/lib/api-docs"; import { writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; @@ -22,11 +22,11 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider } ], params: z.object({ - projectId: z.string().describe(PROJECTS.INVITE_MEMBER.projectId) + projectId: z.string().describe(PROJECT_USERS.INVITE_MEMBER.projectId) }), body: z.object({ - emails: z.string().email().array().default([]).describe(PROJECTS.INVITE_MEMBER.emails), - usernames: z.string().array().default([]).describe(PROJECTS.INVITE_MEMBER.usernames) + emails: z.string().email().array().default([]).describe(PROJECT_USERS.INVITE_MEMBER.emails), + usernames: z.string().array().default([]).describe(PROJECT_USERS.INVITE_MEMBER.usernames) }), response: { 200: z.object({ @@ -77,11 +77,11 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider } ], params: z.object({ - projectId: z.string().describe(PROJECTS.REMOVE_MEMBER.projectId) + projectId: z.string().describe(PROJECT_USERS.REMOVE_MEMBER.projectId) }), body: z.object({ - emails: z.string().email().array().default([]).describe(PROJECTS.REMOVE_MEMBER.emails), - usernames: z.string().array().default([]).describe(PROJECTS.REMOVE_MEMBER.usernames) + emails: z.string().email().array().default([]).describe(PROJECT_USERS.REMOVE_MEMBER.emails), + usernames: z.string().array().default([]).describe(PROJECT_USERS.REMOVE_MEMBER.usernames) }), response: { 200: z.object({ From 21656a7ab650fe210e66bdd974342f923994e47d Mon Sep 17 00:00:00 2001 From: = Date: Fri, 17 May 2024 16:15:52 +0530 Subject: [PATCH 2/6] docs: seperate project user and identities api into seperate --- .../delete-identity-membership.mdx | 0 .../list-identity-memberships.mdx | 0 .../update-identity-membership.mdx | 0 .../delete-membership.mdx | 0 .../invite-member-to-workspace.mdx | 0 .../memberships.mdx | 0 .../remove-member-from-workspace.mdx | 0 .../update-membership.mdx | 0 docs/mint.json | 65 ++++++++++++++----- 9 files changed, 48 insertions(+), 17 deletions(-) rename docs/api-reference/endpoints/{workspaces => project-identities}/delete-identity-membership.mdx (100%) rename docs/api-reference/endpoints/{workspaces => project-identities}/list-identity-memberships.mdx (100%) rename docs/api-reference/endpoints/{workspaces => project-identities}/update-identity-membership.mdx (100%) rename docs/api-reference/endpoints/{workspaces => project-users}/delete-membership.mdx (100%) rename docs/api-reference/endpoints/{workspaces => project-users}/invite-member-to-workspace.mdx (100%) rename docs/api-reference/endpoints/{workspaces => project-users}/memberships.mdx (100%) rename docs/api-reference/endpoints/{workspaces => project-users}/remove-member-from-workspace.mdx (100%) rename docs/api-reference/endpoints/{workspaces => project-users}/update-membership.mdx (100%) diff --git a/docs/api-reference/endpoints/workspaces/delete-identity-membership.mdx b/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx similarity index 100% rename from docs/api-reference/endpoints/workspaces/delete-identity-membership.mdx rename to docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx diff --git a/docs/api-reference/endpoints/workspaces/list-identity-memberships.mdx b/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx similarity index 100% rename from docs/api-reference/endpoints/workspaces/list-identity-memberships.mdx rename to docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx diff --git a/docs/api-reference/endpoints/workspaces/update-identity-membership.mdx b/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx similarity index 100% rename from docs/api-reference/endpoints/workspaces/update-identity-membership.mdx rename to docs/api-reference/endpoints/project-identities/update-identity-membership.mdx diff --git a/docs/api-reference/endpoints/workspaces/delete-membership.mdx b/docs/api-reference/endpoints/project-users/delete-membership.mdx similarity index 100% rename from docs/api-reference/endpoints/workspaces/delete-membership.mdx rename to docs/api-reference/endpoints/project-users/delete-membership.mdx diff --git a/docs/api-reference/endpoints/workspaces/invite-member-to-workspace.mdx b/docs/api-reference/endpoints/project-users/invite-member-to-workspace.mdx similarity index 100% rename from docs/api-reference/endpoints/workspaces/invite-member-to-workspace.mdx rename to docs/api-reference/endpoints/project-users/invite-member-to-workspace.mdx diff --git a/docs/api-reference/endpoints/workspaces/memberships.mdx b/docs/api-reference/endpoints/project-users/memberships.mdx similarity index 100% rename from docs/api-reference/endpoints/workspaces/memberships.mdx rename to docs/api-reference/endpoints/project-users/memberships.mdx diff --git a/docs/api-reference/endpoints/workspaces/remove-member-from-workspace.mdx b/docs/api-reference/endpoints/project-users/remove-member-from-workspace.mdx similarity index 100% rename from docs/api-reference/endpoints/workspaces/remove-member-from-workspace.mdx rename to docs/api-reference/endpoints/project-users/remove-member-from-workspace.mdx diff --git a/docs/api-reference/endpoints/workspaces/update-membership.mdx b/docs/api-reference/endpoints/project-users/update-membership.mdx similarity index 100% rename from docs/api-reference/endpoints/workspaces/update-membership.mdx rename to docs/api-reference/endpoints/project-users/update-membership.mdx diff --git a/docs/mint.json b/docs/mint.json index 4a106a79c..f0ca7d1e9 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -32,7 +32,10 @@ "thumbsRating": true }, "api": { - "baseUrl": ["https://app.infisical.com", "http://localhost:8080"] + "baseUrl": [ + "https://app.infisical.com", + "http://localhost:8080" + ] }, "topbarLinks": [ { @@ -73,7 +76,9 @@ "documentation/getting-started/introduction", { "group": "Quickstart", - "pages": ["documentation/guides/local-development"] + "pages": [ + "documentation/guides/local-development" + ] }, { "group": "Guides", @@ -213,7 +218,9 @@ }, { "group": "Reference architectures", - "pages": ["self-hosting/reference-architectures/aws-ecs"] + "pages": [ + "self-hosting/reference-architectures/aws-ecs" + ] }, "self-hosting/ee", "self-hosting/faq" @@ -369,11 +376,15 @@ }, { "group": "Build Tool Integrations", - "pages": ["integrations/build-tools/gradle"] + "pages": [ + "integrations/build-tools/gradle" + ] }, { "group": "", - "pages": ["sdks/overview"] + "pages": [ + "sdks/overview" + ] }, { "group": "SDK's", @@ -391,7 +402,9 @@ "api-reference/overview/authentication", { "group": "Examples", - "pages": ["api-reference/overview/examples/integration"] + "pages": [ + "api-reference/overview/examples/integration" + ] } ] }, @@ -436,17 +449,27 @@ "api-reference/endpoints/workspaces/delete-workspace", "api-reference/endpoints/workspaces/get-workspace", "api-reference/endpoints/workspaces/update-workspace", - "api-reference/endpoints/workspaces/invite-member-to-workspace", - "api-reference/endpoints/workspaces/remove-member-from-workspace", - "api-reference/endpoints/workspaces/memberships", - "api-reference/endpoints/workspaces/update-membership", - "api-reference/endpoints/workspaces/list-identity-memberships", - "api-reference/endpoints/workspaces/update-identity-membership", - "api-reference/endpoints/workspaces/delete-identity-membership", "api-reference/endpoints/workspaces/secret-snapshots", "api-reference/endpoints/workspaces/rollback-snapshot" ] }, + { + "group": "Project Users", + "pages": [ + "api-reference/endpoints/project-users/invite-member-to-workspace", + "api-reference/endpoints/project-users/remove-member-from-workspace", + "api-reference/endpoints/project-users/memberships", + "api-reference/endpoints/project-users/update-membership" + ] + }, + { + "group": "Projects", + "pages": [ + "api-reference/endpoints/project-identities/list-identity-memberships", + "api-reference/endpoints/project-identities/update-identity-membership", + "api-reference/endpoints/project-identities/delete-identity-membership" + ] + }, { "group": "Environments", "pages": [ @@ -523,11 +546,15 @@ }, { "group": "Service Tokens", - "pages": ["api-reference/endpoints/service-tokens/get"] + "pages": [ + "api-reference/endpoints/service-tokens/get" + ] }, { "group": "Audit Logs", - "pages": ["api-reference/endpoints/audit-logs/export-audit-log"] + "pages": [ + "api-reference/endpoints/audit-logs/export-audit-log" + ] } ] }, @@ -543,7 +570,9 @@ }, { "group": "", - "pages": ["changelog/overview"] + "pages": [ + "changelog/overview" + ] }, { "group": "Contributing", @@ -567,7 +596,9 @@ }, { "group": "Contributing to SDK", - "pages": ["contributing/sdk/developing"] + "pages": [ + "contributing/sdk/developing" + ] } ] } From 56c2e1276014ba29def000d288a8ff7d311e519c Mon Sep 17 00:00:00 2001 From: = Date: Fri, 17 May 2024 17:09:35 +0530 Subject: [PATCH 3/6] feat: added create identity project membership to api reference and support for roles --- backend/src/lib/api-docs/constants.ts | 22 +++++- .../routes/v2/identity-project-router.ts | 71 ++++++++++++++++--- .../identity-project-service.ts | 69 +++++++++++++----- .../identity-project-types.ts | 14 +++- .../add-identity-membership.mdx | 4 ++ .../delete-identity-membership.mdx | 2 +- .../list-identity-memberships.mdx | 2 +- .../update-identity-membership.mdx | 2 +- docs/mint.json | 5 +- 9 files changed, 155 insertions(+), 36 deletions(-) create mode 100644 docs/api-reference/endpoints/project-identities/add-identity-membership.mdx diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 8e9cdf3bb..0638034de 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -211,11 +211,31 @@ export const PROJECT_IDENTITIES = { UPDATE_IDENTITY_MEMBERSHIP: { projectId: "The ID of the project to update the identity membership for.", identityId: "The ID of the identity to update the membership for.", - roles: "A list of roles to update the membership to." + roles: { + description: "A list of role slugs to assign to the identity project membership.", + role: "The role slug to assign to the newly created identity project membership.", + isTemporary: "Whether the assigned role is temporary.", + temporaryMode: "Type of temporary expiry.", + temporaryRange: "Expiry time for temporary access. In relative mode it could be 1s,2m,3h", + temporaryAccessStartTime: "Time to which the temporary access starts" + } }, DELETE_IDENTITY_MEMBERSHIP: { projectId: "The ID of the project to delete the identity membership from.", identityId: "The ID of the identity to delete the membership from." + }, + CREATE_IDENTITY_MEMBERSHIP: { + projectId: "The ID of the project to create the identity membership from.", + identityId: "The ID of the identity to create the membership from.", + role: "The role slug to assign to the newly created identity project membership.", + roles: { + description: "A list of role slugs to assign to the newly created identity project membership.", + role: "The role slug to assign to the newly created identity project membership.", + isTemporary: "Whether the assigned role is temporary.", + temporaryMode: "Type of temporary expiry.", + temporaryRange: "Expiry time for temporary access. In relative mode it could be 1s,2m,3h", + temporaryAccessStartTime: "Time to which the temporary access starts" + } } }; diff --git a/backend/src/server/routes/v2/identity-project-router.ts b/backend/src/server/routes/v2/identity-project-router.ts index 476b09343..00bb6a6cc 100644 --- a/backend/src/server/routes/v2/identity-project-router.ts +++ b/backend/src/server/routes/v2/identity-project-router.ts @@ -8,6 +8,7 @@ import { ProjectUserMembershipRolesSchema } from "@app/db/schemas"; import { PROJECT_IDENTITIES } from "@app/lib/api-docs"; +import { BadRequestError } from "@app/lib/errors"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; @@ -22,12 +23,48 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), schema: { + description: "Create project identity membership", + security: [ + { + bearerAuth: [] + } + ], params: z.object({ projectId: z.string().trim(), identityId: z.string().trim() }), body: z.object({ - role: z.string().trim().min(1).default(ProjectMembershipRole.NoAccess) + // @depreciated + role: z.string().trim().optional().default(ProjectMembershipRole.NoAccess), + roles: z + .array( + z.union([ + z.object({ + role: z.string().describe(PROJECT_IDENTITIES.CREATE_IDENTITY_MEMBERSHIP.roles.role), + isTemporary: z + .literal(false) + .default(false) + .describe(PROJECT_IDENTITIES.CREATE_IDENTITY_MEMBERSHIP.roles.role) + }), + z.object({ + role: z.string().describe(PROJECT_IDENTITIES.CREATE_IDENTITY_MEMBERSHIP.roles.role), + isTemporary: z.literal(true).describe(PROJECT_IDENTITIES.CREATE_IDENTITY_MEMBERSHIP.roles.role), + temporaryMode: z + .nativeEnum(ProjectUserMembershipTemporaryMode) + .describe(PROJECT_IDENTITIES.CREATE_IDENTITY_MEMBERSHIP.roles.role), + temporaryRange: z + .string() + .refine((val) => ms(val) > 0, "Temporary range must be a positive number") + .describe(PROJECT_IDENTITIES.CREATE_IDENTITY_MEMBERSHIP.roles.role), + temporaryAccessStartTime: z + .string() + .datetime() + .describe(PROJECT_IDENTITIES.CREATE_IDENTITY_MEMBERSHIP.roles.role) + }) + ]) + ) + .describe(PROJECT_IDENTITIES.CREATE_IDENTITY_MEMBERSHIP.roles.description) + .optional() }), response: { 200: z.object({ @@ -36,6 +73,9 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) } }, handler: async (req) => { + const { role, roles } = req.body; + if (!role && !roles) throw new BadRequestError({ message: "You must provide either role or roles field" }); + const identityMembership = await server.services.identityProject.createProjectIdentity({ actor: req.permission.type, actorId: req.permission.id, @@ -43,7 +83,7 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) actorOrgId: req.permission.orgId, identityId: req.params.identityId, projectId: req.params.projectId, - role: req.body.role + roles: roles || [{ role }] }); return { identityMembership }; } @@ -72,20 +112,31 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) .array( z.union([ z.object({ - role: z.string(), - isTemporary: z.literal(false).default(false) + role: z.string().describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.role), + isTemporary: z + .literal(false) + .default(false) + .describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.isTemporary) }), z.object({ - role: z.string(), - isTemporary: z.literal(true), - temporaryMode: z.nativeEnum(ProjectUserMembershipTemporaryMode), - temporaryRange: z.string().refine((val) => ms(val) > 0, "Temporary range must be a positive number"), - temporaryAccessStartTime: z.string().datetime() + role: z.string().describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.role), + isTemporary: z.literal(true).describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.isTemporary), + temporaryMode: z + .nativeEnum(ProjectUserMembershipTemporaryMode) + .describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.temporaryMode), + temporaryRange: z + .string() + .refine((val) => ms(val) > 0, "Temporary range must be a positive number") + .describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.temporaryRange), + temporaryAccessStartTime: z + .string() + .datetime() + .describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.temporaryAccessStartTime) }) ]) ) .min(1) - .describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles) + .describe(PROJECT_IDENTITIES.UPDATE_IDENTITY_MEMBERSHIP.roles.description) }), response: { 200: z.object({ diff --git a/backend/src/services/identity-project/identity-project-service.ts b/backend/src/services/identity-project/identity-project-service.ts index 13ecf8bbc..2494bfb0e 100644 --- a/backend/src/services/identity-project/identity-project-service.ts +++ b/backend/src/services/identity-project/identity-project-service.ts @@ -51,7 +51,7 @@ export const identityProjectServiceFactory = ({ actorOrgId, actorAuthMethod, projectId, - role + roles }: TCreateProjectIdentityDTO) => { const { permission } = await permissionService.getProjectPermission( actor, @@ -78,18 +78,33 @@ export const identityProjectServiceFactory = ({ message: `Failed to find identity with id ${identityId}` }); - const { permission: rolePermission, role: customRole } = await permissionService.getProjectPermissionByRole( - role, - project.id + for await (const { role: requestedRoleChange } of roles) { + const { permission: rolePermission } = await permissionService.getProjectPermissionByRole( + requestedRoleChange, + projectId + ); + + const hasRequiredPriviledges = isAtLeastAsPrivileged(permission, rolePermission); + + if (!hasRequiredPriviledges) { + throw new ForbiddenRequestError({ message: "Failed to change to a more privileged role" }); + } + } + + // validate custom roles input + const customInputRoles = roles.filter( + ({ role }) => !Object.values(ProjectMembershipRole).includes(role as ProjectMembershipRole) ); + const hasCustomRole = Boolean(customInputRoles.length); + const customRoles = hasCustomRole + ? await projectRoleDAL.find({ + projectId, + $in: { slug: customInputRoles.map(({ role }) => role) } + }) + : []; + if (customRoles.length !== customInputRoles.length) throw new BadRequestError({ message: "Custom role not found" }); - const hasPriviledge = isAtLeastAsPrivileged(permission, rolePermission); - if (!hasPriviledge) - throw new ForbiddenRequestError({ - message: "Failed to add identity to project with more privileged role" - }); - const isCustomRole = Boolean(customRole); - + const customRolesGroupBySlug = groupBy(customRoles, ({ slug }) => slug); const projectIdentity = await identityProjectDAL.transaction(async (tx) => { const identityProjectMembership = await identityProjectDAL.create( { @@ -98,16 +113,32 @@ export const identityProjectServiceFactory = ({ }, tx ); + const sanitizedProjectMembershipRoles = roles.map((inputRole) => { + const isCustomRole = Boolean(customRolesGroupBySlug?.[inputRole.role]?.[0]); + if (!inputRole.isTemporary) { + return { + projectMembershipId: identityProjectMembership.id, + role: isCustomRole ? ProjectMembershipRole.Custom : inputRole.role, + customRoleId: customRolesGroupBySlug[inputRole.role] ? customRolesGroupBySlug[inputRole.role][0].id : null + }; + } - await identityProjectMembershipRoleDAL.create( - { + // check cron or relative here later for now its just relative + const relativeTimeInMs = ms(inputRole.temporaryRange); + return { projectMembershipId: identityProjectMembership.id, - role: isCustomRole ? ProjectMembershipRole.Custom : role, - customRoleId: customRole?.id - }, - tx - ); - return identityProjectMembership; + role: isCustomRole ? ProjectMembershipRole.Custom : inputRole.role, + customRoleId: customRolesGroupBySlug[inputRole.role] ? customRolesGroupBySlug[inputRole.role][0].id : null, + isTemporary: true, + temporaryMode: ProjectUserMembershipTemporaryMode.Relative, + temporaryRange: inputRole.temporaryRange, + temporaryAccessStartTime: new Date(inputRole.temporaryAccessStartTime), + temporaryAccessEndTime: new Date(new Date(inputRole.temporaryAccessStartTime).getTime() + relativeTimeInMs) + }; + }); + + const identityRoles = await identityProjectMembershipRoleDAL.insertMany(sanitizedProjectMembershipRoles, tx); + return { ...identityProjectMembership, roles: identityRoles }; }); return projectIdentity; }; diff --git a/backend/src/services/identity-project/identity-project-types.ts b/backend/src/services/identity-project/identity-project-types.ts index 73e8ec246..adead31e3 100644 --- a/backend/src/services/identity-project/identity-project-types.ts +++ b/backend/src/services/identity-project/identity-project-types.ts @@ -4,7 +4,19 @@ import { ProjectUserMembershipTemporaryMode } from "../project-membership/projec export type TCreateProjectIdentityDTO = { identityId: string; - role: string; + roles: ( + | { + role: string; + isTemporary?: false; + } + | { + role: string; + isTemporary: true; + temporaryMode: ProjectUserMembershipTemporaryMode.Relative; + temporaryRange: string; + temporaryAccessStartTime: string; + } + )[]; } & TProjectPermission; export type TUpdateProjectIdentityDTO = { diff --git a/docs/api-reference/endpoints/project-identities/add-identity-membership.mdx b/docs/api-reference/endpoints/project-identities/add-identity-membership.mdx new file mode 100644 index 000000000..391e4b1c3 --- /dev/null +++ b/docs/api-reference/endpoints/project-identities/add-identity-membership.mdx @@ -0,0 +1,4 @@ +--- +title: "Add Identity Project Membership" +openapi: "POST /api/v2/workspace/{projectId}/identity-memberships/{identityId}" +--- diff --git a/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx b/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx index e2b266626..ba04ca884 100644 --- a/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx +++ b/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx @@ -1,4 +1,4 @@ --- -title: "Delete Identity Membership" +title: "Delete Project Identity Membership" openapi: "DELETE /api/v2/workspace/{projectId}/identity-memberships/{identityId}" --- diff --git a/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx b/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx index e5162e693..aeadaa5f5 100644 --- a/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx +++ b/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx @@ -1,4 +1,4 @@ --- -title: "List Identity Memberships" +title: "List Project Identity Memberships" openapi: "GET /api/v2/workspace/{projectId}/identity-memberships" --- diff --git a/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx b/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx index 667cf7eb3..f77e05f0a 100644 --- a/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx +++ b/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx @@ -1,4 +1,4 @@ --- -title: "Update Identity Membership" +title: "Update Project Identity Membership" openapi: "PATCH /api/v2/workspace/{projectId}/identity-memberships/{identityId}" --- diff --git a/docs/mint.json b/docs/mint.json index f0ca7d1e9..12d0b4978 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -1,6 +1,6 @@ { "name": "Infisical", - "openapi": "https://app.infisical.com/api/docs/json", + "openapi": "http://localhost:8080/api/docs/json", "logo": { "dark": "/logo/dark.svg", "light": "/logo/light.svg", @@ -463,8 +463,9 @@ ] }, { - "group": "Projects", + "group": "Project Identities", "pages": [ + "api-reference/endpoints/project-identities/add-identity-membership", "api-reference/endpoints/project-identities/list-identity-memberships", "api-reference/endpoints/project-identities/update-identity-membership", "api-reference/endpoints/project-identities/delete-identity-membership" From 84724e5f65d65d099e5d4686b75568440543418f Mon Sep 17 00:00:00 2001 From: = Date: Fri, 17 May 2024 20:45:31 +0530 Subject: [PATCH 4/6] feat: added endpoints to fetch a particule project user membership and identity --- backend/src/lib/api-docs/constants.ts | 8 +++ .../routes/v1/project-membership-router.ts | 60 +++++++++++++++++++ .../routes/v2/identity-project-router.ts | 57 ++++++++++++++++++ .../identity-project/identity-project-dal.ts | 7 ++- .../identity-project-service.ts | 26 +++++++- .../identity-project-types.ts | 4 ++ .../project-membership-dal.ts | 10 +++- .../project-membership-service.ts | 24 ++++++++ .../project-membership-types.ts | 4 ++ 9 files changed, 197 insertions(+), 3 deletions(-) diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 0638034de..51f7a822e 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -197,6 +197,10 @@ export const PROJECT_USERS = { GET_USER_MEMBERSHIPS: { workspaceId: "The ID of the project to get memberships from." }, + GET_USER_MEMBERSHIP: { + workspaceId: "The ID of the project to get memberships from.", + username: "The username to get project membership of. Email is the default username." + }, UPDATE_USER_MEMBERSHIP: { workspaceId: "The ID of the project to update the membership for.", membershipId: "The ID of the membership to update.", @@ -208,6 +212,10 @@ export const PROJECT_IDENTITIES = { LIST_IDENTITY_MEMBERSHIPS: { projectId: "The ID of the project to get identity memberships from." }, + GET_IDENTITY_MEMBERSHIP_BY_ID: { + identityId: "The ID of the identity to get the membership for.", + projectId: "The ID of the project to get the identity membership for." + }, UPDATE_IDENTITY_MEMBERSHIP: { projectId: "The ID of the project to update the identity membership for.", identityId: "The ID of the identity to update the membership for.", diff --git a/backend/src/server/routes/v1/project-membership-router.ts b/backend/src/server/routes/v1/project-membership-router.ts index 001775d96..6bbb8d7ef 100644 --- a/backend/src/server/routes/v1/project-membership-router.ts +++ b/backend/src/server/routes/v1/project-membership-router.ts @@ -74,6 +74,66 @@ export const registerProjectMembershipRouter = async (server: FastifyZodProvider } }); + server.route({ + method: "POST", + url: "/:workspaceId/memberships/details", + config: { + rateLimit: readLimit + }, + schema: { + description: "Return project user memberships", + security: [ + { + bearerAuth: [] + } + ], + params: z.object({ + workspaceId: z.string().min(1).trim().describe(PROJECT_USERS.GET_USER_MEMBERSHIP.workspaceId) + }), + body: z.object({ + username: z.string().min(1).trim().describe(PROJECT_USERS.GET_USER_MEMBERSHIP.username) + }), + response: { + 200: z.object({ + membership: ProjectMembershipsSchema.extend({ + user: UsersSchema.pick({ + email: true, + firstName: true, + lastName: true, + id: true + }).merge(UserEncryptionKeysSchema.pick({ publicKey: true })), + roles: z.array( + z.object({ + id: z.string(), + role: z.string(), + customRoleId: z.string().optional().nullable(), + customRoleName: z.string().optional().nullable(), + customRoleSlug: z.string().optional().nullable(), + isTemporary: z.boolean(), + temporaryMode: z.string().optional().nullable(), + temporaryRange: z.string().nullable().optional(), + temporaryAccessStartTime: z.date().nullable().optional(), + temporaryAccessEndTime: z.date().nullable().optional() + }) + ) + }).omit({ createdAt: true, updatedAt: true }) + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.API_KEY, AuthMode.IDENTITY_ACCESS_TOKEN]), + handler: async (req) => { + const membership = await server.services.projectMembership.getProjectMembershipByUsername({ + actorId: req.permission.id, + actor: req.permission.type, + actorAuthMethod: req.permission.authMethod, + actorOrgId: req.permission.orgId, + projectId: req.params.workspaceId, + username: req.body.username + }); + return { membership }; + } + }); + server.route({ method: "POST", url: "/:workspaceId/memberships", diff --git a/backend/src/server/routes/v2/identity-project-router.ts b/backend/src/server/routes/v2/identity-project-router.ts index 00bb6a6cc..d259a46fd 100644 --- a/backend/src/server/routes/v2/identity-project-router.ts +++ b/backend/src/server/routes/v2/identity-project-router.ts @@ -251,4 +251,61 @@ export const registerIdentityProjectRouter = async (server: FastifyZodProvider) return { identityMemberships }; } }); + + server.route({ + method: "GET", + url: "/:projectId/identity-memberships/:identityId", + config: { + rateLimit: readLimit + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + schema: { + description: "Return project identity membership", + security: [ + { + bearerAuth: [] + } + ], + params: z.object({ + projectId: z.string().trim().describe(PROJECT_IDENTITIES.GET_IDENTITY_MEMBERSHIP_BY_ID.projectId), + identityId: z.string().trim().describe(PROJECT_IDENTITIES.GET_IDENTITY_MEMBERSHIP_BY_ID.identityId) + }), + response: { + 200: z.object({ + identityMembership: z.object({ + id: z.string(), + identityId: z.string(), + createdAt: z.date(), + updatedAt: z.date(), + roles: z.array( + z.object({ + id: z.string(), + role: z.string(), + customRoleId: z.string().optional().nullable(), + customRoleName: z.string().optional().nullable(), + customRoleSlug: z.string().optional().nullable(), + isTemporary: z.boolean(), + temporaryMode: z.string().optional().nullable(), + temporaryRange: z.string().nullable().optional(), + temporaryAccessStartTime: z.date().nullable().optional(), + temporaryAccessEndTime: z.date().nullable().optional() + }) + ), + identity: IdentitiesSchema.pick({ name: true, id: true, authMethod: true }) + }) + }) + } + }, + handler: async (req) => { + const identityMembership = await server.services.identityProject.getProjectIdentityByIdentityId({ + actor: req.permission.type, + actorId: req.permission.id, + actorAuthMethod: req.permission.authMethod, + actorOrgId: req.permission.orgId, + projectId: req.params.projectId, + identityId: req.params.identityId + }); + return { identityMembership }; + } + }); }; diff --git a/backend/src/services/identity-project/identity-project-dal.ts b/backend/src/services/identity-project/identity-project-dal.ts index e932d2068..c1cfe79cc 100644 --- a/backend/src/services/identity-project/identity-project-dal.ts +++ b/backend/src/services/identity-project/identity-project-dal.ts @@ -10,11 +10,16 @@ export type TIdentityProjectDALFactory = ReturnType { const identityProjectOrm = ormify(db, TableName.IdentityProjectMembership); - const findByProjectId = async (projectId: string, tx?: Knex) => { + const findByProjectId = async (projectId: string, filter: { identityId?: string } = {}, tx?: Knex) => { try { const docs = await (tx || db)(TableName.IdentityProjectMembership) .where(`${TableName.IdentityProjectMembership}.projectId`, projectId) .join(TableName.Identity, `${TableName.IdentityProjectMembership}.identityId`, `${TableName.Identity}.id`) + .where((qb) => { + if (filter.identityId) { + void qb.where("identityId", filter.identityId); + } + }) .join( TableName.IdentityProjectMembershipRole, `${TableName.IdentityProjectMembershipRole}.projectMembershipId`, diff --git a/backend/src/services/identity-project/identity-project-service.ts b/backend/src/services/identity-project/identity-project-service.ts index 2494bfb0e..fb5dc6fb0 100644 --- a/backend/src/services/identity-project/identity-project-service.ts +++ b/backend/src/services/identity-project/identity-project-service.ts @@ -18,6 +18,7 @@ import { TIdentityProjectMembershipRoleDALFactory } from "./identity-project-mem import { TCreateProjectIdentityDTO, TDeleteProjectIdentityDTO, + TGetProjectIdentityByIdentityIdDTO, TListProjectIdentityDTO, TUpdateProjectIdentityDTO } from "./identity-project-types"; @@ -282,10 +283,33 @@ export const identityProjectServiceFactory = ({ return identityMemberships; }; + const getProjectIdentityByIdentityId = async ({ + projectId, + actor, + actorId, + actorAuthMethod, + actorOrgId, + identityId + }: TGetProjectIdentityByIdentityIdDTO) => { + const { permission } = await permissionService.getProjectPermission( + actor, + actorId, + projectId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.Identity); + + const [identityMembership] = await identityProjectDAL.findByProjectId(projectId, { identityId }); + if (!identityMembership) throw new BadRequestError({ message: `Membership not found for identity ${identityId}` }); + return identityMembership; + }; + return { createProjectIdentity, updateProjectIdentity, deleteProjectIdentity, - listProjectIdentities + listProjectIdentities, + getProjectIdentityByIdentityId }; }; diff --git a/backend/src/services/identity-project/identity-project-types.ts b/backend/src/services/identity-project/identity-project-types.ts index adead31e3..43c671e50 100644 --- a/backend/src/services/identity-project/identity-project-types.ts +++ b/backend/src/services/identity-project/identity-project-types.ts @@ -41,3 +41,7 @@ export type TDeleteProjectIdentityDTO = { } & TProjectPermission; export type TListProjectIdentityDTO = TProjectPermission; + +export type TGetProjectIdentityByIdentityIdDTO = { + identityId: string; +} & TProjectPermission; diff --git a/backend/src/services/project-membership/project-membership-dal.ts b/backend/src/services/project-membership/project-membership-dal.ts index 8faab487e..f8acc10d8 100644 --- a/backend/src/services/project-membership/project-membership-dal.ts +++ b/backend/src/services/project-membership/project-membership-dal.ts @@ -9,11 +9,19 @@ export const projectMembershipDALFactory = (db: TDbClient) => { const projectMemberOrm = ormify(db, TableName.ProjectMembership); // special query - const findAllProjectMembers = async (projectId: string) => { + const findAllProjectMembers = async (projectId: string, filter: { usernames?: string[]; username?: string } = {}) => { try { const docs = await db(TableName.ProjectMembership) .where({ [`${TableName.ProjectMembership}.projectId` as "projectId"]: projectId }) .join(TableName.Users, `${TableName.ProjectMembership}.userId`, `${TableName.Users}.id`) + .where((qb) => { + if (filter.usernames) { + void qb.whereIn("username", filter.usernames); + } + if (filter.username) { + void qb.where("username", filter.username); + } + }) .join( TableName.UserEncryptionKey, `${TableName.UserEncryptionKey}.userId`, diff --git a/backend/src/services/project-membership/project-membership-service.ts b/backend/src/services/project-membership/project-membership-service.ts index e12114fef..a6682465f 100644 --- a/backend/src/services/project-membership/project-membership-service.ts +++ b/backend/src/services/project-membership/project-membership-service.ts @@ -34,6 +34,7 @@ import { TAddUsersToWorkspaceNonE2EEDTO, TDeleteProjectMembershipOldDTO, TDeleteProjectMembershipsDTO, + TGetProjectMembershipByUsernameDTO, TGetProjectMembershipDTO, TUpdateProjectMembershipDTO } from "./project-membership-types"; @@ -89,6 +90,28 @@ export const projectMembershipServiceFactory = ({ return projectMembershipDAL.findAllProjectMembers(projectId); }; + const getProjectMembershipByUsername = async ({ + actorId, + actor, + actorOrgId, + actorAuthMethod, + projectId, + username + }: TGetProjectMembershipByUsernameDTO) => { + const { permission } = await permissionService.getProjectPermission( + actor, + actorId, + projectId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.Member); + + const [membership] = await projectMembershipDAL.findAllProjectMembers(projectId, { username }); + if (!membership) throw new BadRequestError({ message: `Project membership not found for user ${username}` }); + return membership; + }; + const addUsersToProject = async ({ projectId, actorId, @@ -510,6 +533,7 @@ export const projectMembershipServiceFactory = ({ return { getProjectMemberships, + getProjectMembershipByUsername, updateProjectMembership, addUsersToProjectNonE2EE, deleteProjectMemberships, diff --git a/backend/src/services/project-membership/project-membership-types.ts b/backend/src/services/project-membership/project-membership-types.ts index 2ba245c8c..1eab75265 100644 --- a/backend/src/services/project-membership/project-membership-types.ts +++ b/backend/src/services/project-membership/project-membership-types.ts @@ -9,6 +9,10 @@ export type TInviteUserToProjectDTO = { emails: string[]; } & TProjectPermission; +export type TGetProjectMembershipByUsernameDTO = { + username: string; +} & TProjectPermission; + export type TUpdateProjectMembershipDTO = { membershipId: string; roles: ( From ce4cb39a2da01d2b27417a351c28bba7e62e848c Mon Sep 17 00:00:00 2001 From: = Date: Fri, 17 May 2024 20:49:58 +0530 Subject: [PATCH 5/6] docs: added doc for new endpoints of getting membership and some title change --- .../endpoints/project-identities/add-identity-membership.mdx | 2 +- .../project-identities/delete-identity-membership.mdx | 2 +- docs/api-reference/endpoints/project-identities/get-by-id.mdx | 4 ++++ .../project-identities/list-identity-memberships.mdx | 2 +- .../project-identities/update-identity-membership.mdx | 2 +- .../api-reference/endpoints/project-users/get-by-username.mdx | 4 ++++ .../endpoints/project-users/invite-member-to-workspace.mdx | 2 +- docs/mint.json | 4 +++- 8 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 docs/api-reference/endpoints/project-identities/get-by-id.mdx create mode 100644 docs/api-reference/endpoints/project-users/get-by-username.mdx diff --git a/docs/api-reference/endpoints/project-identities/add-identity-membership.mdx b/docs/api-reference/endpoints/project-identities/add-identity-membership.mdx index 391e4b1c3..285b1d1c4 100644 --- a/docs/api-reference/endpoints/project-identities/add-identity-membership.mdx +++ b/docs/api-reference/endpoints/project-identities/add-identity-membership.mdx @@ -1,4 +1,4 @@ --- -title: "Add Identity Project Membership" +title: "Create Identity Membership" openapi: "POST /api/v2/workspace/{projectId}/identity-memberships/{identityId}" --- diff --git a/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx b/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx index ba04ca884..e2b266626 100644 --- a/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx +++ b/docs/api-reference/endpoints/project-identities/delete-identity-membership.mdx @@ -1,4 +1,4 @@ --- -title: "Delete Project Identity Membership" +title: "Delete Identity Membership" openapi: "DELETE /api/v2/workspace/{projectId}/identity-memberships/{identityId}" --- diff --git a/docs/api-reference/endpoints/project-identities/get-by-id.mdx b/docs/api-reference/endpoints/project-identities/get-by-id.mdx new file mode 100644 index 000000000..04211e837 --- /dev/null +++ b/docs/api-reference/endpoints/project-identities/get-by-id.mdx @@ -0,0 +1,4 @@ +--- +title: "Get By Identity Id" +openapi: "GET /api/v2/workspace/{projectId}/identity-memberships/{identityId}" +--- diff --git a/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx b/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx index aeadaa5f5..e5162e693 100644 --- a/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx +++ b/docs/api-reference/endpoints/project-identities/list-identity-memberships.mdx @@ -1,4 +1,4 @@ --- -title: "List Project Identity Memberships" +title: "List Identity Memberships" openapi: "GET /api/v2/workspace/{projectId}/identity-memberships" --- diff --git a/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx b/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx index f77e05f0a..667cf7eb3 100644 --- a/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx +++ b/docs/api-reference/endpoints/project-identities/update-identity-membership.mdx @@ -1,4 +1,4 @@ --- -title: "Update Project Identity Membership" +title: "Update Identity Membership" openapi: "PATCH /api/v2/workspace/{projectId}/identity-memberships/{identityId}" --- diff --git a/docs/api-reference/endpoints/project-users/get-by-username.mdx b/docs/api-reference/endpoints/project-users/get-by-username.mdx new file mode 100644 index 000000000..ec69d4947 --- /dev/null +++ b/docs/api-reference/endpoints/project-users/get-by-username.mdx @@ -0,0 +1,4 @@ +--- +title: "Get By Username" +openapi: "POST /api/v1/workspace/{workspaceId}/memberships/details" +--- diff --git a/docs/api-reference/endpoints/project-users/invite-member-to-workspace.mdx b/docs/api-reference/endpoints/project-users/invite-member-to-workspace.mdx index a09c586ca..28acd3336 100644 --- a/docs/api-reference/endpoints/project-users/invite-member-to-workspace.mdx +++ b/docs/api-reference/endpoints/project-users/invite-member-to-workspace.mdx @@ -1,4 +1,4 @@ --- title: "Invite Member" openapi: "POST /api/v2/workspace/{projectId}/memberships" ---- \ No newline at end of file +--- diff --git a/docs/mint.json b/docs/mint.json index 12d0b4978..7076e3ae9 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -1,6 +1,6 @@ { "name": "Infisical", - "openapi": "http://localhost:8080/api/docs/json", + "openapi": "https://app.infisical.com/api/docs/json", "logo": { "dark": "/logo/dark.svg", "light": "/logo/light.svg", @@ -459,6 +459,7 @@ "api-reference/endpoints/project-users/invite-member-to-workspace", "api-reference/endpoints/project-users/remove-member-from-workspace", "api-reference/endpoints/project-users/memberships", + "api-reference/endpoints/project-users/get-by-username", "api-reference/endpoints/project-users/update-membership" ] }, @@ -467,6 +468,7 @@ "pages": [ "api-reference/endpoints/project-identities/add-identity-membership", "api-reference/endpoints/project-identities/list-identity-memberships", + "api-reference/endpoints/project-identities/get-by-id", "api-reference/endpoints/project-identities/update-identity-membership", "api-reference/endpoints/project-identities/delete-identity-membership" ] From ddf6db5a7e27d86f4d9ff38d6545c863bcda5654 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Sun, 19 May 2024 14:19:42 -0400 Subject: [PATCH 6/6] small rephrase --- docs/api-reference/endpoints/project-identities/get-by-id.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-reference/endpoints/project-identities/get-by-id.mdx b/docs/api-reference/endpoints/project-identities/get-by-id.mdx index 04211e837..37f4192d7 100644 --- a/docs/api-reference/endpoints/project-identities/get-by-id.mdx +++ b/docs/api-reference/endpoints/project-identities/get-by-id.mdx @@ -1,4 +1,4 @@ --- -title: "Get By Identity Id" +title: "Get Identity by ID" openapi: "GET /api/v2/workspace/{projectId}/identity-memberships/{identityId}" ---