From 4c1e2ae64afabdd65c93d6c78af0e07052ccae98 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Fri, 18 Oct 2024 15:12:52 +0200 Subject: [PATCH] Use *Slug and *Id instead of ambiguous names --- integration-tests/testkit/flow.ts | 54 ++-- integration-tests/testkit/schema-policy.ts | 4 +- integration-tests/testkit/seed.ts | 166 +++++----- .../tests/api/app-deployments.spec.ts | 36 +-- .../tests/api/artifacts-cdn.spec.ts | 60 ++-- .../tests/api/oidc-integrations/crud.spec.ts | 22 +- .../tests/api/organization/crud.spec.ts | 16 +- .../tests/api/organization/transfer.spec.ts | 66 ++-- .../tests/api/policy/policy-access.spec.ts | 24 +- .../tests/api/policy/policy-crud.spec.ts | 36 +-- .../tests/api/project/crud.spec.ts | 34 +-- .../tests/api/rate-limit/emails.spec.ts | 2 +- .../tests/api/schema/check.spec.ts | 102 +++---- .../schema/composition-federation-2.spec.ts | 4 +- .../tests/api/schema/contracts-check.spec.ts | 66 ++-- .../tests/api/schema/delete.spec.ts | 4 +- .../api/schema/external-composition.spec.ts | 16 +- .../tests/api/schema/publish.spec.ts | 48 +-- .../tests/api/target/crud.spec.ts | 42 +-- .../tests/api/target/usage.spec.ts | 50 ++-- ...ve-forceLegacyCompositionInTargets.spec.ts | 6 +- .../api/src/modules/alerts/module.graphql.ts | 24 +- .../alerts/providers/alerts-manager.ts | 81 +++-- .../alerts/resolvers/Mutation/addAlert.ts | 8 +- .../resolvers/Mutation/addAlertChannel.ts | 8 +- .../resolvers/Mutation/deleteAlertChannels.ts | 6 +- .../alerts/resolvers/Mutation/deleteAlerts.ts | 2 +- .../billing/providers/billing.provider.ts | 8 +- .../resolvers/Mutation/downgradeToHobby.ts | 2 +- .../Mutation/generateStripePortalLink.ts | 2 +- .../resolvers/Mutation/updateOrgRateLimit.ts | 2 +- .../resolvers/Mutation/upgradeToPro.ts | 2 +- .../modules/billing/resolvers/Organization.ts | 2 +- .../modules/integrations/module.graphql.ts | 4 +- .../src/modules/operations/module.graphql.ts | 36 +-- .../modules/organization/module.graphql.ts | 56 ++-- .../providers/organization-manager.ts | 18 +- .../resolvers/Mutation/assignMemberRole.ts | 4 +- .../resolvers/Mutation/createOrganization.ts | 2 +- .../resolvers/Mutation/deleteMemberRole.ts | 2 +- .../resolvers/Mutation/deleteOrganization.ts | 4 +- .../Mutation/deleteOrganizationMember.ts | 2 +- .../Mutation/inviteToOrganizationByEmail.ts | 2 +- .../resolvers/Mutation/joinOrganization.ts | 2 +- .../resolvers/Mutation/leaveOrganization.ts | 2 +- .../Mutation/migrateUnassignedMembers.ts | 7 +- .../Mutation/requestOrganizationTransfer.ts | 6 +- .../resolvers/Mutation/updateMemberRole.ts | 2 +- .../updateOrganizationMemberAccess.ts | 8 +- .../Mutation/updateOrganizationSlug.ts | 2 +- .../resolvers/Query/myDefaultOrganization.ts | 12 +- .../api/src/modules/project/module.graphql.ts | 20 +- .../resolvers/Mutation/createProject.ts | 2 +- .../resolvers/Mutation/deleteProject.ts | 10 +- .../resolvers/Mutation/updateProjectSlug.ts | 4 +- .../api/src/modules/schema/module.graphql.ts | 46 +-- .../schema/providers/schema-manager.ts | 6 +- .../Mutation/updateSchemaVersionStatus.ts | 2 +- .../modules/shared/providers/id-translator.ts | 83 ++++- .../src/modules/shared/providers/storage.ts | 27 +- .../api/src/modules/support/module.graphql.ts | 4 +- .../api/src/modules/target/module.graphql.ts | 50 ++-- .../target/resolvers/Mutation/createTarget.ts | 18 +- .../target/resolvers/Mutation/deleteTarget.ts | 18 +- .../resolvers/Mutation/updateTargetSlug.ts | 18 +- .../updateTargetValidationSettings.ts | 4 +- .../api/src/modules/token/module.graphql.ts | 14 +- .../modules/token/providers/token-manager.ts | 17 +- .../modules/token/providers/token-storage.ts | 12 +- .../token/resolvers/Mutation/createToken.ts | 6 +- .../token/resolvers/Mutation/deleteTokens.ts | 16 +- .../usage-estimation/module.graphql.ts | 2 +- .../resolvers/Query/usageEstimation.ts | 2 +- packages/services/api/src/shared/helpers.ts | 26 -- packages/services/storage/src/index.ts | 26 +- .../storage/src/schema-change-model.ts | 18 +- .../app/src/components/admin/AdminStats.tsx | 2 +- .../src/components/layouts/organization.tsx | 20 +- .../app/src/components/layouts/project.tsx | 47 +-- .../web/app/src/components/layouts/target.tsx | 99 +++--- .../components/organization/Permissions.tsx | 6 +- .../app/src/components/organization/Usage.tsx | 4 +- .../billing/BillingPaymentMethod.tsx | 2 +- .../organization/members/invitations.tsx | 6 +- .../components/organization/members/list.tsx | 10 +- .../organization/members/migration.tsx | 10 +- .../components/organization/members/roles.tsx | 10 +- .../src/components/organization/stripe.tsx | 6 +- .../src/components/policy/policy-settings.tsx | 2 +- .../project/alerts/create-alert.tsx | 12 +- .../project/alerts/create-channel.tsx | 12 +- .../project/alerts/delete-alerts-button.tsx | 14 +- .../project/alerts/delete-channels-button.tsx | 14 +- .../components/project/migration-toast.tsx | 4 +- .../project/settings/external-composition.tsx | 28 +- .../project/settings/model-migration.tsx | 10 +- .../project/settings/native-composition.tsx | 14 +- .../src/components/target/explorer/common.tsx | 102 +++---- .../components/target/explorer/enum-type.tsx | 12 +- .../src/components/target/explorer/filter.tsx | 44 +-- .../target/explorer/super-graph-metadata.tsx | 36 +-- .../components/target/explorer/union-type.tsx | 6 +- .../components/target/history/MarkAsValid.tsx | 14 +- .../target/history/errors-and-changes.tsx | 48 +-- .../components/target/insights/Filters.tsx | 72 ++--- .../src/components/target/insights/List.tsx | 78 ++--- .../src/components/target/insights/Stats.tsx | 42 +-- .../laboratory/create-collection-modal.tsx | 24 +- .../laboratory/create-operation-modal.tsx | 30 +- .../laboratory/delete-collection-modal.tsx | 12 +- .../laboratory/delete-operation-modal.tsx | 12 +- .../laboratory/edit-operation-modal.tsx | 18 +- .../target/settings/cdn-access-tokens.tsx | 48 +-- .../target/settings/registry-access-token.tsx | 36 +-- .../target/settings/schema-contracts.tsx | 12 +- .../web/app/src/components/ui/query-error.tsx | 8 +- .../web/app/src/components/ui/user-menu.tsx | 10 +- .../app/src/components/v2/data-wrapper.tsx | 4 +- .../transfer-organization-ownership.tsx | 6 +- .../web/app/src/lib/access/organization.ts | 6 +- packages/web/app/src/lib/access/project.ts | 12 +- packages/web/app/src/lib/access/target.ts | 18 +- .../lib/hooks/laboratory/use-collections.ts | 12 +- .../hooks/laboratory/use-current-operation.ts | 12 +- .../use-operation-collections-plugin.tsx | 88 +++--- .../laboratory/use-sync-operation-state.ts | 12 +- packages/web/app/src/lib/urql-cache.ts | 16 +- packages/web/app/src/pages/index.tsx | 2 +- .../web/app/src/pages/organization-join.tsx | 4 +- .../app/src/pages/organization-members.tsx | 14 +- .../web/app/src/pages/organization-new.tsx | 2 +- .../web/app/src/pages/organization-policy.tsx | 16 +- .../app/src/pages/organization-settings.tsx | 52 ++-- .../organization-subscription-manage.tsx | 41 +-- .../src/pages/organization-subscription.tsx | 16 +- .../src/pages/organization-support-ticket.tsx | 26 +- .../app/src/pages/organization-support.tsx | 26 +- .../app/src/pages/organization-transfer.tsx | 11 +- packages/web/app/src/pages/organization.tsx | 18 +- packages/web/app/src/pages/project-alerts.tsx | 61 ++-- packages/web/app/src/pages/project-policy.tsx | 33 +- .../web/app/src/pages/project-settings.tsx | 73 +++-- packages/web/app/src/pages/project.tsx | 40 +-- .../web/app/src/pages/target-app-version.tsx | 68 +++-- packages/web/app/src/pages/target-apps.tsx | 86 +++--- .../app/src/pages/target-checks-single.tsx | 116 +++---- packages/web/app/src/pages/target-checks.tsx | 76 +++-- .../src/pages/target-explorer-deprecated.tsx | 72 +++-- .../app/src/pages/target-explorer-type.tsx | 64 ++-- .../app/src/pages/target-explorer-unused.tsx | 72 +++-- .../web/app/src/pages/target-explorer.tsx | 70 +++-- .../app/src/pages/target-history-version.tsx | 94 +++--- packages/web/app/src/pages/target-history.tsx | 82 ++--- .../app/src/pages/target-insights-client.tsx | 54 ++-- .../src/pages/target-insights-coordinate.tsx | 60 ++-- .../src/pages/target-insights-operation.tsx | 64 ++-- .../web/app/src/pages/target-insights.tsx | 70 +++-- .../web/app/src/pages/target-laboratory.tsx | 94 +++--- .../web/app/src/pages/target-settings.tsx | 283 +++++++++--------- packages/web/app/src/pages/target.tsx | 72 +++-- packages/web/app/src/router.tsx | 132 ++++---- packages/web/app/src/server/github.ts | 42 +-- packages/web/app/src/server/lab.ts | 25 +- packages/web/app/src/server/slack.ts | 20 +- pnpm-lock.yaml | 30 +- 165 files changed, 2624 insertions(+), 2366 deletions(-) diff --git a/integration-tests/testkit/flow.ts b/integration-tests/testkit/flow.ts index d413168bac..219eb73822 100644 --- a/integration-tests/testkit/flow.ts +++ b/integration-tests/testkit/flow.ts @@ -80,11 +80,11 @@ export function createOrganization(input: CreateOrganizationInput, authToken: st }); } -export function getOrganization(organizationId: string, authToken: string) { +export function getOrganization(organizationSlug: string, authToken: string) { return execute({ document: graphql(` - query getOrganization($organizationId: ID!) { - organization(selector: { organization: $organizationId }) { + query getOrganization($organizationSlug: String!) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id slug @@ -102,7 +102,7 @@ export function getOrganization(organizationId: string, authToken: string) { `), authToken, variables: { - organizationId, + organizationSlug, }, }); } @@ -140,7 +140,7 @@ export function updateOrganizationSlug(input: UpdateOrganizationSlugInput, authT ok { updatedOrganizationPayload { selector { - organization + organizationSlug } organization { id @@ -357,8 +357,8 @@ export function updateProjectSlug(input: UpdateProjectSlugInput, authToken: stri updateProjectSlug(input: $input) { ok { selector { - organization - project + organizationSlug + projectSlug } project { id @@ -432,9 +432,9 @@ export function updateTargetSlug(input: UpdateTargetSlugInput, authToken: string updateTargetSlug(input: $input) { ok { selector { - organization - project - target + organizationSlug + projectSlug + targetSlug } target { id @@ -926,9 +926,9 @@ export function readOperationsStats(input: OperationsStatsSelectorInput, token: export function readOperationBody( selector: { - organization: string; - project: string; - target: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; hash: string; }, token: string, @@ -947,9 +947,9 @@ export function readOperationBody( token, variables: { selector: { - organization: selector.organization, - project: selector.project, - target: selector.target, + organizationSlug: selector.organizationSlug, + projectSlug: selector.projectSlug, + targetSlug: selector.targetSlug, }, hash: selector.hash, }, @@ -1096,22 +1096,28 @@ export function fetchVersions(selector: TargetSelectorInput, first: number, toke export function compareToPreviousVersion( selector: { - organization: string; - project: string; - target: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; version: string; }, token: string, ) { return execute({ document: graphql(` - query SchemaCompareToPreviousVersionQuery( - $organization: ID! - $project: ID! - $target: ID! + query compareToPreviousVersion( + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $version: ID! ) { - target(selector: { organization: $organization, project: $project, target: $target }) { + target( + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } + ) { id schemaVersion(id: $version) { id diff --git a/integration-tests/testkit/schema-policy.ts b/integration-tests/testkit/schema-policy.ts index 10361755c1..fc9e71dd35 100644 --- a/integration-tests/testkit/schema-policy.ts +++ b/integration-tests/testkit/schema-policy.ts @@ -36,8 +36,8 @@ export const TargetCalculatedPolicy = graphql(` `); export const OrganizationAndProjectsWithSchemaPolicy = graphql(` - query OrganizationAndProjectsWithSchemaPolicy($organization: ID!) { - organization(selector: { organization: $organization }) { + query OrganizationAndProjectsWithSchemaPolicy($organization: String!) { + organization(selector: { organizationSlug: $organization }) { organization { id schemaPolicy { diff --git a/integration-tests/testkit/seed.ts b/integration-tests/testkit/seed.ts index 22c3cde915..50a6fcebe2 100644 --- a/integration-tests/testkit/seed.ts +++ b/integration-tests/testkit/seed.ts @@ -129,7 +129,7 @@ export function initSeed() { variables: { allowOverrides, selector: { - organization: organization.slug, + organizationSlug: organization.slug, }, policy, }, @@ -153,8 +153,8 @@ export function initSeed() { const inviteResult = await inviteToOrganization( { email, - organization: organization.slug, - role: roleId, + organizationSlug: organization.slug, + roleId, }, inviteToken, ).then(r => r.expectNoGraphQLErrors()); @@ -166,7 +166,7 @@ export function initSeed() { }, async members() { const membersResult = await getOrganizationMembers( - { organization: organization.slug }, + { organizationSlug: organization.slug }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -180,7 +180,7 @@ export function initSeed() { }, async projects() { const projectsResult = await getOrganizationProjects( - { organization: organization.slug }, + { organizationSlug: organization.slug }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -201,7 +201,7 @@ export function initSeed() { const useLegacyRegistryModels = options?.useLegacyRegistryModels === true; const projectResult = await createProject( { - organization: organization.slug, + organizationSlug: organization.slug, type: projectType, slug: generateUnique(), }, @@ -215,8 +215,8 @@ export function initSeed() { if (useLegacyRegistryModels) { await updateRegistryModel( { - organization: organization.slug, - project: projectResult.createProject.ok!.createdProject.slug, + organizationSlug: organization.slug, + projectSlug: projectResult.createProject.ok!.createdProject.slug, model: RegistryModel.Legacy, }, ownerToken, @@ -241,8 +241,8 @@ export function initSeed() { document: UpdateSchemaPolicyForProject, variables: { selector: { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, }, policy, }, @@ -254,10 +254,10 @@ export function initSeed() { async removeTokens(tokenIds: string[]) { return await deleteTokens( { - organization: organization.slug, - project: project.slug, - target: target.slug, - tokens: tokenIds, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, + tokenIds, }, ownerToken, ) @@ -281,9 +281,9 @@ export function initSeed() { description, }, selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: token, @@ -311,9 +311,9 @@ export function initSeed() { description, }, selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: token, @@ -333,9 +333,9 @@ export function initSeed() { variables: { id: collectionId, selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: token, @@ -362,9 +362,9 @@ export function initSeed() { variables: input.variables, }, selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: input.token || ownerToken, @@ -378,9 +378,9 @@ export function initSeed() { variables: { id: input.operationId, selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: input.token || ownerToken, @@ -409,9 +409,9 @@ export function initSeed() { variables: input.variables, }, selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: input.token || ownerToken, @@ -443,9 +443,9 @@ export function initSeed() { const tokenResult = await createToken( { name: generateUnique(), - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, organizationScopes: organizationScopes, projectScopes: projectScopes, targetScopes: targetScopes, @@ -462,9 +462,9 @@ export function initSeed() { async readOperationBody(hash: string) { const operationBodyResult = await readOperationBody( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, hash, }, secret, @@ -475,9 +475,9 @@ export function initSeed() { async readOperationsStats(from: string, to: string) { const statsResult = await readOperationsStats( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, period: { from, to, @@ -522,9 +522,9 @@ export function initSeed() { const result = await setTargetValidation( { enabled, - target: target.slug, - project: project.slug, - organization: organization.slug, + targetSlug: target.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, { token: secret, @@ -542,13 +542,13 @@ export function initSeed() { }) { const result = await updateTargetValidationSettings( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, excludedClients, percentage, period: 2, - targets: [target.id], + targetIds: [target.id], }, { token: secret, @@ -560,21 +560,21 @@ export function initSeed() { async fetchMetadataFromCDN() { return fetchMetadataFromCDN( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, secret, ); }, - async updateSchemaVersionStatus(version: string, valid: boolean) { + async updateSchemaVersionStatus(versionId: string, valid: boolean) { return await updateSchemaVersionStatus( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, valid, - version, + versionId, }, secret, ).then(r => r.expectNoGraphQLErrors()); @@ -582,9 +582,9 @@ export function initSeed() { async fetchSchemaFromCDN() { return fetchSchemaFromCDN( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, secret, ); @@ -592,9 +592,9 @@ export function initSeed() { async createCdnAccess() { const result = await createCdnAccess( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, secret, ).then(r => r.expectNoGraphQLErrors()); @@ -654,9 +654,9 @@ export function initSeed() { return ( await compareToPreviousVersion( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, version, }, secret, @@ -667,9 +667,9 @@ export function initSeed() { const result = await updateBaseSchema( { newBase, - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, secret, ).then(r => r.expectNoGraphQLErrors()); @@ -679,9 +679,9 @@ export function initSeed() { async fetchVersions(count: number) { const result = await fetchVersions( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, count, secret, @@ -703,9 +703,9 @@ export function initSeed() { async fetchSupergraph() { const supergraphResponse = await fetchSupergraphFromCDN( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, secret, ); @@ -728,7 +728,7 @@ export function initSeed() { const invitationResult = await inviteToOrganization( { - organization: organization.slug, + organizationSlug: organization.slug, email: memberEmail, }, inviteToken, @@ -769,9 +769,9 @@ export function initSeed() { ) { const memberRoleAssignmentResult = await assignMemberRole( { - organization: organization.slug, - user: input.userId, - role: input.roleId, + organizationSlug: organization.slug, + userId: input.userId, + roleId: input.roleId, }, options.useMemberToken ? memberToken : ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -790,8 +790,8 @@ export function initSeed() { ) { const memberRoleDeletionResult = await deleteMemberRole( { - organization: organization.slug, - role: roleId, + organizationSlug: organization.slug, + roleId, }, options.useMemberToken ? memberToken : ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -820,7 +820,7 @@ export function initSeed() { }); const memberRoleCreationResult = await createMemberRole( { - organization: organization.slug, + organizationSlug: organization.slug, name, description: 'some description', organizationAccessScopes: scopes.organization, @@ -875,8 +875,8 @@ export function initSeed() { ) { const memberRoleUpdateResult = await updateMemberRole( { - organization: organization.slug, - role: role.id, + organizationSlug: organization.slug, + roleId: role.id, name: role.name, description: role.description, organizationAccessScopes: scopes.organization, diff --git a/integration-tests/tests/api/app-deployments.spec.ts b/integration-tests/tests/api/app-deployments.spec.ts index d9b26d83f2..def3cec0d6 100644 --- a/integration-tests/tests/api/app-deployments.spec.ts +++ b/integration-tests/tests/api/app-deployments.spec.ts @@ -1524,9 +1524,9 @@ test('get app deployment documents via GraphQL API', async () => { document: GetPaginatedPersistedDocuments, variables: { targetSelector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, appDeploymentName: 'app-name', appDeploymentVersion: 'app-version', @@ -1641,9 +1641,9 @@ test('paginate app deployment documents via GraphQL API', async () => { document: GetPaginatedPersistedDocuments, variables: { targetSelector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, appDeploymentName: 'app-name', appDeploymentVersion: 'app-version', @@ -1674,9 +1674,9 @@ test('paginate app deployment documents via GraphQL API', async () => { document: GetPaginatedPersistedDocuments, variables: { targetSelector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, appDeploymentName: 'app-name', appDeploymentVersion: 'app-version', @@ -1708,9 +1708,9 @@ test('paginate app deployment documents via GraphQL API', async () => { document: GetPaginatedPersistedDocuments, variables: { targetSelector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, appDeploymentName: 'app-name', appDeploymentVersion: 'app-version', @@ -1814,9 +1814,9 @@ test('app deployment usage reporting', async () => { document: GetAppDeployment, variables: { targetSelector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, appDeploymentName: 'app-name', appDeploymentVersion: 'app-version', @@ -1867,9 +1867,9 @@ test('app deployment usage reporting', async () => { document: GetAppDeployment, variables: { targetSelector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, appDeploymentName: 'app-name', appDeploymentVersion: 'app-version', diff --git a/integration-tests/tests/api/artifacts-cdn.spec.ts b/integration-tests/tests/api/artifacts-cdn.spec.ts index 667294cdf2..486cb97008 100644 --- a/integration-tests/tests/api/artifacts-cdn.spec.ts +++ b/integration-tests/tests/api/artifacts-cdn.spec.ts @@ -485,9 +485,9 @@ describe('CDN token', () => { document: TargetCDNAccessTokensQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: token.secret, @@ -501,9 +501,9 @@ describe('CDN token', () => { document: TargetCDNAccessTokensQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, after: endCursor, }, @@ -518,9 +518,9 @@ describe('CDN token', () => { document: TargetCDNAccessTokensQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, after: endCursor, }, @@ -546,9 +546,9 @@ describe('CDN token', () => { document: TargetCDNAccessTokensQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, first: 2, }, @@ -564,9 +564,9 @@ describe('CDN token', () => { document: TargetCDNAccessTokensQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, first: 2, }, @@ -591,9 +591,9 @@ describe('CDN token', () => { document: TargetCDNAccessTokensQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, first: 1, }, @@ -606,9 +606,9 @@ describe('CDN token', () => { variables: { input: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, cdnAccessTokenId: paginatedResult.target!.cdnAccessTokens.edges[0].node.id, }, @@ -626,9 +626,9 @@ describe('CDN token', () => { document: TargetCDNAccessTokensQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, first: 1, }, @@ -651,9 +651,9 @@ describe('CDN token', () => { document: TargetCDNAccessTokensQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, first: 1, }, @@ -667,9 +667,9 @@ describe('CDN token', () => { variables: { input: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, cdnAccessTokenId: paginatedResult.target!.cdnAccessTokens.edges[0].node.id, }, diff --git a/integration-tests/tests/api/oidc-integrations/crud.spec.ts b/integration-tests/tests/api/oidc-integrations/crud.spec.ts index 2da9785229..1770bbb564 100644 --- a/integration-tests/tests/api/oidc-integrations/crud.spec.ts +++ b/integration-tests/tests/api/oidc-integrations/crud.spec.ts @@ -4,8 +4,8 @@ import { execute } from '../../../testkit/graphql'; import { initSeed } from '../../../testkit/seed'; const OrganizationWithOIDCIntegration = graphql(` - query OrganizationWithOIDCIntegration($organizationId: ID!) { - organization(selector: { organization: $organizationId }) { + query OrganizationWithOIDCIntegration($organizationSlug: String!) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id oidcIntegration { @@ -18,8 +18,8 @@ const OrganizationWithOIDCIntegration = graphql(` `); const OrganizationReadTest = graphql(` - query OrganizationReadTest($organizationId: ID!) { - organization(selector: { organization: $organizationId }) { + query OrganizationReadTest($organizationSlug: String!) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id } @@ -112,7 +112,7 @@ describe('create', () => { const refetchedOrg = await execute({ document: OrganizationWithOIDCIntegration, variables: { - organizationId: organization.slug, + organizationSlug: organization.slug, }, authToken: ownerToken, }).then(r => r.expectNoGraphQLErrors()); @@ -455,7 +455,7 @@ describe('delete', () => { let refetchedOrg = await execute({ document: OrganizationWithOIDCIntegration, variables: { - organizationId: organization.slug, + organizationSlug: organization.slug, }, authToken: ownerToken, }).then(r => r.expectNoGraphQLErrors()); @@ -494,7 +494,7 @@ describe('delete', () => { refetchedOrg = await execute({ document: OrganizationWithOIDCIntegration, variables: { - organizationId: organization.slug, + organizationSlug: organization.slug, }, authToken: ownerToken, }).then(r => r.expectNoGraphQLErrors()); @@ -800,7 +800,7 @@ describe('restrictions', () => { const refetchedOrg = await execute({ document: OrganizationWithOIDCIntegration, variables: { - organizationId: organization.slug, + organizationSlug: organization.slug, }, authToken: ownerToken, }).then(r => r.expectNoGraphQLErrors()); @@ -842,7 +842,7 @@ describe('restrictions', () => { const orgAfterOidc = await execute({ document: OrganizationWithOIDCIntegration, variables: { - organizationId: organization.slug, + organizationSlug: organization.slug, }, authToken: ownerToken, }).then(r => r.expectNoGraphQLErrors()); @@ -869,7 +869,7 @@ describe('restrictions', () => { const orgAfterDisablingOidcRestrictions = await execute({ document: OrganizationWithOIDCIntegration, variables: { - organizationId: organization.slug, + organizationSlug: organization.slug, }, authToken: ownerToken, }).then(r => r.expectNoGraphQLErrors()); @@ -924,7 +924,7 @@ describe('restrictions', () => { const readAccessCheck = await execute({ document: OrganizationReadTest, variables: { - organizationId: organization.slug, + organizationSlug: organization.slug, }, authToken: ownerToken, }).then(r => r.expectNoGraphQLErrors()); diff --git a/integration-tests/tests/api/organization/crud.spec.ts b/integration-tests/tests/api/organization/crud.spec.ts index 6ec90060fe..5581a49641 100644 --- a/integration-tests/tests/api/organization/crud.spec.ts +++ b/integration-tests/tests/api/organization/crud.spec.ts @@ -10,7 +10,7 @@ test.concurrent( const changeOrganizationSlugResult = await updateOrganizationSlug( { - organization: organization.slug, + organizationSlug: organization.slug, slug: organization.slug, }, ownerToken, @@ -21,7 +21,7 @@ test.concurrent( expect(changeOrganizationSlugResult.updateOrganizationSlug.error).toBeNull(); expect(result?.organization.name).toBe(organization.slug); expect(result?.organization.slug).toEqual(organization.slug); - expect(result?.selector.organization).toEqual(organization.slug); + expect(result?.selector.organizationSlug).toEqual(organization.slug); }, ); @@ -34,7 +34,7 @@ test.concurrent( const newSlug = randomUUID(); const changeOrganizationSlugResult = await updateOrganizationSlug( { - organization: organization.slug, + organizationSlug: organization.slug, slug: newSlug, }, ownerToken, @@ -45,7 +45,7 @@ test.concurrent( expect(changeOrganizationSlugResult.updateOrganizationSlug.error).toBeNull(); expect(result?.organization.name).toBe(newSlug); expect(result?.organization.slug).toEqual(newSlug); - expect(result?.selector.organization).toEqual(newSlug); + expect(result?.selector.organizationSlug).toEqual(newSlug); }, ); @@ -58,7 +58,7 @@ test.concurrent( const newSlug = randomUUID(); const changeOrganizationSlugResult = await updateOrganizationSlug( { - organization: organization.slug, + organizationSlug: organization.slug, slug: newSlug, }, ownerToken, @@ -71,7 +71,7 @@ test.concurrent( // We do it for legacy reasons, as some queries still use the name. expect(result?.organization.name).toBe(newSlug); expect(result?.organization.slug).toEqual(newSlug); - expect(result?.selector.organization).toEqual(newSlug); + expect(result?.selector.organizationSlug).toEqual(newSlug); }, ); @@ -84,7 +84,7 @@ test.concurrent( const newSlug = 'graphql'; const changeOrganizationSlugResult = await updateOrganizationSlug( { - organization: organization.slug, + organizationSlug: organization.slug, slug: newSlug, }, ownerToken, @@ -104,7 +104,7 @@ test.concurrent( const changeOrganizationSlugResult = await updateOrganizationSlug( { - organization: organization.slug, + organizationSlug: organization.slug, slug: anotherOrganization.slug, }, ownerToken, diff --git a/integration-tests/tests/api/organization/transfer.spec.ts b/integration-tests/tests/api/organization/transfer.spec.ts index ff5325becc..7a6e1e16bf 100644 --- a/integration-tests/tests/api/organization/transfer.spec.ts +++ b/integration-tests/tests/api/organization/transfer.spec.ts @@ -18,7 +18,7 @@ test.concurrent( const transferRequestResult = await getOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code: 'non-existing-code', }, ownerToken, @@ -37,8 +37,8 @@ test.concurrent( const transferRequestResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -57,8 +57,8 @@ test.concurrent( const errors = await requestOrganizationTransfer( { - organization: organization.slug, - user: orgMembers.find(u => u.user.email === ownerEmail)!.user.id, + organizationSlug: organization.slug, + userId: orgMembers.find(u => u.user.email === ownerEmail)!.user.id, }, memberToken, ).then(r => r.expectGraphQLErrors()); @@ -77,8 +77,8 @@ test.concurrent( const transferRequestResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, memberToken, ).then(r => r.expectNoGraphQLErrors()); @@ -96,8 +96,8 @@ test.concurrent( const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -112,7 +112,7 @@ test.concurrent( const errors = await getOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code, }, nonMemberToken, @@ -133,8 +133,8 @@ test.concurrent( const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -147,7 +147,7 @@ test.concurrent( const requestResult = await getOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code, }, lonelyMemberToken, @@ -163,8 +163,8 @@ test.concurrent('recipient should be able to access the transfer request', async const { member, memberToken } = await inviteAndJoinMember(); const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -177,7 +177,7 @@ test.concurrent('recipient should be able to access the transfer request', async const requestResult = await getOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code, }, memberToken, @@ -193,8 +193,8 @@ test.concurrent('recipient should be able to answer the ownership transfer', asy const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -207,7 +207,7 @@ test.concurrent('recipient should be able to answer the ownership transfer', asy const answerResult = await answerOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code, accept: true, }, @@ -227,8 +227,8 @@ test.concurrent( const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -241,7 +241,7 @@ test.concurrent( const answerResult = await answerOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code, accept: true, }, @@ -259,8 +259,8 @@ test.concurrent('owner should not be able to answer the ownership transfer', asy const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -273,7 +273,7 @@ test.concurrent('owner should not be able to answer the ownership transfer', asy const answerResult = await answerOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code, accept: true, }, @@ -292,8 +292,8 @@ test.concurrent( const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -307,7 +307,7 @@ test.concurrent( const { ownerToken: nonMemberToken } = await initSeed().createOwner(); const answerResult = await answerOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code, accept: true, }, @@ -327,8 +327,8 @@ test.concurrent( const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -376,8 +376,8 @@ test.concurrent( const requestTransferResult = await requestOrganizationTransfer( { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -390,7 +390,7 @@ test.concurrent( const answerResult = await answerOrganizationTransferRequest( { - organization: organization.slug, + organizationSlug: organization.slug, code, accept: true, }, diff --git a/integration-tests/tests/api/policy/policy-access.spec.ts b/integration-tests/tests/api/policy/policy-access.spec.ts index ccf849e194..d6560a67ad 100644 --- a/integration-tests/tests/api/policy/policy-access.spec.ts +++ b/integration-tests/tests/api/policy/policy-access.spec.ts @@ -39,9 +39,9 @@ describe('Policy Access', () => { document: query, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: memberToken, @@ -63,9 +63,9 @@ describe('Policy Access', () => { document: query, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: memberToken, @@ -107,8 +107,8 @@ describe('Policy Access', () => { document: query, variables: { selector: { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, }, }, authToken: memberToken, @@ -130,8 +130,8 @@ describe('Policy Access', () => { document: query, variables: { selector: { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, }, }, authToken: memberToken, @@ -173,7 +173,7 @@ describe('Policy Access', () => { document: query, variables: { selector: { - organization: organization.slug, + organizationSlug: organization.slug, }, }, authToken: memberToken, @@ -194,7 +194,7 @@ describe('Policy Access', () => { document: query, variables: { selector: { - organization: organization.slug, + organizationSlug: organization.slug, }, }, authToken: memberToken, diff --git a/integration-tests/tests/api/policy/policy-crud.spec.ts b/integration-tests/tests/api/policy/policy-crud.spec.ts index 09b68f361b..745a046921 100644 --- a/integration-tests/tests/api/policy/policy-crud.spec.ts +++ b/integration-tests/tests/api/policy/policy-crud.spec.ts @@ -25,9 +25,9 @@ describe('Policy CRUD', () => { document: TargetCalculatedPolicy, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: ownerToken, @@ -49,9 +49,9 @@ describe('Policy CRUD', () => { document: TargetCalculatedPolicy, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: ownerToken, @@ -76,9 +76,9 @@ describe('Policy CRUD', () => { document: TargetCalculatedPolicy, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: ownerToken, @@ -104,9 +104,9 @@ describe('Policy CRUD', () => { document: TargetCalculatedPolicy, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: ownerToken, @@ -151,9 +151,9 @@ describe('Policy CRUD', () => { document: TargetCalculatedPolicy, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: ownerToken, @@ -202,9 +202,9 @@ describe('Policy CRUD', () => { document: TargetCalculatedPolicy, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: ownerToken, diff --git a/integration-tests/tests/api/project/crud.spec.ts b/integration-tests/tests/api/project/crud.spec.ts index 80953310c4..2900058189 100644 --- a/integration-tests/tests/api/project/crud.spec.ts +++ b/integration-tests/tests/api/project/crud.spec.ts @@ -38,8 +38,8 @@ test.concurrent(`changing a project's slug should result changing its name`, asy const renameResult = await updateProjectSlug( { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, slug: 'bar', }, ownerToken, @@ -48,7 +48,7 @@ test.concurrent(`changing a project's slug should result changing its name`, asy expect(renameResult.updateProjectSlug.error).toBeNull(); expect(renameResult.updateProjectSlug.ok?.project.name).toBe('bar'); expect(renameResult.updateProjectSlug.ok?.project.slug).toBe('bar'); - expect(renameResult.updateProjectSlug.ok?.selector.project).toBe('bar'); + expect(renameResult.updateProjectSlug.ok?.selector.projectSlug).toBe('bar'); }); test.concurrent( @@ -60,8 +60,8 @@ test.concurrent( const renameResult = await updateProjectSlug( { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, slug: project.slug, }, ownerToken, @@ -70,7 +70,7 @@ test.concurrent( expect(renameResult.updateProjectSlug.error).toBeNull(); expect(renameResult.updateProjectSlug.ok?.project.name).toBe(project.slug); expect(renameResult.updateProjectSlug.ok?.project.slug).toBe(project.slug); - expect(renameResult.updateProjectSlug.ok?.selector.project).toBe(project.slug); + expect(renameResult.updateProjectSlug.ok?.selector.projectSlug).toBe(project.slug); }, ); @@ -84,8 +84,8 @@ test.concurrent( const renameResult = await updateProjectSlug( { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, slug: project2.slug, }, ownerToken, @@ -123,8 +123,8 @@ test.concurrent( const renameResult = await updateProjectSlug( { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, slug: project2.slug, }, ownerToken, @@ -133,7 +133,7 @@ test.concurrent( expect(renameResult.updateProjectSlug.error).toBeNull(); expect(renameResult.updateProjectSlug.ok?.project.name).toBe(project2.slug); expect(renameResult.updateProjectSlug.ok?.project.slug).toBe(project2.slug); - expect(renameResult.updateProjectSlug.ok?.selector.project).toBe(project2.slug); + expect(renameResult.updateProjectSlug.ok?.selector.projectSlug).toBe(project2.slug); }, ); @@ -146,8 +146,8 @@ test.concurrent( const renameResult = await updateProjectSlug( { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, slug: 'view', }, ownerToken, @@ -167,8 +167,8 @@ test.concurrent( const renameResult = await updateProjectSlug( { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, slug: 'new', }, ownerToken, @@ -188,8 +188,8 @@ test.concurrent( const renameResult = await updateProjectSlug( { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, slug: 'new', }, ownerToken, diff --git a/integration-tests/tests/api/rate-limit/emails.spec.ts b/integration-tests/tests/api/rate-limit/emails.spec.ts index e8346dbb73..e7800f8aca 100644 --- a/integration-tests/tests/api/rate-limit/emails.spec.ts +++ b/integration-tests/tests/api/rate-limit/emails.spec.ts @@ -24,7 +24,7 @@ test('rate limit approaching and reached for organization', async () => { await updateOrgRateLimit( { - organization: organization.slug, + organizationSlug: organization.slug, }, { operations: 11, diff --git a/integration-tests/tests/api/schema/check.spec.ts b/integration-tests/tests/api/schema/check.spec.ts index be3cdc5af8..eb507ac8ca 100644 --- a/integration-tests/tests/api/schema/check.spec.ts +++ b/integration-tests/tests/api/schema/check.spec.ts @@ -285,9 +285,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -372,9 +372,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -433,9 +433,9 @@ test.concurrent('failed check due to graphql validation is persisted', async ({ document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -522,9 +522,9 @@ test.concurrent('failed check due to breaking change is persisted', async ({ exp document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -619,9 +619,9 @@ test.concurrent('failed check due to policy error is persisted', async ({ expect document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -730,9 +730,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -856,9 +856,9 @@ test.concurrent('metadata is persisted', async ({ expect }) => { document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -944,9 +944,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, @@ -973,9 +973,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -1066,9 +1066,9 @@ test.concurrent('approve failed schema check with a comment', async ({ expect }) document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, comment: 'This is a comment', }, @@ -1096,9 +1096,9 @@ test.concurrent('approve failed schema check with a comment', async ({ expect }) document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -1184,9 +1184,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, @@ -1236,9 +1236,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: newSchemaCheckId, }, @@ -1334,9 +1334,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, @@ -1386,9 +1386,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: newSchemaCheckId, }, @@ -1478,9 +1478,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, @@ -1531,9 +1531,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: newSchemaCheckId, }, diff --git a/integration-tests/tests/api/schema/composition-federation-2.spec.ts b/integration-tests/tests/api/schema/composition-federation-2.spec.ts index a3442ed488..987a7bb30e 100644 --- a/integration-tests/tests/api/schema/composition-federation-2.spec.ts +++ b/integration-tests/tests/api/schema/composition-federation-2.spec.ts @@ -45,8 +45,8 @@ test.concurrent('call an external service to compose and validate services', asy endpoint: `http://${dockerAddress}/compose`, // eslint-disable-next-line no-process-env secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, writeToken.secret, ).then(r => r.expectNoGraphQLErrors()); diff --git a/integration-tests/tests/api/schema/contracts-check.spec.ts b/integration-tests/tests/api/schema/contracts-check.spec.ts index 4bddc0d62f..e19da5d3da 100644 --- a/integration-tests/tests/api/schema/contracts-check.spec.ts +++ b/integration-tests/tests/api/schema/contracts-check.spec.ts @@ -494,9 +494,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, @@ -522,9 +522,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -670,9 +670,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, @@ -727,9 +727,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: newSchemaCheckId, }, @@ -875,9 +875,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, @@ -932,9 +932,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: newSchemaCheckId, }, @@ -1073,9 +1073,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, @@ -1130,9 +1130,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: newSchemaCheckId, }, @@ -1276,9 +1276,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -1392,9 +1392,9 @@ test.concurrent( document: SchemaCheckQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, id: schemaCheckId, }, @@ -1412,9 +1412,9 @@ test.concurrent( document: ApproveFailedSchemaCheckMutation, variables: { input: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, schemaCheckId, }, }, diff --git a/integration-tests/tests/api/schema/delete.spec.ts b/integration-tests/tests/api/schema/delete.spec.ts index 4d6a88cb70..c5f530e574 100644 --- a/integration-tests/tests/api/schema/delete.spec.ts +++ b/integration-tests/tests/api/schema/delete.spec.ts @@ -249,8 +249,8 @@ test.concurrent( endpoint: `http://${await getServiceHost('composition_federation_2', 3069, false)}/compose`, // eslint-disable-next-line no-process-env secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, readToken.secret, ).then(r => r.expectNoGraphQLErrors()); diff --git a/integration-tests/tests/api/schema/external-composition.spec.ts b/integration-tests/tests/api/schema/external-composition.spec.ts index a6b01ec177..f9d3199585 100644 --- a/integration-tests/tests/api/schema/external-composition.spec.ts +++ b/integration-tests/tests/api/schema/external-composition.spec.ts @@ -50,8 +50,8 @@ test.concurrent('call an external service to compose and validate services', asy endpoint: `http://${dockerAddress}/compose`, // eslint-disable-next-line no-process-env secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, writeToken.secret, ).then(r => r.expectNoGraphQLErrors()); @@ -138,8 +138,8 @@ test.concurrent( endpoint: `http://${dockerAddress}/fail_on_signature`, // eslint-disable-next-line no-process-env secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, writeToken.secret, ).then(r => r.expectNoGraphQLErrors()); @@ -238,8 +238,8 @@ test.concurrent( endpoint: `http://${dockerAddress}/non-existing-endpoint`, // eslint-disable-next-line no-process-env secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, writeToken.secret, ).then(r => r.expectNoGraphQLErrors()); @@ -333,8 +333,8 @@ test.concurrent('a timeout error should be visible to the user', async ({ expect endpoint: `http://${dockerAddress}/timeout`, // eslint-disable-next-line no-process-env secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, writeToken.secret, ).then(r => r.expectNoGraphQLErrors()); diff --git a/integration-tests/tests/api/schema/publish.spec.ts b/integration-tests/tests/api/schema/publish.spec.ts index a185bde4fe..d59af58a32 100644 --- a/integration-tests/tests/api/schema/publish.spec.ts +++ b/integration-tests/tests/api/schema/publish.spec.ts @@ -575,8 +575,8 @@ describe.each` .then(r => r.expectNoGraphQLErrors()); const createTargetResult = await createTarget( { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, slug: 'target2', }, ownerToken, @@ -2667,12 +2667,18 @@ describe('schema publishing changes are persisted', () => { const SchemaCompareToPreviousVersionQuery = graphql(` query SchemaCompareToPreviousVersionQuery( - $organization: ID! - $project: ID! - $target: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $version: ID! ) { - target(selector: { organization: $organization, project: $project, target: $target }) { + target( + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } + ) { id schemaVersion(id: $version) { id @@ -2798,9 +2804,9 @@ test('Target.schemaVersion: result is read from the database', async () => { const result = await execute({ document: SchemaCompareToPreviousVersionQuery, variables: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, version: latestVersion.id, }, authToken: ownerToken, @@ -2893,8 +2899,8 @@ test('Composition Error (Federation 2) can be served from the database', async ( endpoint: `http://${serviceAddress}/compose`, // eslint-disable-next-line no-process-env secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, readWriteToken.secret, ).then(r => r.expectNoGraphQLErrors()); @@ -2937,9 +2943,9 @@ test('Composition Error (Federation 2) can be served from the database', async ( const result = await execute({ document: SchemaCompareToPreviousVersionQuery, variables: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, version: latestVersion.id, }, authToken: ownerToken, @@ -3022,8 +3028,8 @@ test('Composition Network Failure (Federation 2)', async () => { endpoint: `http://${serviceAddress}/compose`, // eslint-disable-next-line no-process-env secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, readWriteToken.secret, ).then(r => r.expectNoGraphQLErrors()); @@ -3062,8 +3068,8 @@ test('Composition Network Failure (Federation 2)', async () => { { endpoint: `http://${serviceAddress}/no_compose`, secret: process.env.EXTERNAL_COMPOSITION_SECRET!, - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, readWriteToken.secret, ).then(r => r.expectNoGraphQLErrors()); @@ -3094,9 +3100,9 @@ test('Composition Network Failure (Federation 2)', async () => { const result = await execute({ document: SchemaCompareToPreviousVersionQuery, variables: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, version: latestVersion.id, }, authToken: ownerToken, diff --git a/integration-tests/tests/api/target/crud.spec.ts b/integration-tests/tests/api/target/crud.spec.ts index 2885da08e2..a401019953 100644 --- a/integration-tests/tests/api/target/crud.spec.ts +++ b/integration-tests/tests/api/target/crud.spec.ts @@ -9,9 +9,9 @@ test.concurrent(`changing a target's slug should result changing its name`, asyn const renameResult = await updateTargetSlug( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, slug: 'bar', }, ownerToken, @@ -20,7 +20,7 @@ test.concurrent(`changing a target's slug should result changing its name`, asyn expect(renameResult.updateTargetSlug.error).toBeNull(); expect(renameResult.updateTargetSlug.ok?.target.name).toBe('bar'); expect(renameResult.updateTargetSlug.ok?.target.slug).toBe('bar'); - expect(renameResult.updateTargetSlug.ok?.selector.target).toBe('bar'); + expect(renameResult.updateTargetSlug.ok?.selector.targetSlug).toBe('bar'); }); test.concurrent( @@ -32,9 +32,9 @@ test.concurrent( const renameResult = await updateTargetSlug( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, slug: target.slug, }, ownerToken, @@ -43,7 +43,7 @@ test.concurrent( expect(renameResult.updateTargetSlug.error).toBeNull(); expect(renameResult.updateTargetSlug.ok?.target.name).toBe(target.slug); expect(renameResult.updateTargetSlug.ok?.target.slug).toBe(target.slug); - expect(renameResult.updateTargetSlug.ok?.selector.target).toBe(target.slug); + expect(renameResult.updateTargetSlug.ok?.selector.targetSlug).toBe(target.slug); }, ); @@ -62,9 +62,9 @@ test.concurrent( const renameResult = await updateTargetSlug( { - organization: organization.slug, - project: project.slug, - target: firstTarget.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: firstTarget.slug, slug: secondTarget.slug, }, ownerToken, @@ -90,9 +90,9 @@ test.concurrent( await updateTargetSlug( { - organization: organization.slug, - project: project2.slug, - target: target2.slug, + organizationSlug: organization.slug, + projectSlug: project2.slug, + targetSlug: target2.slug, slug: sharedSlug, }, ownerToken, @@ -100,9 +100,9 @@ test.concurrent( const renameResult = await updateTargetSlug( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, slug: sharedSlug, }, ownerToken, @@ -111,7 +111,7 @@ test.concurrent( expect(renameResult.updateTargetSlug.error).toBeNull(); expect(renameResult.updateTargetSlug.ok?.target.name).toBe(sharedSlug); expect(renameResult.updateTargetSlug.ok?.target.slug).toBe(sharedSlug); - expect(renameResult.updateTargetSlug.ok?.selector.target).toBe(sharedSlug); + expect(renameResult.updateTargetSlug.ok?.selector.targetSlug).toBe(sharedSlug); }, ); @@ -124,9 +124,9 @@ test.concurrent( const renameResult = await updateTargetSlug( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, slug: 'view', }, ownerToken, diff --git a/integration-tests/tests/api/target/usage.spec.ts b/integration-tests/tests/api/target/usage.spec.ts index a06aedc591..500aa94e2c 100644 --- a/integration-tests/tests/api/target/usage.spec.ts +++ b/integration-tests/tests/api/target/usage.spec.ts @@ -335,8 +335,8 @@ test.concurrent('check usage from two selected targets', async ({ expect }) => { const productionTargetResult = await createTarget( { slug: 'target2', - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, }, ownerToken, ).then(r => r.expectNoGraphQLErrors()); @@ -431,12 +431,12 @@ test.concurrent('check usage from two selected targets', async ({ expect }) => { // Now switch to using checking both staging and production const updateValidationResult = await updateTargetValidationSettings( { - organization: organization.slug, - project: project.slug, - target: staging.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: staging.slug, percentage: 50, // Out of 3 requests, 1 is for Query.me, 2 are done for Query.me so it's 1/3 = 33.3% period: 2, - targets: [productionTarget.id, staging.id], + targetIds: [productionTarget.id, staging.id], }, { authToken: ownerToken, @@ -581,12 +581,12 @@ test.concurrent('check usage not from excluded client names', async ({ expect }) // Exclude app from the check (tests partial, incomplete exclusion) let updateValidationResult = await updateTargetValidationSettings( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, percentage: 0, period: 2, - targets: [target.id], + targetIds: [target.id], excludedClients: ['app'], }, { @@ -617,12 +617,12 @@ test.concurrent('check usage not from excluded client names', async ({ expect }) // Exclude BOTH 'app' and 'cli' (tests multi client covering exclusion) updateValidationResult = await updateTargetValidationSettings( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, percentage: 0, period: 2, - targets: [target.id], + targetIds: [target.id], excludedClients: ['app', 'cli'], }, { @@ -2618,9 +2618,9 @@ test.concurrent( variables: { id: firstSchemaCheckId, selector: { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }, }, authToken: token.secret, @@ -2884,12 +2884,12 @@ test.concurrent('ensure percentage precision up to 2 decimal places', async ({ e // should accept a breaking change when percentage is 2% let updateValidationResult = await updateTargetValidationSettings( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, percentage: 2, period: 2, - targets: [target.id], + targetIds: [target.id], excludedClients: [], }, { @@ -2912,12 +2912,12 @@ test.concurrent('ensure percentage precision up to 2 decimal places', async ({ e // should reject a breaking change when percentage is 1.99% updateValidationResult = await updateTargetValidationSettings( { - organization: organization.slug, - project: project.slug, - target: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, percentage: 1.99, period: 2, - targets: [target.id], + targetIds: [target.id], excludedClients: [], }, { diff --git a/integration-tests/tests/models/federation-native-forceLegacyCompositionInTargets.spec.ts b/integration-tests/tests/models/federation-native-forceLegacyCompositionInTargets.spec.ts index 6a6fe6266a..5a863178bf 100644 --- a/integration-tests/tests/models/federation-native-forceLegacyCompositionInTargets.spec.ts +++ b/integration-tests/tests/models/federation-native-forceLegacyCompositionInTargets.spec.ts @@ -878,9 +878,9 @@ async function prepare(targetPick: TargetOption) { // force legacy composition await updateTargetSchemaComposition( { - organization: organization.slug, - project: project.slug, - target: targetWithLegacyComposition.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: targetWithLegacyComposition.slug, nativeComposition: false, }, targetWithLegacyComposition.tokens.secrets.settings, diff --git a/packages/services/api/src/modules/alerts/module.graphql.ts b/packages/services/api/src/modules/alerts/module.graphql.ts index 85fd65180f..8e4e3e0752 100644 --- a/packages/services/api/src/modules/alerts/module.graphql.ts +++ b/packages/services/api/src/modules/alerts/module.graphql.ts @@ -85,8 +85,8 @@ export default gql` } input AddAlertChannelInput { - organization: ID! - project: ID! + organizationSlug: String! + projectSlug: String! name: String! type: AlertChannelType! slack: SlackChannelInput @@ -102,23 +102,23 @@ export default gql` } input DeleteAlertChannelsInput { - organization: ID! - project: ID! - channels: [ID!]! + organizationSlug: String! + projectSlug: String! + channelIds: [ID!]! } input AddAlertInput { - organization: ID! - project: ID! - target: ID! - channel: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! + channelId: ID! type: AlertType! } input DeleteAlertsInput { - organization: ID! - project: ID! - alerts: [ID!]! + organizationSlug: String! + projectSlug: String! + alertIds: [ID!]! } interface AlertChannel { diff --git a/packages/services/api/src/modules/alerts/providers/alerts-manager.ts b/packages/services/api/src/modules/alerts/providers/alerts-manager.ts index 292649142b..b68876c2ce 100644 --- a/packages/services/api/src/modules/alerts/providers/alerts-manager.ts +++ b/packages/services/api/src/modules/alerts/providers/alerts-manager.ts @@ -38,54 +38,74 @@ export class AlertsManager { this.logger = logger.child({ source: 'AlertsManager' }); } - async addChannel(input: AlertsModule.AddAlertChannelInput): Promise { + async addChannel(input: { + name: string; + organizationId: string; + projectId: string; + type: AlertChannel['type']; + slackChannel?: string | null; + webhookEndpoint?: string | null; + }): Promise { this.logger.debug( 'Adding Alert Channel (organization=%s, project=%s, type=%s)', - input.organization, - input.project, + input.organizationId, + input.projectId, input.type, ); await this.authManager.ensureProjectAccess({ - ...input, scope: ProjectAccessScope.ALERTS, + organization: input.organizationId, + project: input.projectId, }); - const channel = await this.storage.addAlertChannel(input); + const channel = await this.storage.addAlertChannel({ + slackChannel: input.slackChannel, + webhookEndpoint: input.webhookEndpoint, + name: input.name, + type: input.type, + organizationId: input.organizationId, + projectId: input.projectId, + }); await this.triggerChannelConfirmation({ kind: 'created', channel, - organization: input.organization, - project: input.project, + organization: input.organizationId, + project: input.projectId, }); return channel; } - async deleteChannels( - input: ProjectSelector & { - channels: readonly string[]; - }, - ): Promise { + async deleteChannels(input: { + channelIds: readonly string[]; + organizationId: string; + projectId: string; + }): Promise { this.logger.debug( 'Deleting Alert Channels (organization=%s, project=%s, size=%s)', - input.organization, - input.project, - input.channels.length, + input.organizationId, + input.projectId, + input.channelIds.length, ); await this.authManager.ensureProjectAccess({ - ...input, scope: ProjectAccessScope.ALERTS, + organization: input.organizationId, + project: input.projectId, + }); + const channels = await this.storage.deleteAlertChannels({ + organizationId: input.organizationId, + projectId: input.projectId, + channelIds: input.channelIds, }); - const channels = await this.storage.deleteAlertChannels(input); await Promise.all( channels.map(channel => this.triggerChannelConfirmation({ kind: 'deleted', channel, - organization: input.organization, - project: input.project, + organization: input.organizationId, + project: input.projectId, }), ), ); @@ -107,19 +127,32 @@ export class AlertsManager { return this.storage.getAlertChannels(selector); } - async addAlert(input: AlertsModule.AddAlertInput): Promise { + async addAlert(input: { + type: Alert['type']; + organizationId: string; + projectId: string; + targetId: string; + channelId: string; + }): Promise { this.logger.debug( 'Adding Alert (organization=%s, project=%s, type=%s)', - input.organization, - input.project, + input.organizationId, + input.projectId, input.type, ); await this.authManager.ensureProjectAccess({ - ...input, scope: ProjectAccessScope.ALERTS, + organization: input.organizationId, + project: input.projectId, }); - return this.storage.addAlert(input); + return this.storage.addAlert({ + type: input.type, + channelId: input.channelId, + organizationId: input.organizationId, + projectId: input.projectId, + targetId: input.targetId, + }); } async deleteAlerts( diff --git a/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlert.ts b/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlert.ts index b21b6bb032..6108ffb422 100644 --- a/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlert.ts +++ b/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlert.ts @@ -23,10 +23,10 @@ export const addAlert: NonNullable = async ( try { const alert = await injector.get(AlertsManager).addAlert({ - organization: organizationId, - project: projectId, - target: targetId, - channel: input.channel, + organizationId, + projectId, + targetId, + channelId: input.channelId, type: input.type, }); diff --git a/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlertChannel.ts b/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlertChannel.ts index ee11b87b28..12896c0fe1 100644 --- a/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlertChannel.ts +++ b/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlertChannel.ts @@ -47,12 +47,12 @@ export const addAlertChannel: NonNullable project: projectId, }), addedAlertChannel: await injector.get(AlertsManager).addChannel({ - organization: organizationId, - project: projectId, + organizationId, + projectId, name: input.name, type: input.type, - slack: input.slack, - webhook: input.webhook, + slackChannel: input.slack?.channel, + webhookEndpoint: input.webhook?.endpoint, }), }, }; diff --git a/packages/services/api/src/modules/alerts/resolvers/Mutation/deleteAlertChannels.ts b/packages/services/api/src/modules/alerts/resolvers/Mutation/deleteAlertChannels.ts index eb8d7f812a..0da1ce48fa 100644 --- a/packages/services/api/src/modules/alerts/resolvers/Mutation/deleteAlertChannels.ts +++ b/packages/services/api/src/modules/alerts/resolvers/Mutation/deleteAlertChannels.ts @@ -22,9 +22,9 @@ export const deleteAlertChannels: NonNullable = asyn await injector.get(AlertsManager).deleteAlerts({ organization: organizationId, project: projectId, - alerts: input.alerts, + alerts: input.alertIds, }); return { diff --git a/packages/services/api/src/modules/billing/providers/billing.provider.ts b/packages/services/api/src/modules/billing/providers/billing.provider.ts index cb7fdf16c9..8705f5dfda 100644 --- a/packages/services/api/src/modules/billing/providers/billing.provider.ts +++ b/packages/services/api/src/modules/billing/providers/billing.provider.ts @@ -61,13 +61,13 @@ export class BillingProvider { return await this.billingService.availablePrices.query(); } - async getOrganizationBillingParticipant( - selector: OrganizationSelector, - ): Promise { + async getOrganizationBillingParticipant(selector: { + organizationId: string; + }): Promise { this.logger.debug('Fetching organization billing (selector=%o)', selector); return this.storage.getOrganizationBilling({ - organization: selector.organization, + organization: selector.organizationId, }); } diff --git a/packages/services/api/src/modules/billing/resolvers/Mutation/downgradeToHobby.ts b/packages/services/api/src/modules/billing/resolvers/Mutation/downgradeToHobby.ts index f32748c106..bfd4e3e329 100644 --- a/packages/services/api/src/modules/billing/resolvers/Mutation/downgradeToHobby.ts +++ b/packages/services/api/src/modules/billing/resolvers/Mutation/downgradeToHobby.ts @@ -13,7 +13,7 @@ export const downgradeToHobby: NonNullable { const organizationId = await injector.get(IdTranslator).translateOrganizationId({ - organization: args.input.organization.organization, + organizationSlug: args.input.organization.organizationSlug, }); await injector.get(AuthManager).ensureOrganizationAccess({ organization: organizationId, diff --git a/packages/services/api/src/modules/billing/resolvers/Mutation/generateStripePortalLink.ts b/packages/services/api/src/modules/billing/resolvers/Mutation/generateStripePortalLink.ts index bb0f643488..6848ff2395 100644 --- a/packages/services/api/src/modules/billing/resolvers/Mutation/generateStripePortalLink.ts +++ b/packages/services/api/src/modules/billing/resolvers/Mutation/generateStripePortalLink.ts @@ -8,7 +8,7 @@ export const generateStripePortalLink: NonNullable< MutationResolvers['generateStripePortalLink'] > = async (_, args, { injector }) => { const organizationId = await injector.get(IdTranslator).translateOrganizationId({ - organization: args.selector.organization, + organizationSlug: args.selector.organizationSlug, }); const organization = await injector.get(OrganizationManager).getOrganization( { diff --git a/packages/services/api/src/modules/billing/resolvers/Mutation/updateOrgRateLimit.ts b/packages/services/api/src/modules/billing/resolvers/Mutation/updateOrgRateLimit.ts index 2eefce2407..498185c3e7 100644 --- a/packages/services/api/src/modules/billing/resolvers/Mutation/updateOrgRateLimit.ts +++ b/packages/services/api/src/modules/billing/resolvers/Mutation/updateOrgRateLimit.ts @@ -9,7 +9,7 @@ export const updateOrgRateLimit: NonNullable { const organizationId = await injector.get(IdTranslator).translateOrganizationId({ - organization: args.selector.organization, + organizationSlug: args.selector.organizationSlug, }); return injector.get(OrganizationManager).updateRateLimits({ diff --git a/packages/services/api/src/modules/billing/resolvers/Mutation/upgradeToPro.ts b/packages/services/api/src/modules/billing/resolvers/Mutation/upgradeToPro.ts index ea60c70a88..b760d5bd67 100644 --- a/packages/services/api/src/modules/billing/resolvers/Mutation/upgradeToPro.ts +++ b/packages/services/api/src/modules/billing/resolvers/Mutation/upgradeToPro.ts @@ -14,7 +14,7 @@ export const upgradeToPro: NonNullable = asyn { injector }, ) => { const organizationId = await injector.get(IdTranslator).translateOrganizationId({ - organization: args.input.organization.organization, + organizationSlug: args.input.organization.organizationSlug, }); await injector.get(AuthManager).ensureOrganizationAccess({ organization: organizationId, diff --git a/packages/services/api/src/modules/billing/resolvers/Organization.ts b/packages/services/api/src/modules/billing/resolvers/Organization.ts index c04105a1e6..68ca1f50e9 100644 --- a/packages/services/api/src/modules/billing/resolvers/Organization.ts +++ b/packages/services/api/src/modules/billing/resolvers/Organization.ts @@ -21,7 +21,7 @@ export const Organization: Pick< const billingRecord = await injector .get(BillingProvider) - .getOrganizationBillingParticipant({ organization: org.id }); + .getOrganizationBillingParticipant({ organizationId: org.id }); if (!billingRecord) { return { diff --git a/packages/services/api/src/modules/integrations/module.graphql.ts b/packages/services/api/src/modules/integrations/module.graphql.ts index 03a171ca36..57642f2d94 100644 --- a/packages/services/api/src/modules/integrations/module.graphql.ts +++ b/packages/services/api/src/modules/integrations/module.graphql.ts @@ -29,12 +29,12 @@ export default gql` } input AddSlackIntegrationInput { - organization: ID! + organizationSlug: String! token: String! } input AddGitHubIntegrationInput { - organization: ID! + organizationSlug: String! installationId: ID! } diff --git a/packages/services/api/src/modules/operations/module.graphql.ts b/packages/services/api/src/modules/operations/module.graphql.ts index 7359408d78..26f7b466c2 100644 --- a/packages/services/api/src/modules/operations/module.graphql.ts +++ b/packages/services/api/src/modules/operations/module.graphql.ts @@ -13,33 +13,35 @@ export default gql` } input OperationsStatsSelectorInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! period: DateRangeInput! + # TODO: are these IDs or hashes? operations: [ID!] clientNames: [String!] } input ClientStatsInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! period: DateRangeInput! client: String! } input SchemaCoordinateStatsInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! period: DateRangeInput! schemaCoordinate: String! } input ClientStatsByTargetsInput { - organization: ID! - project: ID! + organizationSlug: String! + projectSlug: String! + # TODO: are these IDs or slugs? targetIds: [ID!]! period: DateRangeInput! } @@ -55,9 +57,9 @@ export default gql` } input FieldStatsInput { - target: String! - project: String! - organization: String! + targetSlug: String! + projectSlug: String! + organizationSlug: String! type: String! field: String! argument: String @@ -66,9 +68,9 @@ export default gql` } input FieldListStatsInput { - target: String! - project: String! - organization: String! + targetSlug: String! + projectSlug: String! + organizationSlug: String! period: DateRangeInput! fields: [FieldTypePairInput!]! operationHash: String diff --git a/packages/services/api/src/modules/organization/module.graphql.ts b/packages/services/api/src/modules/organization/module.graphql.ts index 50422cfcb5..0125701ab1 100644 --- a/packages/services/api/src/modules/organization/module.graphql.ts +++ b/packages/services/api/src/modules/organization/module.graphql.ts @@ -84,12 +84,12 @@ export default gql` } input OrganizationTransferRequestSelector { - organization: ID! + organizationSlug: String! code: String! } input AnswerOrganizationTransferRequestInput { - organization: ID! + organizationSlug: String! accept: Boolean! code: String! } @@ -136,29 +136,29 @@ export default gql` } input OrganizationSelectorInput { - organization: ID! + organizationSlug: String! } type OrganizationSelector { - organization: ID! + organizationSlug: String! } input OrganizationMemberInput { - organization: ID! - user: ID! + organizationSlug: String! + userId: ID! } input OrganizationMemberAccessInput { - organization: ID! - user: ID! + organizationSlug: String! + userId: ID! organizationScopes: [OrganizationAccessScope!]! projectScopes: [ProjectAccessScope!]! targetScopes: [TargetAccessScope!]! } input RequestOrganizationTransferInput { - organization: ID! - user: ID! + organizationSlug: String! + userId: ID! } input CreateOrganizationInput { @@ -166,18 +166,18 @@ export default gql` } input UpdateOrganizationSlugInput { - organization: ID! + organizationSlug: String! slug: String! } input InviteToOrganizationByEmailInput { - organization: ID! - role: ID + organizationSlug: String! + roleId: ID email: String! } input DeleteOrganizationInvitationInput { - organization: ID! + organizationSlug: String! email: String! } @@ -207,7 +207,7 @@ export default gql` type Organization { id: ID! - slug: ID! + slug: String! cleanId: ID! @deprecated(reason: "Use the 'slug' field instead.") name: String! @deprecated(reason: "Use the 'slug' field instead.") owner: Member! @@ -314,7 +314,7 @@ export default gql` } input CreateMemberRoleInput { - organization: ID! + organizationSlug: String! name: String! description: String! organizationAccessScopes: [OrganizationAccessScope!]! @@ -348,8 +348,8 @@ export default gql` } input UpdateMemberRoleInput { - organization: ID! - role: ID! + organizationSlug: String! + roleId: ID! name: String! description: String! organizationAccessScopes: [OrganizationAccessScope!]! @@ -383,8 +383,8 @@ export default gql` } input DeleteMemberRoleInput { - organization: ID! - role: ID! + organizationSlug: String! + roleId: ID! } type DeleteMemberRoleOk { @@ -404,9 +404,9 @@ export default gql` } input AssignMemberRoleInput { - organization: ID! - user: ID! - role: ID! + organizationSlug: String! + userId: ID! + roleId: ID! } type AssignMemberRoleOk { @@ -443,19 +443,19 @@ export default gql` } input AssignMemberRoleMigrationInput { - organization: ID! - role: ID! - users: [ID!]! + organizationSlug: String! + roleId: ID! + userIds: [ID!]! } input CreateMemberRoleMigrationInput { - organization: ID! + organizationSlug: String! name: String! description: String! organizationScopes: [OrganizationAccessScope!]! projectScopes: [ProjectAccessScope!]! targetScopes: [TargetAccessScope!]! - users: [ID!]! + userIds: [ID!]! } type MigrateUnassignedMembersResult { diff --git a/packages/services/api/src/modules/organization/providers/organization-manager.ts b/packages/services/api/src/modules/organization/providers/organization-manager.ts index 1ed22be0d2..11eb89b283 100644 --- a/packages/services/api/src/modules/organization/providers/organization-manager.ts +++ b/packages/services/api/src/modules/organization/providers/organization-manager.ts @@ -1430,8 +1430,8 @@ export class OrganizationManager { }: { organizationId: string; assignRole?: { - role: string; - users: readonly string[]; + roleId: string; + userIds: readonly string[]; } | null; createRole?: { name: string; @@ -1439,7 +1439,7 @@ export class OrganizationManager { organizationScopes: readonly OrganizationAccessScope[]; projectScopes: readonly ProjectAccessScope[]; targetScopes: readonly TargetAccessScope[]; - users: readonly string[]; + userIds: readonly string[]; } | null; }) { const currentUser = await this.authManager.getCurrentUser(); @@ -1459,8 +1459,8 @@ export class OrganizationManager { if (assignRole) { return this.assignRoleToMembersMigration({ organizationId, - roleId: assignRole.role, - users: assignRole.users, + roleId: assignRole.roleId, + userIds: assignRole.userIds, }); } @@ -1481,7 +1481,7 @@ export class OrganizationManager { organizationScopes: readonly OrganizationAccessScope[]; projectScopes: readonly ProjectAccessScope[]; targetScopes: readonly TargetAccessScope[]; - users: readonly string[]; + userIds: readonly string[]; }) { const result = await this.createMemberRole({ organizationId: input.organizationId, @@ -1496,7 +1496,7 @@ export class OrganizationManager { return this.assignRoleToMembersMigration({ roleId: result.ok.createdRole.id, organizationId: input.organizationId, - users: input.users, + userIds: input.userIds, }); } @@ -1506,12 +1506,12 @@ export class OrganizationManager { private async assignRoleToMembersMigration(input: { organizationId: string; roleId: string; - users: readonly string[]; + userIds: readonly string[]; }) { await this.storage.assignOrganizationMemberRoleToMany({ organizationId: input.organizationId, roleId: input.roleId, - userIds: input.users, + userIds: input.userIds, }); return { diff --git a/packages/services/api/src/modules/organization/resolvers/Mutation/assignMemberRole.ts b/packages/services/api/src/modules/organization/resolvers/Mutation/assignMemberRole.ts index 218e0165d4..8432235db3 100644 --- a/packages/services/api/src/modules/organization/resolvers/Mutation/assignMemberRole.ts +++ b/packages/services/api/src/modules/organization/resolvers/Mutation/assignMemberRole.ts @@ -11,7 +11,7 @@ export const assignMemberRole: NonNullable { const translator = injector.get(IdTranslator); const organizationId = await translator.translateOrganizationId({ - organization: selector.organization, + organizationSlug: selector.organizationSlug, }); const organization = await injector.get(OrganizationManager).deleteOrganization({ organization: organizationId, }); return { selector: { - organization: organizationId, + organizationSlug: organization.slug, }, organization, }; diff --git a/packages/services/api/src/modules/organization/resolvers/Mutation/deleteOrganizationMember.ts b/packages/services/api/src/modules/organization/resolvers/Mutation/deleteOrganizationMember.ts index ab92bffeb0..f38f781f01 100644 --- a/packages/services/api/src/modules/organization/resolvers/Mutation/deleteOrganizationMember.ts +++ b/packages/services/api/src/modules/organization/resolvers/Mutation/deleteOrganizationMember.ts @@ -8,7 +8,7 @@ export const deleteOrganizationMember: NonNullable< const organizationId = await injector.get(IdTranslator).translateOrganizationId(input); const organization = await injector .get(OrganizationManager) - .deleteMember({ organization: organizationId, user: input.user }); + .deleteMember({ organization: organizationId, user: input.userId }); return { selector: input, diff --git a/packages/services/api/src/modules/organization/resolvers/Mutation/inviteToOrganizationByEmail.ts b/packages/services/api/src/modules/organization/resolvers/Mutation/inviteToOrganizationByEmail.ts index 9dd495383b..534ad76fc9 100644 --- a/packages/services/api/src/modules/organization/resolvers/Mutation/inviteToOrganizationByEmail.ts +++ b/packages/services/api/src/modules/organization/resolvers/Mutation/inviteToOrganizationByEmail.ts @@ -33,6 +33,6 @@ export const inviteToOrganizationByEmail: NonNullable< return await injector.get(OrganizationManager).inviteByEmail({ organization, email: input.email, - role: input.role, + role: input.roleId, }); }; diff --git a/packages/services/api/src/modules/organization/resolvers/Mutation/joinOrganization.ts b/packages/services/api/src/modules/organization/resolvers/Mutation/joinOrganization.ts index b7a3ec080e..36f17a147e 100644 --- a/packages/services/api/src/modules/organization/resolvers/Mutation/joinOrganization.ts +++ b/packages/services/api/src/modules/organization/resolvers/Mutation/joinOrganization.ts @@ -15,7 +15,7 @@ export const joinOrganization: NonNullable { const translator = injector.get(IdTranslator); const organizationId = await translator.translateOrganizationId({ - organization: input.organization, + organizationSlug: input.organizationSlug, }); const result = await injector.get(OrganizationManager).leaveOrganization(organizationId); diff --git a/packages/services/api/src/modules/organization/resolvers/Mutation/migrateUnassignedMembers.ts b/packages/services/api/src/modules/organization/resolvers/Mutation/migrateUnassignedMembers.ts index 56b2f3ff54..c541c8a229 100644 --- a/packages/services/api/src/modules/organization/resolvers/Mutation/migrateUnassignedMembers.ts +++ b/packages/services/api/src/modules/organization/resolvers/Mutation/migrateUnassignedMembers.ts @@ -5,9 +5,10 @@ import type { MutationResolvers } from './../../../../__generated__/types.next'; export const migrateUnassignedMembers: NonNullable< MutationResolvers['migrateUnassignedMembers'] > = async (_, { input }, { injector }) => { - const organizationIdFromInput = input.assignRole?.organization ?? input.createRole?.organization; + const organizationSlugFromInput = + input.assignRole?.organizationSlug ?? input.createRole?.organizationSlug; - if (!organizationIdFromInput) { + if (!organizationSlugFromInput) { return { error: { message: 'Assign a role or create a new one', @@ -16,7 +17,7 @@ export const migrateUnassignedMembers: NonNullable< } const organizationId = await injector.get(IdTranslator).translateOrganizationId({ - organization: organizationIdFromInput, + organizationSlug: organizationSlugFromInput, }); return injector.get(OrganizationManager).migrateUnassignedMembers({ diff --git a/packages/services/api/src/modules/organization/resolvers/Mutation/requestOrganizationTransfer.ts b/packages/services/api/src/modules/organization/resolvers/Mutation/requestOrganizationTransfer.ts index 191fdc7151..b7d0c3c271 100644 --- a/packages/services/api/src/modules/organization/resolvers/Mutation/requestOrganizationTransfer.ts +++ b/packages/services/api/src/modules/organization/resolvers/Mutation/requestOrganizationTransfer.ts @@ -5,9 +5,9 @@ import type { MutationResolvers } from './../../../../__generated__/types.next'; export const requestOrganizationTransfer: NonNullable< MutationResolvers['requestOrganizationTransfer'] > = async (_, { input }, { injector }) => { - const organization = await injector.get(IdTranslator).translateOrganizationId(input); + const organizationId = await injector.get(IdTranslator).translateOrganizationId(input); return injector.get(OrganizationManager).requestOwnershipTransfer({ - organization, - user: input.user, + organization: organizationId, + user: input.userId, }); }; diff --git a/packages/services/api/src/modules/organization/resolvers/Mutation/updateMemberRole.ts b/packages/services/api/src/modules/organization/resolvers/Mutation/updateMemberRole.ts index 6630f63e12..4d46facb56 100644 --- a/packages/services/api/src/modules/organization/resolvers/Mutation/updateMemberRole.ts +++ b/packages/services/api/src/modules/organization/resolvers/Mutation/updateMemberRole.ts @@ -28,7 +28,7 @@ export const updateMemberRole: NonNullable = async (_, { input }, { injector }) => { - const organization = await injector.get(IdTranslator).translateOrganizationId(input); + const organizationId = await injector.get(IdTranslator).translateOrganizationId(input); return { selector: { - organization: input.organization, + organizationSlug: input.organizationSlug, }, organization: await injector.get(OrganizationManager).updateMemberAccess({ - organization, - user: input.user, + organization: organizationId, + user: input.userId, organizationScopes: input.organizationScopes, projectScopes: input.projectScopes, targetScopes: input.targetScopes, diff --git a/packages/services/api/src/modules/organization/resolvers/Mutation/updateOrganizationSlug.ts b/packages/services/api/src/modules/organization/resolvers/Mutation/updateOrganizationSlug.ts index 3adcd3bd88..fca79377a3 100644 --- a/packages/services/api/src/modules/organization/resolvers/Mutation/updateOrganizationSlug.ts +++ b/packages/services/api/src/modules/organization/resolvers/Mutation/updateOrganizationSlug.ts @@ -29,7 +29,7 @@ export const updateOrganizationSlug: NonNullable< ok: { updatedOrganizationPayload: { selector: { - organization: result.organization.slug, + organizationSlug: result.organization.slug, }, organization: result.organization, }, diff --git a/packages/services/api/src/modules/organization/resolvers/Query/myDefaultOrganization.ts b/packages/services/api/src/modules/organization/resolvers/Query/myDefaultOrganization.ts index 52aa6325e7..04076e1f23 100644 --- a/packages/services/api/src/modules/organization/resolvers/Query/myDefaultOrganization.ts +++ b/packages/services/api/src/modules/organization/resolvers/Query/myDefaultOrganization.ts @@ -6,7 +6,7 @@ import type { QueryResolvers } from './../../../../__generated__/types.next'; export const myDefaultOrganization: NonNullable = async ( _, - { previouslyVisitedOrganizationId }, + { previouslyVisitedOrganizationId: previouslyVisitedOrganizationSlug }, { injector }, ) => { const user = await injector.get(AuthManager).getCurrentUser(); @@ -24,7 +24,7 @@ export const myDefaultOrganization: NonNullable = as const translator = injector.get(IdTranslator); const organizationId = await translator.translateOrganizationId({ - organization: input.organization, + organizationSlug: input.organizationSlug, }); const result = await injector.get(ProjectManager).createProject({ diff --git a/packages/services/api/src/modules/project/resolvers/Mutation/deleteProject.ts b/packages/services/api/src/modules/project/resolvers/Mutation/deleteProject.ts index 27970f54f7..98739d1b45 100644 --- a/packages/services/api/src/modules/project/resolvers/Mutation/deleteProject.ts +++ b/packages/services/api/src/modules/project/resolvers/Mutation/deleteProject.ts @@ -10,11 +10,11 @@ export const deleteProject: NonNullable = as const translator = injector.get(IdTranslator); const [organizationId, projectId] = await Promise.all([ translator.translateOrganizationId({ - organization: selector.organization, + organizationSlug: selector.organizationSlug, }), translator.translateProjectId({ - organization: selector.organization, - project: selector.project, + organizationSlug: selector.organizationSlug, + projectSlug: selector.projectSlug, }), ]); const deletedProject = await injector.get(ProjectManager).deleteProject({ @@ -23,8 +23,8 @@ export const deleteProject: NonNullable = as }); return { selector: { - organization: organizationId, - project: projectId, + organizationSlug: selector.organizationSlug, + projectSlug: selector.projectSlug, }, deletedProject, }; diff --git a/packages/services/api/src/modules/project/resolvers/Mutation/updateProjectSlug.ts b/packages/services/api/src/modules/project/resolvers/Mutation/updateProjectSlug.ts index 5a2f5ce6a8..550e3d2eb1 100644 --- a/packages/services/api/src/modules/project/resolvers/Mutation/updateProjectSlug.ts +++ b/packages/services/api/src/modules/project/resolvers/Mutation/updateProjectSlug.ts @@ -40,8 +40,8 @@ export const updateProjectSlug: NonNullable(selector => selector.organization) - async translateOrganizationId(selector: OrganizationSelector) { + @cache(selector => selector.organizationSlug) + async translateOrganizationId(selector: OrganizationSelectorInput) { this.logger.debug( 'Translating Organization Clean ID (selector=%o)', filterSelector('organization', selector), ); - const organizationId = await this.storage.getOrganizationId(selector); + const organizationId = await this.storage.getOrganizationId({ + organization: selector.organizationSlug, + }); if (!organizationId) { throw new Error('Organization not found'); @@ -31,33 +44,42 @@ export class IdTranslator { return organizationId; } - @cache(selector => selector.organization) - translateOrganizationIdSafe(selector: OrganizationSelector) { + @cache(selector => selector.organizationSlug) + translateOrganizationIdSafe(selector: OrganizationSelectorInput) { this.logger.debug( 'Translating Organization Clean ID (selector=%o)', filterSelector('organization', selector), ); - return this.storage.getOrganizationId(selector); + return this.storage.getOrganizationId({ + organization: selector.organizationSlug, + }); } - @cache(selector => [selector.organization, selector.project].join(',')) - translateProjectId(selector: ProjectSelector) { + @cache(selector => + [selector.organizationSlug, selector.projectSlug].join(','), + ) + translateProjectId(selector: ProjectSelectorInput) { this.logger.debug( 'Translating Project Clean ID (selector=%o)', filterSelector('project', selector), ); - return this.storage.getProjectId(selector); + return this.storage.getProjectId({ + organization: selector.organizationSlug, + project: selector.projectSlug, + }); } @cache< - TargetSelector & { + TargetSelectorInput & { useIds?: boolean; } >(selector => - [selector.organization, selector.project, selector.target, selector.useIds].join(','), + [selector.organizationSlug, selector.projectSlug, selector.targetSlug, selector.useIds].join( + ',', + ), ) translateTargetId( - selector: TargetSelector & { + selector: TargetSelectorInput & { useIds?: boolean; }, ) { @@ -65,6 +87,37 @@ export class IdTranslator { 'Translating Target Clean ID (selector=%o)', filterSelector('target', selector), ); - return this.storage.getTargetId(selector); + return this.storage.getTargetId({ + organization: selector.organizationSlug, + project: selector.projectSlug, + target: selector.targetSlug, + useIds: selector.useIds, + }); + } +} + +function filterSelector( + kind: 'organization', + selector: OrganizationSelectorInput, +): OrganizationSelectorInput; +function filterSelector(kind: 'project', selector: ProjectSelectorInput): ProjectSelectorInput; +function filterSelector(kind: 'target', selector: TargetSelectorInput): TargetSelectorInput; +function filterSelector(kind: 'organization' | 'project' | 'target', selector: any): any { + switch (kind) { + case 'organization': + return { + organizationSlug: selector.organizationSlug, + }; + case 'project': + return { + organizationSlug: selector.organizationSlug, + projectSlug: selector.projectSlug, + }; + case 'target': + return { + organizationSlug: selector.organizationSlug, + projectSlug: selector.projectSlug, + targetSlug: selector.targetSlug, + }; } } diff --git a/packages/services/api/src/modules/shared/providers/storage.ts b/packages/services/api/src/modules/shared/providers/storage.ts index ce3ee6c846..53df39da02 100644 --- a/packages/services/api/src/modules/shared/providers/storage.ts +++ b/packages/services/api/src/modules/shared/providers/storage.ts @@ -573,17 +573,30 @@ export interface Storage { getGitHubIntegrationInstallationId(_: OrganizationSelector): Promise; - addAlertChannel(_: AddAlertChannelInput): Promise; + addAlertChannel(_: { + name: string; + organizationId: string; + projectId: string; + type: AlertChannel['type']; + slackChannel?: string | null; + webhookEndpoint?: string | null; + }): Promise; - deleteAlertChannels( - _: ProjectSelector & { - channels: readonly string[]; - }, - ): Promise; + deleteAlertChannels(_: { + channelIds: readonly string[]; + projectId: string; + organizationId: string; + }): Promise; getAlertChannels(_: ProjectSelector): Promise; - addAlert(_: AddAlertInput): Promise; + addAlert(_: { + channelId: string; + organizationId: string; + projectId: string; + targetId: string; + type: Alert['type']; + }): Promise; deleteAlerts( _: ProjectSelector & { diff --git a/packages/services/api/src/modules/support/module.graphql.ts b/packages/services/api/src/modules/support/module.graphql.ts index f322e32182..38d3b41436 100644 --- a/packages/services/api/src/modules/support/module.graphql.ts +++ b/packages/services/api/src/modules/support/module.graphql.ts @@ -28,7 +28,7 @@ export default gql` } input SupportTicketCreateInput { - organization: String! + organizationSlug: String! subject: String! description: String! priority: SupportTicketPriority! @@ -51,7 +51,7 @@ export default gql` } input SupportTicketReplyInput { - organization: String! + organizationSlug: String! ticketId: String! body: String! } diff --git a/packages/services/api/src/modules/target/module.graphql.ts b/packages/services/api/src/modules/target/module.graphql.ts index 5cb9c396b2..96654bbdf4 100644 --- a/packages/services/api/src/modules/target/module.graphql.ts +++ b/packages/services/api/src/modules/target/module.graphql.ts @@ -32,16 +32,16 @@ export default gql` } input Experimental__UpdateTargetSchemaCompositionInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! nativeComposition: Boolean! } input UpdateTargetGraphQLEndpointUrlInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! graphqlEndpointUrl: String } @@ -59,9 +59,9 @@ export default gql` } input UpdateTargetSlugInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! slug: String! } @@ -99,18 +99,18 @@ export default gql` } input TargetSelectorInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! } input UpdateTargetValidationSettingsInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! period: Int! percentage: Float! - targets: [ID!]! + targetIds: [ID!]! excludedClients: [String!] } @@ -134,16 +134,16 @@ export default gql` } input SetTargetValidationInput { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! enabled: Boolean! } type TargetSelector { - organization: ID! - project: ID! - target: ID! + organizationSlug: String! + projectSlug: String! + targetSlug: String! } extend type Project { @@ -157,7 +157,7 @@ export default gql` type Target { id: ID! - slug: ID! + slug: String! cleanId: ID! @deprecated(reason: "Use the 'slug' field instead.") name: String! @deprecated(reason: "Use the 'slug' field instead.") project: Project! @@ -178,8 +178,8 @@ export default gql` } input CreateTargetInput { - organization: ID! - project: ID! + organizationSlug: String! + projectSlug: String! slug: String! } diff --git a/packages/services/api/src/modules/target/resolvers/Mutation/createTarget.ts b/packages/services/api/src/modules/target/resolvers/Mutation/createTarget.ts index 16c908cf76..12772e48ce 100644 --- a/packages/services/api/src/modules/target/resolvers/Mutation/createTarget.ts +++ b/packages/services/api/src/modules/target/resolvers/Mutation/createTarget.ts @@ -26,18 +26,18 @@ export const createTarget: NonNullable = asyn } const translator = injector.get(IdTranslator); - const [organization, project] = await Promise.all([ + const [organizationId, projectId] = await Promise.all([ translator.translateOrganizationId({ - organization: input.organization, + organizationSlug: input.organizationSlug, }), translator.translateProjectId({ - organization: input.organization, - project: input.project, + organizationSlug: input.organizationSlug, + projectSlug: input.projectSlug, }), ]); const result = await injector.get(TargetManager).createTarget({ - organization, - project, + organization: organizationId, + project: projectId, slug: inputParseResult.data.slug, }); @@ -45,9 +45,9 @@ export const createTarget: NonNullable = asyn return { ok: { selector: { - organization: input.organization, - project: input.project, - target: result.target.slug, + organizationSlug: input.organizationSlug, + projectSlug: input.projectSlug, + targetSlug: result.target.slug, }, createdTarget: result.target, }, diff --git a/packages/services/api/src/modules/target/resolvers/Mutation/deleteTarget.ts b/packages/services/api/src/modules/target/resolvers/Mutation/deleteTarget.ts index fa04e6d095..ed7e266988 100644 --- a/packages/services/api/src/modules/target/resolvers/Mutation/deleteTarget.ts +++ b/packages/services/api/src/modules/target/resolvers/Mutation/deleteTarget.ts @@ -10,16 +10,16 @@ export const deleteTarget: NonNullable = asyn const translator = injector.get(IdTranslator); const [organizationId, projectId, targetId] = await Promise.all([ translator.translateOrganizationId({ - organization: selector.organization, + organizationSlug: selector.organizationSlug, }), translator.translateProjectId({ - organization: selector.organization, - project: selector.project, + organizationSlug: selector.organizationSlug, + projectSlug: selector.projectSlug, }), translator.translateTargetId({ - organization: selector.organization, - project: selector.project, - target: selector.target, + organizationSlug: selector.organizationSlug, + projectSlug: selector.projectSlug, + targetSlug: selector.targetSlug, }), ]); const target = await injector.get(TargetManager).deleteTarget({ @@ -29,9 +29,9 @@ export const deleteTarget: NonNullable = asyn }); return { selector: { - organization: organizationId, - project: projectId, - target: targetId, + organizationSlug: selector.organizationSlug, + projectSlug: selector.projectSlug, + targetSlug: selector.targetSlug, }, deletedTarget: target, }; diff --git a/packages/services/api/src/modules/target/resolvers/Mutation/updateTargetSlug.ts b/packages/services/api/src/modules/target/resolvers/Mutation/updateTargetSlug.ts index 4dd57a5c79..429b845a1f 100644 --- a/packages/services/api/src/modules/target/resolvers/Mutation/updateTargetSlug.ts +++ b/packages/services/api/src/modules/target/resolvers/Mutation/updateTargetSlug.ts @@ -26,16 +26,16 @@ export const updateTargetSlug: NonNullable { + async deleteTokens(input: { + tokenIds: readonly string[]; + organizationId: string; + projectId: string; + targetId: string; + }): Promise { await this.authManager.ensureTargetAccess({ - project: input.project, - organization: input.organization, - target: input.target, + project: input.projectId, + organization: input.organizationId, + target: input.targetId, scope: TargetAccessScope.TOKENS_WRITE, }); diff --git a/packages/services/api/src/modules/token/providers/token-storage.ts b/packages/services/api/src/modules/token/providers/token-storage.ts index 506e04db3f..293da7c9a8 100644 --- a/packages/services/api/src/modules/token/providers/token-storage.ts +++ b/packages/services/api/src/modules/token/providers/token-storage.ts @@ -70,16 +70,14 @@ export class TokenStorage { return response; } - async deleteTokens( - input: { - tokens: readonly string[]; - } & TargetSelector, - ): Promise { + async deleteTokens(input: { tokenIds: readonly string[] }): Promise { this.logger.debug('Deleting tokens (input=%o)', input); - await Promise.all(input.tokens.map(token => this.tokensService.deleteToken.mutate({ token }))); + await Promise.all( + input.tokenIds.map(token => this.tokensService.deleteToken.mutate({ token })), + ); - return input.tokens; + return input.tokenIds; } async invalidateTokens(tokens: string[]) { diff --git a/packages/services/api/src/modules/token/resolvers/Mutation/createToken.ts b/packages/services/api/src/modules/token/resolvers/Mutation/createToken.ts index d7deb037f9..2f6deca836 100644 --- a/packages/services/api/src/modules/token/resolvers/Mutation/createToken.ts +++ b/packages/services/api/src/modules/token/resolvers/Mutation/createToken.ts @@ -43,9 +43,9 @@ export const createToken: NonNullable = async return { ok: { selector: { - organization: input.organization, - project: input.project, - target: input.target, + organizationSlug: input.organizationSlug, + projectSlug: input.projectSlug, + targetSlug: input.targetSlug, }, createdToken: token, secret: token.secret, diff --git a/packages/services/api/src/modules/token/resolvers/Mutation/deleteTokens.ts b/packages/services/api/src/modules/token/resolvers/Mutation/deleteTokens.ts index 01de722b0f..5f746dc2a6 100644 --- a/packages/services/api/src/modules/token/resolvers/Mutation/deleteTokens.ts +++ b/packages/services/api/src/modules/token/resolvers/Mutation/deleteTokens.ts @@ -8,22 +8,22 @@ export const deleteTokens: NonNullable = asyn { injector }, ) => { const translator = injector.get(IdTranslator); - const [organization, project, target] = await Promise.all([ + const [organizationId, projectId, targetId] = await Promise.all([ translator.translateOrganizationId(input), translator.translateProjectId(input), translator.translateTargetId(input), ]); return { selector: { - organization: input.organization, - project: input.project, - target: input.target, + organizationSlug: input.organizationSlug, + projectSlug: input.projectSlug, + targetSlug: input.targetSlug, }, deletedTokens: await injector.get(TokenManager).deleteTokens({ - target, - project, - organization, - tokens: input.tokens, + targetId, + projectId, + organizationId, + tokenIds: input.tokenIds, }), }; }; diff --git a/packages/services/api/src/modules/usage-estimation/module.graphql.ts b/packages/services/api/src/modules/usage-estimation/module.graphql.ts index 033aa2ea2a..a7c2b3d3ad 100644 --- a/packages/services/api/src/modules/usage-estimation/module.graphql.ts +++ b/packages/services/api/src/modules/usage-estimation/module.graphql.ts @@ -8,7 +8,7 @@ export default gql` input UsageEstimationInput { year: Int! month: Int! - organization: String! + organizationSlug: String! } type UsageEstimation { diff --git a/packages/services/api/src/modules/usage-estimation/resolvers/Query/usageEstimation.ts b/packages/services/api/src/modules/usage-estimation/resolvers/Query/usageEstimation.ts index 6fa44a2ecc..c71759bf57 100644 --- a/packages/services/api/src/modules/usage-estimation/resolvers/Query/usageEstimation.ts +++ b/packages/services/api/src/modules/usage-estimation/resolvers/Query/usageEstimation.ts @@ -13,7 +13,7 @@ export const usageEstimation: NonNullable = a { injector }, ) => { const organizationId = await injector.get(IdTranslator).translateOrganizationId({ - organization: args.input.organization, + organizationSlug: args.input.organizationSlug, }); await injector.get(AuthManager).ensureOrganizationAccess({ diff --git a/packages/services/api/src/shared/helpers.ts b/packages/services/api/src/shared/helpers.ts index 32694fa9cb..9a141c416d 100644 --- a/packages/services/api/src/shared/helpers.ts +++ b/packages/services/api/src/shared/helpers.ts @@ -35,32 +35,6 @@ export function uuid(len = 13) { return Math.random().toString(16).substr(2, len); } -export function filterSelector( - kind: 'organization', - selector: OrganizationSelector, -): OrganizationSelector; -export function filterSelector(kind: 'project', selector: ProjectSelector): ProjectSelector; -export function filterSelector(kind: 'target', selector: TargetSelector): TargetSelector; -export function filterSelector(kind: 'organization' | 'project' | 'target', selector: any): any { - switch (kind) { - case 'organization': - return { - organization: selector.organization, - }; - case 'project': - return { - organization: selector.organization, - project: selector.project, - }; - case 'target': - return { - organization: selector.organization, - project: selector.project, - target: selector.target, - }; - } -} - export function stringifySelector< T extends { [key: string]: any; diff --git a/packages/services/storage/src/index.ts b/packages/services/storage/src/index.ts index 58f5a0021f..dd3393f8b4 100644 --- a/packages/services/storage/src/index.ts +++ b/packages/services/storage/src/index.ts @@ -2940,28 +2940,26 @@ export async function createStorage( return result?.github_app_installation_id; }, - async addAlertChannel({ project, name, type, slack, webhook }) { + async addAlertChannel({ projectId, name, type, slackChannel, webhookEndpoint }) { return transformAlertChannel( await pool.one>( sql`/* addAlertChannel */ INSERT INTO alert_channels ("name", "type", "project_id", "slack_channel", "webhook_endpoint") VALUES - (${name}, ${type}, ${project}, ${slack?.channel ?? null}, ${ - webhook?.endpoint ?? null - }) + (${name}, ${type}, ${projectId}, ${slackChannel ?? null}, ${webhookEndpoint ?? null}) RETURNING * `, ), ); }, - async deleteAlertChannels({ project, channels }) { - const result = await pool.query>( + async deleteAlertChannels({ projectId, channelIds }) { + const result = await pool.query( sql`/* deleteAlertChannels */ DELETE FROM alert_channels WHERE - project_id = ${project} AND - id IN (${sql.join(channels, sql`, `)}) + project_id = ${projectId} AND + id IN (${sql.join(channelIds, sql`, `)}) RETURNING * `, ); @@ -2976,18 +2974,18 @@ export async function createStorage( return result.rows.map(transformAlertChannel); }, - async addAlert({ organization, project, target, channel, type }) { + async addAlert({ organizationId, projectId, targetId, channelId, type }) { return transformAlert( await pool.one>( sql`/* addAlert */ INSERT INTO alerts ("type", "alert_channel_id", "target_id", "project_id") VALUES - (${type}, ${channel}, ${target}, ${project}) + (${type}, ${channelId}, ${targetId}, ${projectId}) RETURNING * `, ), - organization, + organizationId, ); }, async deleteAlerts({ organization, project, alerts }) { @@ -4419,9 +4417,9 @@ export async function createStorage( async getTargetBreadcrumbForTargetId(args) { const result = await pool.maybeOne(sql`/* getTargetBreadcrumbForTargetId */ SELECT - o."clean_id" AS "organization", - p."clean_id" AS "project", - t."clean_id" AS "target" + o."clean_id" AS "organization_slug", + p."clean_id" AS "project_slug", + t."clean_id" AS "target_slug" FROM "targets" t INNER JOIN "projects" p ON t."project_id" = p."id" diff --git a/packages/services/storage/src/schema-change-model.ts b/packages/services/storage/src/schema-change-model.ts index 443311eda2..840e1d5c06 100644 --- a/packages/services/storage/src/schema-change-model.ts +++ b/packages/services/storage/src/schema-change-model.ts @@ -1109,10 +1109,18 @@ export const SchemaCheckModel = z.union([ export type SchemaCheckInput = z.TypeOf; export type SchemaCheck = z.TypeOf; -export const TargetBreadcrumbModel = z.object({ - organization: z.string(), - project: z.string(), - target: z.string(), -}); +export const TargetBreadcrumbModel = z + .object({ + organization_slug: z.string(), + project_slug: z.string(), + target_slug: z.string(), + }) + .transform(value => { + return { + organizationSlug: value.organization_slug, + projectSlug: value.project_slug, + targetSlug: value.target_slug, + }; + }); export type TargetBreadcrumb = z.TypeOf; diff --git a/packages/web/app/src/components/admin/AdminStats.tsx b/packages/web/app/src/components/admin/AdminStats.tsx index fac0596e9d..7752002af7 100644 --- a/packages/web/app/src/components/admin/AdminStats.tsx +++ b/packages/web/app/src/components/admin/AdminStats.tsx @@ -436,7 +436,7 @@ export function AdminStats({ ); return ( - + {({ data }) => (
diff --git a/packages/web/app/src/components/layouts/organization.tsx b/packages/web/app/src/components/layouts/organization.tsx index f8692cf461..a4bdf5f540 100644 --- a/packages/web/app/src/components/layouts/organization.tsx +++ b/packages/web/app/src/components/layouts/organization.tsx @@ -92,7 +92,7 @@ export function OrganizationLayout({ }: { page?: Page; className?: string; - organizationId: string; + organizationSlug: string; children: ReactNode; }): ReactElement | null { const [isModalOpen, toggleModalOpen] = useToggle(); @@ -105,13 +105,13 @@ export function OrganizationLayout({ OrganizationLayout_OrganizationFragment, query.data?.organizations.nodes, ); - const currentOrganization = organizations?.find(org => org.slug === props.organizationId); + const currentOrganization = organizations?.find(org => org.slug === props.organizationSlug); useOrganizationAccess({ member: currentOrganization?.me ?? null, scope: OrganizationAccessScope.Read, redirect: true, - organizationId: props.organizationId, + organizationSlug: props.organizationSlug, }); useLastVisitedOrganizationWriter(currentOrganization?.slug); @@ -119,7 +119,7 @@ export function OrganizationLayout({ const meInCurrentOrg = currentOrganization?.me; if (query.error) { - return ; + return ; } return ( @@ -129,14 +129,14 @@ export function OrganizationLayout({
@@ -224,7 +224,7 @@ export function OrganizationLayout({ New project void; - organizationId: string; + organizationSlug: string; }) { const [_, mutate] = useMutation(CreateProjectMutation); const router = useRouter(); @@ -334,7 +334,7 @@ function CreateProjectModal(props: { async function onSubmit(values: z.infer) { const { data, error } = await mutate({ input: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, slug: values.projectSlug, type: values.projectType, }, @@ -344,7 +344,7 @@ function CreateProjectModal(props: { void router.navigate({ to: '/$organizationSlug/$projectSlug', params: { - organizationSlug: props.organizationId, + organizationSlug: props.organizationSlug, projectSlug: data.createProject.ok.createdProject.slug, }, }); diff --git a/packages/web/app/src/components/layouts/project.tsx b/packages/web/app/src/components/layouts/project.tsx index 47b0ba12ff..bf1ca2ff63 100644 --- a/packages/web/app/src/components/layouts/project.tsx +++ b/packages/web/app/src/components/layouts/project.tsx @@ -69,8 +69,8 @@ export function ProjectLayout({ ...props }: { page: Page; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; className?: string; children: ReactNode; }) { @@ -82,18 +82,18 @@ export function ProjectLayout({ const me = query.data?.me; const currentOrganization = query.data?.organizations.nodes.find( - node => node.slug === props.organizationId, + node => node.slug === props.organizationSlug, ); const currentProject = currentOrganization?.projects.nodes.find( - node => node.slug === props.projectId, + node => node.slug === props.projectSlug, ); useProjectAccess({ scope: ProjectAccessScope.Read, member: currentOrganization?.me ?? null, redirect: true, - organizationId: props.organizationId, - projectId: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }); useLastVisitedOrganizationWriter(currentOrganization?.slug); @@ -105,15 +105,15 @@ export function ProjectLayout({
@@ -121,7 +121,10 @@ export function ProjectLayout({ {page === Page.Settings || currentProject?.registryModel !== 'LEGACY' ? null : ( - + )}
@@ -195,8 +198,8 @@ export function ProjectLayout({ ) : null} @@ -214,9 +217,9 @@ export const CreateTarget_CreateTargetMutation = graphql(` createTarget(input: $input) { ok { selector { - organization - project - target + organizationSlug + projectSlug + targetSlug } createdTarget { id @@ -249,10 +252,10 @@ const createTargetFormSchema = z.object({ function CreateTargetModal(props: { isOpen: boolean; toggleModalOpen: () => void; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; }) { - const { organizationId, projectId } = props; + const { organizationSlug, projectSlug } = props; const [_, mutate] = useMutation(CreateTarget_CreateTargetMutation); const router = useRouter(); const { toast } = useToast(); @@ -268,8 +271,8 @@ function CreateTargetModal(props: { async function onSubmit(values: z.infer) { const { data, error } = await mutate({ input: { - project: props.projectId, - organization: props.organizationId, + projectSlug: props.projectSlug, + organizationSlug: props.organizationSlug, slug: values.targetSlug, }, }); @@ -279,8 +282,8 @@ function CreateTargetModal(props: { void router.navigate({ to: '/$organizationSlug/$projectSlug/$targetSlug', params: { - organizationSlug: organizationId, - projectSlug: projectId, + organizationSlug: organizationSlug, + projectSlug: projectSlug, targetSlug: data.createTarget.ok.createdTarget.slug, }, }); diff --git a/packages/web/app/src/components/layouts/target.tsx b/packages/web/app/src/components/layouts/target.tsx index e09a500ce9..9aa8646afd 100644 --- a/packages/web/app/src/components/layouts/target.tsx +++ b/packages/web/app/src/components/layouts/target.tsx @@ -89,9 +89,9 @@ export const TargetLayout = ({ ...props }: { page: Page; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; className?: string; children: ReactNode; connect?: ReactNode; @@ -102,25 +102,23 @@ export const TargetLayout = ({ requestPolicy: 'cache-first', }); - const { organizationId: orgId, projectId } = props; - const me = query.data?.me; const currentOrganization = query.data?.organizations.nodes.find( - node => node.slug === props.organizationId, + node => node.slug === props.organizationSlug, ); const currentProject = currentOrganization?.projects.nodes.find( - node => node.slug === props.projectId, + node => node.slug === props.projectSlug, ); - const currentTarget = currentProject?.targets.nodes.find(node => node.slug === props.targetId); + const currentTarget = currentProject?.targets.nodes.find(node => node.slug === props.targetSlug); const isCDNEnabled = query.data?.isCDNEnabled === true; useTargetAccess({ scope: TargetAccessScope.Read, member: currentOrganization?.me ?? null, redirect: true, - targetId: props.targetId, - projectId, - organizationId: orgId, + targetSlug: props.targetSlug, + projectSlug: props.projectSlug, + organizationSlug: props.organizationSlug, }); useLastVisitedOrganizationWriter(currentOrganization?.slug); @@ -154,15 +152,15 @@ export const TargetLayout = ({
@@ -170,7 +168,10 @@ export const TargetLayout = ({ {currentProject?.registryModel === 'LEGACY' ? ( - + ) : null}
@@ -184,9 +185,9 @@ export const TargetLayout = ({ Schema @@ -196,9 +197,9 @@ export const TargetLayout = ({ Checks @@ -208,9 +209,9 @@ export const TargetLayout = ({ Explorer @@ -232,9 +233,9 @@ export const TargetLayout = ({ Insights @@ -245,9 +246,9 @@ export const TargetLayout = ({ Apps @@ -258,9 +259,9 @@ export const TargetLayout = ({ Laboratory @@ -273,9 +274,9 @@ export const TargetLayout = ({ @@ -302,9 +303,9 @@ export const TargetLayout = ({ Connect to CDN @@ -364,17 +365,17 @@ function composeEndpoint(baseUrl: string, artifactType: CdnArtifactType): string export function ConnectSchemaModal(props: { isOpen: boolean; toggleModalOpen: () => void; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const [query] = useQuery({ query: ConnectSchemaModalQuery, variables: { targetSelector: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }, requestPolicy: 'cache-and-network', @@ -489,9 +490,9 @@ export function ConnectSchemaModal(props: { className="font-bold underline" to="/$organizationSlug/$projectSlug/$targetSlug/settings" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }} target="_blank" rel="noreferrer" diff --git a/packages/web/app/src/components/organization/Permissions.tsx b/packages/web/app/src/components/organization/Permissions.tsx index f8b6b3c4b8..e88ce71436 100644 --- a/packages/web/app/src/components/organization/Permissions.tsx +++ b/packages/web/app/src/components/organization/Permissions.tsx @@ -25,7 +25,7 @@ const OrganizationPermissions_UpdateMemberAccessMutation = graphql(` ) { updateOrganizationMemberAccess(input: $input) { selector { - organization + organizationSlug } organization { id @@ -312,8 +312,8 @@ export function usePermissionsManager({ setState('LOADING'); const result = await mutate({ input: { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, targetScopes, projectScopes, organizationScopes, diff --git a/packages/web/app/src/components/organization/Usage.tsx b/packages/web/app/src/components/organization/Usage.tsx index 1848948508..76641765f3 100644 --- a/packages/web/app/src/components/organization/Usage.tsx +++ b/packages/web/app/src/components/organization/Usage.tsx @@ -36,7 +36,7 @@ export function OrganizationUsageEstimationView(props: { query: Usage_UsageEstimationQuery, variables: { input: { - organization: organization.slug, + organizationSlug: organization.slug, month: new Date().getMonth() + 1, year: new Date().getFullYear(), }, @@ -45,7 +45,7 @@ export function OrganizationUsageEstimationView(props: { return (
- + {result => ( diff --git a/packages/web/app/src/components/organization/billing/BillingPaymentMethod.tsx b/packages/web/app/src/components/organization/billing/BillingPaymentMethod.tsx index f646d48b7e..2857d08b3f 100644 --- a/packages/web/app/src/components/organization/billing/BillingPaymentMethod.tsx +++ b/packages/web/app/src/components/organization/billing/BillingPaymentMethod.tsx @@ -63,7 +63,7 @@ export const ManagePaymentMethod = (props: { onClick={() => { void mutate({ selector: { - organization: organization.slug, + organizationSlug: organization.slug, }, }).then(result => { if (result.data?.generateStripePortalLink) { diff --git a/packages/web/app/src/components/organization/members/invitations.tsx b/packages/web/app/src/components/organization/members/invitations.tsx index b9427e0e43..4040e99b58 100644 --- a/packages/web/app/src/components/organization/members/invitations.tsx +++ b/packages/web/app/src/components/organization/members/invitations.tsx @@ -120,9 +120,9 @@ function MemberInvitationForm(props: { try { const result = await invite({ input: { - organization: organization.slug, + organizationSlug: organization.slug, email: data.email, - role: data.role, + roleId: data.role, }, }); @@ -336,7 +336,7 @@ function Invitation(props: { try { const result = await deleteInvitation({ input: { - organization: props.organizationSlug, + organizationSlug: props.organizationSlug, email: invitation.email, }, }); diff --git a/packages/web/app/src/components/organization/members/list.tsx b/packages/web/app/src/components/organization/members/list.tsx index f9b723a55e..60f9d13a6e 100644 --- a/packages/web/app/src/components/organization/members/list.tsx +++ b/packages/web/app/src/components/organization/members/list.tsx @@ -161,9 +161,9 @@ function OrganizationMemberRoleSwitcher(props: { try { const result = await assignRole({ input: { - organization: organization.slug, - role: role.id, - user: member.user.id, + organizationSlug: organization.slug, + roleId: role.id, + userId: member.user.id, }, }); @@ -384,8 +384,8 @@ function OrganizationMemberRow(props: { try { const result = await deleteMember({ input: { - organization: organization.slug, - user: member.user.id, + organizationSlug: organization.slug, + userId: member.user.id, }, }); diff --git a/packages/web/app/src/components/organization/members/migration.tsx b/packages/web/app/src/components/organization/members/migration.tsx index 282e14d5e0..2b1b452742 100644 --- a/packages/web/app/src/components/organization/members/migration.tsx +++ b/packages/web/app/src/components/organization/members/migration.tsx @@ -459,14 +459,14 @@ function OrganizationMemberRolesMigrationGroup(props: { 'roleId' in data ? { assignRole: { - organization: props.organizationSlug, - role: data.roleId, - users: data.users, + organizationSlug: props.organizationSlug, + roleId: data.roleId, + userIds: data.users, }, } : { createRole: { - organization: props.organizationSlug, + organizationSlug: props.organizationSlug, name: data.name, description: data.description, organizationScopes: data.organizationScopes.filter( @@ -479,7 +479,7 @@ function OrganizationMemberRolesMigrationGroup(props: { targetScopes: data.targetScopes.filter((s): s is TargetAccessScope => Object.values(TargetAccessScope).includes(s as TargetAccessScope), ), - users: data.users, + userIds: data.users, }, }, }); diff --git a/packages/web/app/src/components/organization/members/roles.tsx b/packages/web/app/src/components/organization/members/roles.tsx index bd95533bfc..51eb719e45 100644 --- a/packages/web/app/src/components/organization/members/roles.tsx +++ b/packages/web/app/src/components/organization/members/roles.tsx @@ -181,8 +181,8 @@ function OrganizationMemberRoleEditor(props: { try { const result = await updateMemberRole({ input: { - organization: props.organizationSlug, - role: role.id, + organizationSlug: props.organizationSlug, + roleId: role.id, name: data.name, description: data.description, organizationAccessScopes: data.organizationScopes.filter(scope => @@ -446,7 +446,7 @@ function OrganizationMemberRoleCreator(props: { try { const result = await createMemberRole({ input: { - organization: props.organizationSlug, + organizationSlug: props.organizationSlug, name: data.name, description: data.description, organizationAccessScopes: data.organizationScopes.filter(scope => @@ -860,8 +860,8 @@ export function OrganizationMemberRoles(props: { try { const result = await deleteRole({ input: { - organization: organization.slug, - role: roleToDelete.id, + organizationSlug: organization.slug, + roleId: roleToDelete.id, }, }); diff --git a/packages/web/app/src/components/organization/stripe.tsx b/packages/web/app/src/components/organization/stripe.tsx index 29d779d4d4..0ce220e8f7 100644 --- a/packages/web/app/src/components/organization/stripe.tsx +++ b/packages/web/app/src/components/organization/stripe.tsx @@ -2,12 +2,14 @@ import { ReactNode } from 'react'; import { getIsStripeEnabled } from '@/lib/billing/stripe-public-key'; import { Navigate } from '@tanstack/react-router'; -export function RenderIfStripeAvailable(props: { children: ReactNode; organizationId: string }) { +export function RenderIfStripeAvailable(props: { children: ReactNode; organizationSlug: string }) { /** * If Stripe is not enabled we redirect the user to the organization. */ if (!getIsStripeEnabled()) { - return ; + return ( + + ); } return <>{props.children}; diff --git a/packages/web/app/src/components/policy/policy-settings.tsx b/packages/web/app/src/components/policy/policy-settings.tsx index 623956b602..e8aa311c24 100644 --- a/packages/web/app/src/components/policy/policy-settings.tsx +++ b/packages/web/app/src/components/policy/policy-settings.tsx @@ -164,7 +164,7 @@ export function PolicySettings({ const activePolicy = useFragment(PolicySettings_SchemaPolicyFragment, currentState); return ( - + {query => ( void; targets: FragmentType[]; channels: FragmentType[]; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; }): ReactElement => { const { isOpen, toggleModalOpen } = props; const targets = useFragment(CreateAlertModal_TargetFragment, props.targets); @@ -77,10 +77,10 @@ export const CreateAlertModal = (props: { async onSubmit(values) { const { error, data } = await mutate({ input: { - organization: props.organizationId, - project: props.projectId, - target: values.target, - channel: values.channel, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: values.target, + channelId: values.channel, type: values.type, }, }); diff --git a/packages/web/app/src/components/project/alerts/create-channel.tsx b/packages/web/app/src/components/project/alerts/create-channel.tsx index 2d8609eb08..145e82753e 100644 --- a/packages/web/app/src/components/project/alerts/create-channel.tsx +++ b/packages/web/app/src/components/project/alerts/create-channel.tsx @@ -34,13 +34,13 @@ export const CreateChannel_AddAlertChannelMutation = graphql(` export const CreateChannelModal = ({ isOpen, toggleModalOpen, - organizationId, - projectId, + organizationSlug, + projectSlug, }: { isOpen: boolean; toggleModalOpen: () => void; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; }): ReactElement => { const [mutation, mutate] = useMutation(CreateChannel_AddAlertChannelMutation); const { errors, values, touched, handleChange, handleBlur, handleSubmit, isSubmitting } = @@ -68,8 +68,8 @@ export const CreateChannelModal = ({ async onSubmit(values) { const { data, error } = await mutate({ input: { - organization: organizationId, - project: projectId, + organizationSlug: organizationSlug, + projectSlug: projectSlug, name: values.name, type: values.type, slack: values.type === AlertChannelType.Slack ? { channel: values.slackChannel } : null, diff --git a/packages/web/app/src/components/project/alerts/delete-alerts-button.tsx b/packages/web/app/src/components/project/alerts/delete-alerts-button.tsx index 6ce6fdaaa9..7f13f5a871 100644 --- a/packages/web/app/src/components/project/alerts/delete-alerts-button.tsx +++ b/packages/web/app/src/components/project/alerts/delete-alerts-button.tsx @@ -20,13 +20,13 @@ export const DeleteAlertsButton_DeleteAlertsMutation = graphql(` export function DeleteAlertsButton({ selected, onSuccess, - organizationId, - projectId, + organizationSlug, + projectSlug, }: { selected: string[]; onSuccess(): void; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; }) { const [mutation, mutate] = useMutation(DeleteAlertsButton_DeleteAlertsMutation); @@ -37,9 +37,9 @@ export function DeleteAlertsButton({ onClick={async () => { await mutate({ input: { - organization: organizationId, - project: projectId, - alerts: selected, + organizationSlug, + projectSlug, + alertIds: selected, }, }); onSuccess(); diff --git a/packages/web/app/src/components/project/alerts/delete-channels-button.tsx b/packages/web/app/src/components/project/alerts/delete-channels-button.tsx index f05715089e..4c02621eae 100644 --- a/packages/web/app/src/components/project/alerts/delete-channels-button.tsx +++ b/packages/web/app/src/components/project/alerts/delete-channels-button.tsx @@ -20,13 +20,13 @@ export const DeleteChannelsButton_DeleteChannelsMutation = graphql(` export function DeleteChannelsButton({ selected, onSuccess, - organizationId, - projectId, + organizationSlug, + projectSlug, }: { selected: string[]; onSuccess(): void; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; }) { const [mutation, mutate] = useMutation(DeleteChannelsButton_DeleteChannelsMutation); @@ -37,9 +37,9 @@ export function DeleteChannelsButton({ onClick={async () => { await mutate({ input: { - organization: organizationId, - project: projectId, - channels: selected, + organizationSlug, + projectSlug, + channelIds: selected, }, }); onSuccess(); diff --git a/packages/web/app/src/components/project/migration-toast.tsx b/packages/web/app/src/components/project/migration-toast.tsx index 5204a24cf5..00b5bcf46e 100644 --- a/packages/web/app/src/components/project/migration-toast.tsx +++ b/packages/web/app/src/components/project/migration-toast.tsx @@ -1,11 +1,11 @@ import { useRouter } from '@tanstack/react-router'; import { Button } from '../ui/button'; -export function ProjectMigrationToast({ projectId, orgId }: { projectId: string; orgId: string }) { +export function ProjectMigrationToast(props: { projectSlug: string; organizationSlug: string }) { const router = useRouter(); const handleOnClick = () => { void router.navigate({ - to: `/${orgId}/${projectId}/view/settings`, + to: `/${props.organizationSlug}/${props.projectSlug}/view/settings`, }); }; return ( diff --git a/packages/web/app/src/components/project/settings/external-composition.tsx b/packages/web/app/src/components/project/settings/external-composition.tsx index b4801d15e7..fcf462ebcc 100644 --- a/packages/web/app/src/components/project/settings/external-composition.tsx +++ b/packages/web/app/src/components/project/settings/external-composition.tsx @@ -74,18 +74,18 @@ const ExternalCompositionForm_ProjectFragment = graphql(` `); const ExternalCompositionStatus = ({ - projectId, - organizationId, + projectSlug, + organizationSlug, }: { - projectId: string; - organizationId: string; + projectSlug: string; + organizationSlug: string; }) => { const [query] = useQuery({ query: ExternalCompositionStatus_TestQuery, variables: { selector: { - project: projectId, - organization: organizationId, + projectSlug, + organizationSlug, }, }, requestPolicy: 'network-only', @@ -169,8 +169,8 @@ const ExternalCompositionForm = ({ function onSubmit(values: FormValues) { void enable({ input: { - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, endpoint: values.endpoint, secret: values.secret, }, @@ -245,8 +245,8 @@ const ExternalCompositionForm = ({ mutation.data?.enableExternalSchemaComposition.ok?.externalSchemaComposition ?.endpoint) ? ( ) : null} @@ -349,8 +349,8 @@ export const ExternalCompositionSettings = (props: { query: ExternalComposition_ProjectConfigurationQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, }, }, }); @@ -363,8 +363,8 @@ export const ExternalCompositionSettings = (props: { setEnabled(false); const result = await disableComposition({ input: { - project: project.slug, - organization: organization.slug, + projectSlug: project.slug, + organizationSlug: organization.slug, }, }); const error = result.error?.message || result.data?.disableExternalSchemaComposition.error; diff --git a/packages/web/app/src/components/project/settings/model-migration.tsx b/packages/web/app/src/components/project/settings/model-migration.tsx index f7e4b99fa0..cb68467f39 100644 --- a/packages/web/app/src/components/project/settings/model-migration.tsx +++ b/packages/web/app/src/components/project/settings/model-migration.tsx @@ -135,7 +135,7 @@ const ModelMigrationSettings_ProjectFragment = graphql(` export function ModelMigrationSettings(props: { project: FragmentType; - organizationId: string; + organizationSlug: string; }): ReactElement | null { const project = useFragment(ModelMigrationSettings_ProjectFragment, props.project); const isStitching = project.type === 'STITCHING'; @@ -150,8 +150,8 @@ export function ModelMigrationSettings(props: { try { const result = await upgradeMutation({ input: { - project: project.slug, - organization: props.organizationId, + projectSlug: project.slug, + organizationSlug: props.organizationSlug, model: RegistryModel.Modern, }, }); @@ -196,7 +196,7 @@ export function ModelMigrationSettings(props: { onClick={() => { void router.navigate({ to: '/$organizationSlug/view/support', - params: { organizationSlug: props.organizationId }, + params: { organizationSlug: props.organizationSlug }, }); }} > @@ -334,7 +334,7 @@ export function ModelMigrationSettings(props: { onClick={() => { void router.navigate({ to: '/$organizationSlug/view/support', - params: { organizationSlug: props.organizationId }, + params: { organizationSlug: props.organizationSlug }, }); }} > diff --git a/packages/web/app/src/components/project/settings/native-composition.tsx b/packages/web/app/src/components/project/settings/native-composition.tsx index f05af3ca2b..98857b1986 100644 --- a/packages/web/app/src/components/project/settings/native-composition.tsx +++ b/packages/web/app/src/components/project/settings/native-composition.tsx @@ -67,9 +67,9 @@ const IncrementalNativeCompositionSwitch = (props: { onCheckedChange={nativeComposition => { void mutate({ input: { - organization: props.organizationSlug, - project: props.projectSlug, - target: target.slug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: target.slug, nativeComposition, }, }); @@ -153,8 +153,8 @@ export function NativeCompositionSettings(props: { query: NativeCompositionSettings_ProjectQuery, variables: { selector: { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, }, }, pause: project.isNativeFederationEnabled, @@ -172,8 +172,8 @@ export function NativeCompositionSettings(props: { try { const result = await mutate({ input: { - organization: organization.slug, - project: project.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, enabled, }, }); diff --git a/packages/web/app/src/components/target/explorer/common.tsx b/packages/web/app/src/components/target/explorer/common.tsx index dcdfa65f72..8756a45c05 100644 --- a/packages/web/app/src/components/target/explorer/common.tsx +++ b/packages/web/app/src/components/target/explorer/common.tsx @@ -294,9 +294,9 @@ export function GraphQLTypeCard(props: {
{props.kind}
@@ -309,9 +309,9 @@ export function GraphQLTypeCard(props: {
{props.implements.map(t => ( @@ -330,9 +330,9 @@ export function GraphQLTypeCard(props: { ) : null} {supergraphMetadata ? ( ) : null} @@ -374,9 +374,9 @@ function GraphQLArguments(props: { deprecationReason={arg.deprecationReason} > {arg.name} @@ -384,9 +384,9 @@ function GraphQLArguments(props: { {': '} {arg.description ? : null} @@ -412,9 +412,9 @@ function GraphQLArguments(props: { deprecationReason={arg.deprecationReason} > {arg.name} @@ -422,9 +422,9 @@ function GraphQLArguments(props: { {': '} @@ -536,9 +536,9 @@ export function GraphQLFields(props: { deprecationReason={field.deprecationReason} > @@ -557,9 +557,9 @@ export function GraphQLFields(props: { ) : null} : @@ -568,9 +568,9 @@ export function GraphQLFields(props: { {field.supergraphMetadata ? (
@@ -625,9 +625,9 @@ export function GraphQLInputFields(props: { deprecationReason={field.deprecationReason} > @@ -636,9 +636,9 @@ export function GraphQLInputFields(props: { : @@ -662,9 +662,9 @@ export function GraphQLInputFields(props: { function GraphQLTypeAsLink(props: { type: string; className?: string; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const router = useRouter(); const typename = props.type.replace(/[[\]!]+/g, ''); @@ -681,9 +681,9 @@ function GraphQLTypeAsLink(props: { className="text-sm font-normal hover:underline hover:underline-offset-2" to="/$organizationSlug/$projectSlug/$targetSlug/explorer/$typename" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, typename, }} search={router.latestLocation.search} @@ -697,9 +697,9 @@ function GraphQLTypeAsLink(props: { className="text-sm font-normal hover:underline hover:underline-offset-2" to="/$organizationSlug/$projectSlug/$targetSlug/insights/schema-coordinate/$coordinate" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, coordinate: typename, }} search={router.latestLocation.search} @@ -720,9 +720,9 @@ export const LinkToCoordinatePage = React.forwardRef< { coordinate: string; children: ReactNode; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; className?: string; } >((props, ref) => { @@ -734,9 +734,9 @@ export const LinkToCoordinatePage = React.forwardRef< className={cn('hover:underline hover:underline-offset-2', props.className)} to="/$organizationSlug/$projectSlug/$targetSlug/insights/schema-coordinate/$coordinate" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, coordinate: props.coordinate, }} search={router.latestLocation.search} diff --git a/packages/web/app/src/components/target/explorer/enum-type.tsx b/packages/web/app/src/components/target/explorer/enum-type.tsx index 6a69ff9235..cc58791ba8 100644 --- a/packages/web/app/src/components/target/explorer/enum-type.tsx +++ b/packages/web/app/src/components/target/explorer/enum-type.tsx @@ -61,9 +61,9 @@ export function GraphQLEnumTypeComponent(props: { deprecationReason={value.deprecationReason} > {value.name} @@ -72,9 +72,9 @@ export function GraphQLEnumTypeComponent(props: {
{value.supergraphMetadata ? ( ) : null} diff --git a/packages/web/app/src/components/target/explorer/filter.tsx b/packages/web/app/src/components/target/explorer/filter.tsx index 26e835c84e..98c73dc9c3 100644 --- a/packages/web/app/src/components/target/explorer/filter.tsx +++ b/packages/web/app/src/components/target/explorer/filter.tsx @@ -19,12 +19,18 @@ import { useArgumentListToggle, usePeriodSelector } from './provider'; const TypeFilter_AllTypes = graphql(` query TypeFilter_AllTypes( - $organization: ID! - $project: ID! - $target: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $period: DateRangeInput! ) { - target(selector: { organization: $organization, project: $project, target: $target }) { + target( + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } + ) { __typename id latestValidSchemaVersion { @@ -61,9 +67,9 @@ const TypeFilter_AllTypes = graphql(` export function TypeFilter(props: { typename?: string; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; period: { to: string; from: string; @@ -73,9 +79,9 @@ export function TypeFilter(props: { const [query] = useQuery({ query: TypeFilter_AllTypes, variables: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, period: props.period, }, requestPolicy: 'cache-first', @@ -101,9 +107,9 @@ export function TypeFilter(props: { void router.navigate({ to: '/$organizationSlug/$projectSlug/$targetSlug/explorer/$typename', params: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, typename: option.value, }, }); @@ -208,9 +214,9 @@ const variants: Array<{ ]; export function SchemaVariantFilter(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; variant: 'all' | 'unused' | 'deprecated'; }) { return ( @@ -229,9 +235,9 @@ export function SchemaVariantFilter(props: { {variant.label} diff --git a/packages/web/app/src/components/target/explorer/super-graph-metadata.tsx b/packages/web/app/src/components/target/explorer/super-graph-metadata.tsx index 035a860d99..4b7c0cab0e 100644 --- a/packages/web/app/src/components/target/explorer/super-graph-metadata.tsx +++ b/packages/web/app/src/components/target/explorer/super-graph-metadata.tsx @@ -18,17 +18,17 @@ function stringToHslColor(str: string, s = 30, l = 80) { function SubgraphChip(props: { text: string; tooltip: boolean; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): React.ReactElement { const inner = ( ; }) { const supergraphMetadata = useFragment( @@ -86,9 +86,9 @@ export function SupergraphMetadataList(props: { return [ supergraphMetadata.ownedByServiceNames.map((serviceName, index) => ( ( ( ) : null} diff --git a/packages/web/app/src/components/target/history/MarkAsValid.tsx b/packages/web/app/src/components/target/history/MarkAsValid.tsx index e2aa1e0fab..239964d85c 100644 --- a/packages/web/app/src/components/target/history/MarkAsValid.tsx +++ b/packages/web/app/src/components/target/history/MarkAsValid.tsx @@ -36,19 +36,19 @@ const MarkAsValid_SchemaVersionFragment = graphql(` export function MarkAsValid(props: { version: FragmentType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement | null { const version = useFragment(MarkAsValid_SchemaVersionFragment, props.version); const [mutation, mutate] = useMutation(UpdateSchemaVersionStatusMutation); const markAsValid = useCallback(async () => { await mutate({ input: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, - version: version.id, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, + versionId: version.id, valid: true, }, }); diff --git a/packages/web/app/src/components/target/history/errors-and-changes.tsx b/packages/web/app/src/components/target/history/errors-and-changes.tsx index ba9807643e..546db21e57 100644 --- a/packages/web/app/src/components/target/history/errors-and-changes.tsx +++ b/packages/web/app/src/components/target/history/errors-and-changes.tsx @@ -112,9 +112,9 @@ export function ChangesBlock( props: { title: string | React.ReactElement; criticality: CriticalityLevel; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; schemaCheckId: string; conditionBreakingChangeMetadata?: FragmentType< typeof ChangesBlock_SchemaCheckConditionalBreakingChangeMetadataFragment @@ -138,9 +138,9 @@ export function ChangesBlock(
{changes.map((change, key) => ( | null; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; schemaCheckId: string; }) { const change = isChangesBlock_SchemaChangeWithUsageFragment(props.change) @@ -234,9 +234,9 @@ function ChangeItem(props: { {change.approval && ( @@ -272,8 +272,8 @@ function ChangeItem(props: { className="text-orange-500 hover:text-orange-500" to="/$organizationSlug/$projectSlug/$targetSlug/insights/$operationName/$operationHash" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, targetSlug: target.target.slug, operationName: `${hash.substring(0, 4)}_${name}`, operationHash: hash, @@ -339,8 +339,8 @@ function ChangeItem(props: { className="text-orange-500 hover:text-orange-500" to="/$organizationSlug/$projectSlug/$targetSlug/insights/schema-coordinate/$coordinate" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, targetSlug: target.target.slug, coordinate: change.path!.join('.'), }} @@ -387,9 +387,9 @@ function ApprovedByBadge(props: { function SchemaChangeApproval(props: { approval: FragmentType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; schemaCheckId: string; }) { const approval = useFragment(ChangesBlock_SchemaChangeApprovalFragment, props.approval); @@ -397,9 +397,13 @@ function SchemaChangeApproval(props: { const approvalDate = format(new Date(approval.approvedAt), 'do MMMM yyyy'); const schemaCheckPath = '/' + - [props.organizationId, props.projectId, props.targetId, 'checks', approval.schemaCheckId].join( - '/', - ); + [ + props.organizationSlug, + props.projectSlug, + props.targetSlug, + 'checks', + approval.schemaCheckId, + ].join('/'); return (
diff --git a/packages/web/app/src/components/target/insights/Filters.tsx b/packages/web/app/src/components/target/insights/Filters.tsx index afa3ec7adf..129c64c3f4 100644 --- a/packages/web/app/src/components/target/insights/Filters.tsx +++ b/packages/web/app/src/components/target/insights/Filters.tsx @@ -196,26 +196,26 @@ function OperationsFilterContainer({ onClose, onFilter, selected, - organizationId, - projectId, - targetId, + organizationSlug, + projectSlug, + targetSlug, }: { onFilter(keys: string[]): void; onClose(): void; isOpen: boolean; period: DateRangeInput; selected?: string[]; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement | null { const [query, refresh] = useQuery({ query: OperationsFilterContainer_OperationStatsQuery, variables: { selector: { - organization: organizationId, - project: projectId, - target: targetId, + organizationSlug: organizationSlug, + projectSlug: projectSlug, + targetSlug: targetSlug, period, operations: [], }, @@ -296,16 +296,16 @@ export function OperationsFilterTrigger({ period, onFilter, selected, - organizationId, - projectId, - targetId, + organizationSlug, + projectSlug, + targetSlug, }: { period: DateRangeInput; onFilter(keys: string[]): void; selected?: string[]; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const [isOpen, toggle] = useToggle(); @@ -316,9 +316,9 @@ export function OperationsFilterTrigger({ ; className?: string; - organization: string; - project: string; - target: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; clients: readonly { name: string }[] | null; clientFilter: string | null; setClientFilter: (filter: string) => void; @@ -260,9 +260,9 @@ function OperationsTable({ ), @@ -342,9 +342,9 @@ const OperationsTableContainer_OperationsStatsFragment = graphql(` function OperationsTableContainer({ operationsFilter, - organization, - project, - target, + organizationSlug, + projectSlug, + targetSlug, clientFilter, setClientFilter, className, @@ -353,9 +353,9 @@ function OperationsTableContainer({ }: { operationStats: FragmentType | null; operationsFilter: readonly string[]; - organization: string; - project: string; - target: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; selectedPeriod: { from: string; to: string } | null; clientFilter: string | null; setClientFilter: (client: string) => void; @@ -424,9 +424,9 @@ function OperationsTableContainer({ setPagination={safeSetPagination} sorting={sorting} setSorting={setSorting} - organization={organization} - project={project} - target={target} + organizationSlug={organizationSlug} + projectSlug={projectSlug} + targetSlug={targetSlug} clients={operationStats?.clients.nodes ?? null} clientFilter={clientFilter} setClientFilter={setClientFilter} @@ -456,18 +456,18 @@ const OperationsList_OperationsStatsQuery = graphql(` export function OperationsList({ className, - organization, - project, - target, + organizationSlug, + projectSlug, + targetSlug, period, operationsFilter = [], clientNamesFilter = [], selectedPeriod, }: { className?: string; - organization: string; - project: string; - target: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; period: DateRangeInput; operationsFilter: readonly string[]; clientNamesFilter: string[]; @@ -478,9 +478,9 @@ export function OperationsList({ query: OperationsList_OperationsStatsQuery, variables: { selector: { - organization, - project, - target, + organizationSlug, + projectSlug, + targetSlug, period, operations: [], clientNames: clientNamesFilter, @@ -507,9 +507,9 @@ export function OperationsList({ className={className} setClientFilter={setClientFilter} clientFilter={clientFilter} - organization={organization} - project={project} - target={target} + organizationSlug={organizationSlug} + projectSlug={projectSlug} + targetSlug={targetSlug} selectedPeriod={selectedPeriod} /> diff --git a/packages/web/app/src/components/target/insights/Stats.tsx b/packages/web/app/src/components/target/insights/Stats.tsx index 2f69592691..7dfd93c9ef 100644 --- a/packages/web/app/src/components/target/insights/Stats.tsx +++ b/packages/web/app/src/components/target/insights/Stats.tsx @@ -422,9 +422,9 @@ function getLevelOption() { function ClientsStats(props: { operationStats: FragmentType | null; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const router = useRouter(); const styles = useChartStyles(); @@ -562,9 +562,9 @@ function ClientsStats(props: { void router.navigate({ to: '/$organizationSlug/$projectSlug/$targetSlug/insights/client/$name', params: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, name: ev.value, }, search(searchParams) { @@ -1005,9 +1005,9 @@ function RpmOverTimeStats({ } export function OperationsStats({ - organization, - project, - target, + organizationSlug, + projectSlug, + targetSlug, period, operationsFilter, clientNamesFilter, @@ -1015,9 +1015,9 @@ export function OperationsStats({ mode, dateRangeText, }: { - organization: string; - project: string; - target: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; period: { from: string; to: string; @@ -1032,17 +1032,17 @@ export function OperationsStats({ query: Stats_GeneralOperationsStatsQuery, variables: { selector: { - organization, - project, - target, + organizationSlug, + projectSlug, + targetSlug, period, operations: operationsFilter, clientNames: clientNamesFilter, }, allOperationsSelector: { - organization, - project, - target, + organizationSlug, + projectSlug, + targetSlug, period, }, resolution, @@ -1129,9 +1129,9 @@ export function OperationsStats({
diff --git a/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx b/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx index c8c00cc0e8..b533169df4 100644 --- a/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx @@ -140,9 +140,9 @@ export function CreateCollectionModal(props: { isOpen: boolean; toggleModalOpen: () => void; collectionId?: string; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const { isOpen, toggleModalOpen, collectionId } = props; const [mutationCreate, mutateCreate] = useMutation(CreateCollectionMutation); @@ -153,9 +153,9 @@ export function CreateCollectionModal(props: { variables: { id: collectionId!, selector: { - target: props.targetId, - organization: props.organizationId, - project: props.projectId, + targetSlug: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, }, pause: !collectionId, @@ -189,9 +189,9 @@ export function CreateCollectionModal(props: { const { error } = collectionId ? await mutateUpdate({ selector: { - target: props.targetId, - organization: props.organizationId, - project: props.projectId, + targetSlug: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, input: { collectionId, @@ -201,9 +201,9 @@ export function CreateCollectionModal(props: { }) : await mutateCreate({ selector: { - target: props.targetId, - organization: props.organizationId, - project: props.projectId, + targetSlug: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, input: values, }); diff --git a/packages/web/app/src/components/target/laboratory/create-operation-modal.tsx b/packages/web/app/src/components/target/laboratory/create-operation-modal.tsx index 58ce892494..c658f5a6c7 100644 --- a/packages/web/app/src/components/target/laboratory/create-operation-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/create-operation-modal.tsx @@ -92,18 +92,18 @@ export function CreateOperationModal(props: { isOpen: boolean; close: () => void; onSaveSuccess: (args: { id: string; name: string }) => void; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const { toast } = useToast(); const { isOpen, close, onSaveSuccess } = props; const [, mutateCreate] = useMutation(CreateOperationMutation); const { collections, fetching } = useCollections({ - organizationId: props.organizationId, - projectId: props.projectId, - targetId: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }); const { queryEditor, variableEditor, headerEditor } = useEditorContext({ nonNull: true, @@ -122,9 +122,9 @@ export function CreateOperationModal(props: { async function onSubmit(values: CreateOperationModalFormValues) { const result = await mutateCreate({ selector: { - target: props.targetId, - organization: props.organizationId, - project: props.projectId, + targetSlug: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, input: { name: values.name, @@ -161,9 +161,9 @@ export function CreateOperationModal(props: { close={close} onSubmit={onSubmit} isOpen={isOpen} - organizationId={props.organizationId} - projectId={props.projectId} - targetId={props.targetId} + organizationSlug={props.organizationSlug} + projectSlug={props.projectSlug} + targetSlug={props.targetSlug} fetching={fetching} form={form} collections={collections} @@ -175,10 +175,10 @@ export function CreateOperationModalContent(props: { isOpen: boolean; close: () => void; onSubmit: (values: CreateOperationModalFormValues) => void; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; form: UseFormReturn; - targetId: string; + targetSlug: string; fetching: boolean; collections: DocumentCollectionOperation[]; }): ReactElement { diff --git a/packages/web/app/src/components/target/laboratory/delete-collection-modal.tsx b/packages/web/app/src/components/target/laboratory/delete-collection-modal.tsx index 8d8a965b91..39be6f0869 100644 --- a/packages/web/app/src/components/target/laboratory/delete-collection-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/delete-collection-modal.tsx @@ -41,9 +41,9 @@ export function DeleteCollectionModal(props: { isOpen: boolean; toggleModalOpen: () => void; collectionId: string; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const { toast } = useToast(); const { isOpen, toggleModalOpen, collectionId } = props; @@ -53,9 +53,9 @@ export function DeleteCollectionModal(props: { const { error } = await mutate({ id: collectionId, selector: { - target: props.targetId, - organization: props.organizationId, - project: props.projectId, + targetSlug: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, }); toggleModalOpen(); diff --git a/packages/web/app/src/components/target/laboratory/delete-operation-modal.tsx b/packages/web/app/src/components/target/laboratory/delete-operation-modal.tsx index 54768992a2..b52555be90 100644 --- a/packages/web/app/src/components/target/laboratory/delete-operation-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/delete-operation-modal.tsx @@ -50,9 +50,9 @@ export function DeleteOperationModal(props: { isOpen: boolean; toggleModalOpen: () => void; operationId: string; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const { toast } = useToast(); const { isOpen, toggleModalOpen, operationId } = props; @@ -62,9 +62,9 @@ export function DeleteOperationModal(props: { const { error } = await mutate({ id: operationId, selector: { - target: props.targetId, - organization: props.organizationId, - project: props.projectId, + targetSlug: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, }); toggleModalOpen(); diff --git a/packages/web/app/src/components/target/laboratory/edit-operation-modal.tsx b/packages/web/app/src/components/target/laboratory/edit-operation-modal.tsx index 0110519ec8..64f3f31fa7 100644 --- a/packages/web/app/src/components/target/laboratory/edit-operation-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/edit-operation-modal.tsx @@ -69,16 +69,16 @@ export type EditOperationModalFormValues = z.infer void; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement => { const { toast } = useToast(); const [updateOperationNameState, mutate] = useMutation(UpdateOperationNameMutation); const { collections } = useCollections({ - organizationId: props.organizationId, - projectId: props.projectId, - targetId: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }); const { setTabState } = useEditorContext({ nonNull: true }); @@ -105,9 +105,9 @@ export const EditOperationModal = (props: { async function onSubmit(values: EditOperationModalFormValues) { const response = await mutate({ selector: { - target: props.targetId, - organization: props.organizationId, - project: props.projectId, + targetSlug: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, input: { collectionId: values.collectionId, diff --git a/packages/web/app/src/components/target/settings/cdn-access-tokens.tsx b/packages/web/app/src/components/target/settings/cdn-access-tokens.tsx index 0f70ebfe8c..0f746836de 100644 --- a/packages/web/app/src/components/target/settings/cdn-access-tokens.tsx +++ b/packages/web/app/src/components/target/settings/cdn-access-tokens.tsx @@ -46,9 +46,9 @@ const CDNAccessTokenCreateMutation = graphql(` function CreateCDNAccessTokenModal(props: { onCreateCDNAccessToken: () => void; onClose: () => void; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const [createCdnAccessToken, mutate] = useMutation(CDNAccessTokenCreateMutation); @@ -64,9 +64,9 @@ function CreateCDNAccessTokenModal(props: { await mutate({ input: { selector: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, alias: values.alias, }, @@ -193,9 +193,9 @@ function DeleteCDNAccessTokenModal(props: { cdnAccessTokenId: string; onDeletedAccessTokenId: (deletedAccessTokenId: string) => void; onClose: () => void; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const [deleteCdnAccessToken, mutate] = useMutation(CDNAccessTokenDeleteMutation); @@ -232,9 +232,9 @@ function DeleteCDNAccessTokenModal(props: { mutate({ input: { selector: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, cdnAccessTokenId: props.cdnAccessTokenId, }, @@ -335,9 +335,9 @@ const CDNSearchParams = z.discriminatedUnion('cdn', [ export function CDNAccessTokens(props: { me: FragmentType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): React.ReactElement { const me = useFragment(CDNAccessTokens_MeFragment, props.me); @@ -363,9 +363,9 @@ export function CDNAccessTokens(props: { query: CDNAccessTokensQuery, variables: { selector: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, first: 10, after: endCursors[endCursors.length - 1] ?? null, @@ -490,9 +490,9 @@ export function CDNAccessTokens(props: { reexecuteQuery({ requestPolicy: 'network-only' }); }} onClose={closeModal} - organizationId={props.organizationId} - projectId={props.projectId} - targetId={props.targetId} + organizationSlug={props.organizationSlug} + projectSlug={props.projectSlug} + targetSlug={props.targetSlug} /> ) : null} {searchParams.cdn === 'delete' ? ( @@ -502,9 +502,9 @@ export function CDNAccessTokens(props: { reexecuteQuery({ requestPolicy: 'network-only' }); }} onClose={closeModal} - organizationId={props.organizationId} - projectId={props.projectId} - targetId={props.targetId} + organizationSlug={props.organizationSlug} + projectSlug={props.projectSlug} + targetSlug={props.targetSlug} /> ) : null} diff --git a/packages/web/app/src/components/target/settings/registry-access-token.tsx b/packages/web/app/src/components/target/settings/registry-access-token.tsx index 10ec8d7326..0e32f6d7fe 100644 --- a/packages/web/app/src/components/target/settings/registry-access-token.tsx +++ b/packages/web/app/src/components/target/settings/registry-access-token.tsx @@ -28,9 +28,9 @@ export const CreateAccessToken_CreateTokenMutation = graphql(` createToken(input: $input) { ok { selector { - organization - project - target + organizationSlug + projectSlug + targetSlug } createdToken { id @@ -49,8 +49,8 @@ export const CreateAccessToken_CreateTokenMutation = graphql(` `); const CreateAccessTokenModalQuery = graphql(` - query CreateAccessTokenModalQuery($organizationSlug: ID!) { - organization(selector: { organization: $organizationSlug }) { + query CreateAccessTokenModalQuery($organizationSlug: String!) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { ...CreateAccessTokenModalContent_OrganizationFragment } @@ -61,15 +61,15 @@ const CreateAccessTokenModalQuery = graphql(` export function CreateAccessTokenModal(props: { isOpen: boolean; toggleModalOpen: () => void; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const { isOpen, toggleModalOpen } = props; const [organizationQuery] = useQuery({ query: CreateAccessTokenModalQuery, variables: { - organizationSlug: props.organizationId, + organizationSlug: props.organizationSlug, }, }); @@ -80,9 +80,9 @@ export function CreateAccessTokenModal(props: { {organization ? ( ) : ( @@ -143,9 +143,9 @@ const createRegistryTokenFormSchema = z.object({ export function ModalContent(props: { organization: FragmentType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; toggleModalOpen: () => void; }) { const { toast } = useToast(); @@ -175,9 +175,9 @@ export function ModalContent(props: { async function onSubmit(values: z.infer) { const { error } = await mutate({ input: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, name: values.tokenDescription, organizationScopes: [], projectScopes: [], diff --git a/packages/web/app/src/components/target/settings/schema-contracts.tsx b/packages/web/app/src/components/target/settings/schema-contracts.tsx index b58e581b7c..40ddb08b97 100644 --- a/packages/web/app/src/components/target/settings/schema-contracts.tsx +++ b/packages/web/app/src/components/target/settings/schema-contracts.tsx @@ -140,9 +140,9 @@ function DisableContractDialog(props: { contractId: string; onClose: () => void } export function SchemaContracts(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const [disabledContractId, setDisabledContractId] = useState(null); @@ -150,9 +150,9 @@ export function SchemaContracts(props: { query: SchemaContractsQuery, variables: { selector: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }, }); diff --git a/packages/web/app/src/components/ui/query-error.tsx b/packages/web/app/src/components/ui/query-error.tsx index bef179b79f..8c76afaaeb 100644 --- a/packages/web/app/src/components/ui/query-error.tsx +++ b/packages/web/app/src/components/ui/query-error.tsx @@ -9,11 +9,11 @@ import { Link, useRouter } from '@tanstack/react-router'; export function QueryError({ error, showError, - organizationId, + organizationSlug, }: { error: CombinedError; showError?: boolean; - organizationId: string | null; + organizationSlug: string | null; }): ReactElement { const router = useRouter(); const requestId = @@ -53,11 +53,11 @@ export function QueryError({

Don't worry, our technical support got this error reported automatically.

If you wish to track it later or share more details with us,{' '} - {organizationId ? ( + {organizationSlug ? ( ) : ( ) : ( @@ -454,18 +452,18 @@ const OrganizationSettingsPageQuery = graphql(` } `); -function SettingsPageContent(props: { organizationId: string }) { +function SettingsPageContent(props: { organizationSlug: string }) { const [query] = useQuery({ query: OrganizationSettingsPageQuery, variables: { selector: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, }, }, }); if (query.error) { - return ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -473,12 +471,12 @@ function SettingsPageContent(props: { organizationId: string }) { return ( {currentOrganization ? ( ) : null} @@ -486,11 +484,11 @@ function SettingsPageContent(props: { organizationId: string }) { ); } -export function OrganizationSettingsPage(props: { organizationId: string }) { +export function OrganizationSettingsPage(props: { organizationSlug: string }) { return ( <> - + ); } @@ -499,7 +497,7 @@ export const DeleteOrganizationDocument = graphql(` mutation deleteOrganization($selector: OrganizationSelectorInput!) { deleteOrganization(selector: $selector) { selector { - organization + organizationSlug } organization { __typename @@ -512,9 +510,9 @@ export const DeleteOrganizationDocument = graphql(` export function DeleteOrganizationModal(props: { isOpen: boolean; toggleModalOpen: () => void; - organizationId: string; + organizationSlug: string; }) { - const { organizationId } = props; + const { organizationSlug } = props; const [, mutate] = useMutation(DeleteOrganizationDocument); const { toast } = useToast(); const router = useRouter(); @@ -522,7 +520,7 @@ export function DeleteOrganizationModal(props: { const handleDelete = async () => { const { error } = await mutate({ selector: { - organization: organizationId, + organizationSlug, }, }); if (error) { diff --git a/packages/web/app/src/pages/organization-subscription-manage.tsx b/packages/web/app/src/pages/organization-subscription-manage.tsx index e3eda2214d..cdef2e4a92 100644 --- a/packages/web/app/src/pages/organization-subscription-manage.tsx +++ b/packages/web/app/src/pages/organization-subscription-manage.tsx @@ -70,8 +70,8 @@ const BillingsPlanQuery = graphql(` `); const BillingDowngradeMutation = graphql(` - mutation ManageSubscription_DowngradeToHobby($organization: ID!) { - downgradeToHobby(input: { organization: { organization: $organization } }) { + mutation ManageSubscription_DowngradeToHobby($organizationSlug: String!) { + downgradeToHobby(input: { organization: { organizationSlug: $organizationSlug } }) { previousPlan newPlan organization { @@ -83,7 +83,7 @@ const BillingDowngradeMutation = graphql(` const BillingUpgradeToProMutation = graphql(` mutation ManageSubscription_UpgradeToPro( - $organization: ID! + $organizationSlug: String! $paymentMethodId: String $couponCode: String $monthlyLimits: RateLimitInput! @@ -92,7 +92,7 @@ const BillingUpgradeToProMutation = graphql(` input: { paymentMethodId: $paymentMethodId couponCode: $couponCode - organization: { organization: $organization } + organization: { organizationSlug: $organizationSlug } monthlyLimits: $monthlyLimits } ) { @@ -106,8 +106,11 @@ const BillingUpgradeToProMutation = graphql(` `); const UpdateOrgRateLimitMutation = graphql(` - mutation updateOrgRateLimit($organization: ID!, $monthlyLimits: RateLimitInput!) { - updateOrgRateLimit(monthlyLimits: $monthlyLimits, selector: { organization: $organization }) { + mutation updateOrgRateLimit($organizationSlug: String!, $monthlyLimits: RateLimitInput!) { + updateOrgRateLimit( + monthlyLimits: $monthlyLimits + selector: { organizationSlug: $organizationSlug } + ) { ...ManageSubscriptionInner_OrganizationFragment } } @@ -127,7 +130,7 @@ function Inner(props: { scope: OrganizationAccessScope.Settings, member: organization?.me, redirect: true, - organizationId: organization.slug, + organizationSlug: organization.slug, }); const [query] = useQuery({ query: BillingsPlanQuery }); @@ -228,7 +231,7 @@ function Inner(props: { } await upgradeToProMutation({ - organization: organization.slug, + organizationSlug: organization.slug, monthlyLimits: { operations: operationsRateLimit * 1_000_000, }, @@ -251,7 +254,7 @@ function Inner(props: { } await downgradeToHobbyMutation({ - organization: organization.slug, + organizationSlug: organization.slug, }); }, [organization.slug, downgradeToHobbyMutation, isFetching]); @@ -261,7 +264,7 @@ function Inner(props: { } await updateOrgRateLimitMutation({ - organization: organization.slug, + organizationSlug: organization.slug, monthlyLimits: { operations: operationsRateLimit * 1_000_000, }, @@ -415,7 +418,7 @@ function Inner(props: { )} - {error && } + {error && }

{renderActions()}
@@ -438,12 +441,12 @@ const ManageSubscriptionPageQuery = graphql(` } `); -function ManageSubscriptionPageContent(props: { organizationId: string }) { +function ManageSubscriptionPageContent(props: { organizationSlug: string }) { const [query] = useQuery({ query: ManageSubscriptionPageQuery, variables: { selector: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, }, }, }); @@ -459,17 +462,17 @@ function ManageSubscriptionPageContent(props: { organizationId: string }) { scope: OrganizationAccessScope.Settings, member: organization?.me ?? null, redirect: true, - organizationId: props.organizationId, + organizationSlug: props.organizationSlug, }); if (query.error) { - return ; + return ; } return (
@@ -502,13 +505,13 @@ function ManageSubscriptionPageContent(props: { organizationId: string }) { } export function OrganizationSubscriptionManagePage(props: { - organizationId: string; + organizationSlug: string; }): ReactElement { return ( <> - - + + ); diff --git a/packages/web/app/src/pages/organization-subscription.tsx b/packages/web/app/src/pages/organization-subscription.tsx index 843a0a2939..8b724c170e 100644 --- a/packages/web/app/src/pages/organization-subscription.tsx +++ b/packages/web/app/src/pages/organization-subscription.tsx @@ -78,12 +78,12 @@ const SubscriptionPageQuery = graphql(` } `); -function SubscriptionPageContent(props: { organizationId: string }) { +function SubscriptionPageContent(props: { organizationSlug: string }) { const [query] = useQuery({ query: SubscriptionPageQuery, variables: { selector: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, }, }, }); @@ -97,7 +97,7 @@ function SubscriptionPageContent(props: { organizationId: string }) { scope: OrganizationAccessScope.Settings, member: organization?.me ?? null, redirect: true, - organizationId: props.organizationId, + organizationSlug: props.organizationSlug, }); const monthlyUsage = query.data?.monthlyUsage ?? []; @@ -107,7 +107,7 @@ function SubscriptionPageContent(props: { organizationId: string }) { ); if (query.error) { - return ; + return ; } if (query.fetching) { @@ -129,7 +129,7 @@ function SubscriptionPageContent(props: { organizationId: string }) { return (
@@ -268,12 +268,12 @@ function SubscriptionPageContent(props: { organizationId: string }) { ); } -export function OrganizationSubscriptionPage(props: { organizationId: string }): ReactElement { +export function OrganizationSubscriptionPage(props: { organizationSlug: string }): ReactElement { return ( <> - - + + ); diff --git a/packages/web/app/src/pages/organization-support-ticket.tsx b/packages/web/app/src/pages/organization-support-ticket.tsx index 0c0187f1a2..2b058ad23c 100644 --- a/packages/web/app/src/pages/organization-support-ticket.tsx +++ b/packages/web/app/src/pages/organization-support-ticket.tsx @@ -43,7 +43,7 @@ const ReplyTicketForm_SupportTicketReplyMutation = graphql(` `); function ReplyTicketForm(props: { - organizationId: string; + organizationSlug: string; ticketId: string; onSubmit: () => void; }) { @@ -60,7 +60,7 @@ function ReplyTicketForm(props: { try { const result = await mutate({ input: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, ticketId: props.ticketId, body: data.body, }, @@ -183,7 +183,7 @@ function SupportTicket(props: { scope: OrganizationAccessScope.Read, member: organization.me, redirect: true, - organizationId: organization.slug, + organizationSlug: organization.slug, }); const commentEdges = ticket.comments?.edges; @@ -228,7 +228,7 @@ function SupportTicket(props: {
@@ -293,13 +293,13 @@ const SupportTicketPageQuery = graphql(` } `); -function SupportTicketPageContent(props: { ticketId: string; organizationId: string }) { +function SupportTicketPageContent(props: { ticketId: string; organizationSlug: string }) { const ticketId = props.ticketId as string; const [query, refetchQuery] = useQuery({ query: SupportTicketPageQuery, variables: { selector: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, }, ticketId, }, @@ -311,7 +311,7 @@ function SupportTicketPageContent(props: { ticketId: string; organizationId: str }, [refetchQuery]); if (query.error) { - return ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -320,7 +320,7 @@ function SupportTicketPageContent(props: { ticketId: string; organizationId: str return ( {currentOrganization ? ( @@ -339,11 +339,17 @@ function SupportTicketPageContent(props: { ticketId: string; organizationId: str ); } -export function OrganizationSupportTicketPage(props: { organizationId: string; ticketId: string }) { +export function OrganizationSupportTicketPage(props: { + organizationSlug: string; + ticketId: string; +}) { return ( <> - + ); } diff --git a/packages/web/app/src/pages/organization-support.tsx b/packages/web/app/src/pages/organization-support.tsx index 927a4d7bb3..cdc4c12da1 100644 --- a/packages/web/app/src/pages/organization-support.tsx +++ b/packages/web/app/src/pages/organization-support.tsx @@ -75,7 +75,7 @@ const NewTicketForm_SupportTicketCreateMutation = graphql(` `); function NewTicketForm(props: { - organizationId: string; + organizationSlug: string; isOpen: boolean; onClose: () => void; onSubmit: () => void; @@ -104,7 +104,7 @@ function NewTicketForm(props: { try { const result = await mutate({ input: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, subject: data.subject, priority: data.priority, description: data.description, @@ -254,7 +254,7 @@ const SupportTicketRow_SupportTicket = graphql(` `); function SupportTicketRow(props: { - organizationId: string; + organizationSlug: string; ticket: FragmentType; }) { const ticket = useFragment(SupportTicketRow_SupportTicket, props.ticket); @@ -271,7 +271,7 @@ function SupportTicketRow(props: { > {ticket.subject} @@ -333,7 +333,7 @@ function Support(props: { scope: OrganizationAccessScope.Read, member: organization.me, redirect: true, - organizationId: organization.slug, + organizationSlug: organization.slug, }); const tickets = supportTicketsConnection?.edges.map(e => e.node); @@ -354,7 +354,7 @@ function Support(props: {
@@ -374,7 +374,7 @@ function Support(props: { {(tickets ?? []).map(ticket => ( ))} @@ -396,12 +396,12 @@ const SupportPageQuery = graphql(` } `); -function SupportPageContent(props: { organizationId: string }) { +function SupportPageContent(props: { organizationSlug: string }) { const [query, refetchQuery] = useQuery({ query: SupportPageQuery, variables: { selector: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, }, }, requestPolicy: 'cache-first', @@ -412,7 +412,7 @@ function SupportPageContent(props: { organizationId: string }) { }, [refetchQuery]); if (query.error) { - return ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -420,7 +420,7 @@ function SupportPageContent(props: { organizationId: string }) { return ( {currentOrganization ? ( @@ -430,11 +430,11 @@ function SupportPageContent(props: { organizationId: string }) { ); } -export function OrganizationSupportPage(props: { organizationId: string }) { +export function OrganizationSupportPage(props: { organizationSlug: string }) { return ( <> - + ); } diff --git a/packages/web/app/src/pages/organization-transfer.tsx b/packages/web/app/src/pages/organization-transfer.tsx index 4b5b4f20cd..90ef0267a9 100644 --- a/packages/web/app/src/pages/organization-transfer.tsx +++ b/packages/web/app/src/pages/organization-transfer.tsx @@ -47,16 +47,15 @@ const OrganizationTransferPage_AnswerRequest = graphql(` } `); -export function OrganizationTransferPage(props: { organizationId: string; code: string }) { +export function OrganizationTransferPage(props: { organizationSlug: string; code: string }) { const router = useRouter(); const notify = useNotifications(); - const orgId = props.organizationId; const code = props.code; const [query] = useQuery({ query: OrganizationTransferPage_GetRequest, variables: { selector: { - organization: orgId, + organizationSlug: props.organizationSlug, code, }, }, @@ -67,7 +66,7 @@ export function OrganizationTransferPage(props: { organizationId: string; code: const result = await mutate({ input: { code, - organization: orgId, + organizationSlug: props.organizationSlug, accept, }, }); @@ -79,7 +78,7 @@ export function OrganizationTransferPage(props: { organizationId: string; code: void router.navigate({ to: '/$organizationSlug', params: { - organizationSlug: orgId, + organizationSlug: props.organizationSlug, }, }); } else { @@ -91,7 +90,7 @@ export function OrganizationTransferPage(props: { organizationId: string; code: notify('Failed to answer', 'error'); } }, - [mutate, orgId, code, router, notify], + [mutate, props.organizationSlug, code, router, notify], ); const accept = useCallback(() => answer(true), [answer]); diff --git a/packages/web/app/src/pages/organization.tsx b/packages/web/app/src/pages/organization.tsx index 45f4eacf0c..bb5708205d 100644 --- a/packages/web/app/src/pages/organization.tsx +++ b/packages/web/app/src/pages/organization.tsx @@ -225,17 +225,17 @@ const ProjectCard = (props: { const OrganizationProjectsPageQuery = graphql(` query OrganizationProjectsPageQuery( - $organizationSlug: ID! + $organizationSlug: String! $chartResolution: Int! $period: DateRangeInput! ) { - organization(selector: { organization: $organizationSlug }) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id slug } } - projects(selector: { organization: $organizationSlug }) { + projects(selector: { organizationSlug: $organizationSlug }) { total nodes { id @@ -254,7 +254,7 @@ const OrganizationProjectsPageQuery = graphql(` function OrganizationPageContent( props: { - organizationId: string; + organizationSlug: string; } & RouteSearchProps, ) { const days = 14; @@ -288,7 +288,7 @@ function OrganizationPageContent( const [query] = useQuery({ query: OrganizationProjectsPageQuery, variables: { - organizationSlug: props.organizationId, + organizationSlug: props.organizationSlug, chartResolution: days, // 14 days = 14 data points period: period.current, }, @@ -348,13 +348,13 @@ function OrganizationPageContent( }, [projectsConnection, props.search, sortKey, sortOrder]); if (query.error) { - return ; + return ; } return ( <> @@ -494,14 +494,14 @@ function OrganizationPageContent( export function OrganizationPage( props: { - organizationId: string; + organizationSlug: string; } & RouteSearchProps, ) { return ( <> []; }) { const [selected, setSelected] = useState([]); @@ -74,8 +74,8 @@ function Channels(props: { {channels.length > 0 && ( { setSelected([]); @@ -86,8 +86,8 @@ function Channels(props: { {isModalOpen && ( @@ -100,8 +100,8 @@ function Alerts(props: { alerts: FragmentType[]; channels: FragmentType[]; targets: FragmentType[]; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; }) { const [selected, setSelected] = useState([]); const [isModalOpen, toggleModalOpen] = useToggle(); @@ -139,8 +139,8 @@ function Alerts(props: { Create alert { setSelected([]); @@ -151,8 +151,8 @@ function Alerts(props: { {isModalOpen && ( ; + return ; } const alerts = currentProject?.alerts || []; @@ -234,8 +234,8 @@ function AlertsPageContent(props: { organizationId: string; projectId: string }) return ( @@ -247,13 +247,13 @@ function AlertsPageContent(props: { organizationId: string; projectId: string }) {currentProject && currentOrganization && hasAccess ? (
- + ); } diff --git a/packages/web/app/src/pages/project-policy.tsx b/packages/web/app/src/pages/project-policy.tsx index 604662a540..211f245527 100644 --- a/packages/web/app/src/pages/project-policy.tsx +++ b/packages/web/app/src/pages/project-policy.tsx @@ -12,8 +12,8 @@ import { ProjectAccessScope, RegistryModel } from '@/gql/graphql'; import { useProjectAccess } from '@/lib/access/project'; const ProjectPolicyPageQuery = graphql(` - query ProjectPolicyPageQuery($organizationSlug: ID!, $projectSlug: ID!) { - organization(selector: { organization: $organizationSlug }) { + query ProjectPolicyPageQuery($organizationSlug: String!, $projectSlug: String!) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id me { @@ -22,7 +22,7 @@ const ProjectPolicyPageQuery = graphql(` } } } - project(selector: { organization: $organizationSlug, project: $projectSlug }) { + project(selector: { organizationSlug: $organizationSlug, projectSlug: $projectSlug }) { id registryModel schemaPolicy { @@ -67,13 +67,13 @@ const UpdateSchemaPolicyForProject = graphql(` } `); -function ProjectPolicyContent(props: { organizationId: string; projectId: string }) { +function ProjectPolicyContent(props: { organizationSlug: string; projectSlug: string }) { const [mutation, mutate] = useMutation(UpdateSchemaPolicyForProject); const [query] = useQuery({ query: ProjectPolicyPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, requestPolicy: 'cache-and-network', }); @@ -86,20 +86,20 @@ function ProjectPolicyContent(props: { organizationId: string; projectId: string scope: ProjectAccessScope.Settings, member: currentOrganization?.me ?? null, redirect: true, - organizationId: props.organizationId, - projectId: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }); if (query.error) { - return ; + return ; } const isLegacyProject = currentProject?.registryModel === RegistryModel.Legacy; return ( @@ -159,8 +159,8 @@ function ProjectPolicyContent(props: { organizationId: string; projectId: string onSave={async newPolicy => { await mutate({ selector: { - organization: props.organizationId, - project: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, policy: newPolicy, }).then(result => { @@ -198,11 +198,14 @@ function ProjectPolicyContent(props: { organizationId: string; projectId: string ); } -export function ProjectPolicyPage(props: { organizationId: string; projectId: string }) { +export function ProjectPolicyPage(props: { organizationSlug: string; projectSlug: string }) { return ( <> - + ); } diff --git a/packages/web/app/src/pages/project-settings.tsx b/packages/web/app/src/pages/project-settings.tsx index b68028419a..ebeb679a29 100644 --- a/packages/web/app/src/pages/project-settings.tsx +++ b/packages/web/app/src/pages/project-settings.tsx @@ -67,9 +67,7 @@ const GithubIntegration_EnableProjectNameInGitHubCheckMutation = graphql(` `); function GitHubIntegration(props: { - organizationId: string; organizationSlug: string; - projectId: string; projectSlug: string; }): ReactElement | null { const docksLink = getDocsUrl('integrations/ci-cd#github-workflow-for-ci'); @@ -78,7 +76,7 @@ function GitHubIntegration(props: { query: GithubIntegration_GithubIntegrationDetailsQuery, variables: { selector: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, }, }, }); @@ -151,8 +149,8 @@ function GitHubIntegration(props: { onClick={() => { void ghCheckMutate({ input: { - organization: props.organizationId, - project: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, }).then( result => { @@ -182,8 +180,8 @@ const ProjectSettingsPage_UpdateProjectSlugMutation = graphql(` updateProjectSlug(input: $input) { ok { selector { - organization - project + organizationSlug + projectSlug } project { id @@ -227,8 +225,8 @@ function ProjectSettingsPage_SlugForm(props: { organizationSlug: string; project try { const result = await slugMutate({ input: { - organization: props.organizationSlug, - project: props.projectSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, slug: data.slug, }, }); @@ -336,26 +334,26 @@ const ProjectSettingsPage_ProjectFragment = graphql(` `); const ProjectSettingsPageQuery = graphql(` - query ProjectSettingsPageQuery($organizationSlug: ID!, $projectSlug: ID!) { - organization(selector: { organization: $organizationSlug }) { + query ProjectSettingsPageQuery($organizationSlug: String!, $projectSlug: String!) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { ...ProjectSettingsPage_OrganizationFragment } } - project(selector: { organization: $organizationSlug, project: $projectSlug }) { + project(selector: { organizationSlug: $organizationSlug, projectSlug: $projectSlug }) { ...ProjectSettingsPage_ProjectFragment } isGitHubIntegrationFeatureEnabled } `); -function ProjectSettingsContent(props: { organizationId: string; projectId: string }) { +function ProjectSettingsContent(props: { organizationSlug: string; projectSlug: string }) { const [isModalOpen, toggleModalOpen] = useToggle(); const [query] = useQuery({ query: ProjectSettingsPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, requestPolicy: 'cache-and-network', }); @@ -369,18 +367,18 @@ function ProjectSettingsContent(props: { organizationId: string; projectId: stri scope: ProjectAccessScope.Settings, member: organization?.me ?? null, redirect: true, - organizationId: props.organizationId, - projectId: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }); if (query.error) { - return ; + return ; } return ( @@ -393,17 +391,15 @@ function ProjectSettingsContent(props: { organizationId: string; projectId: stri
{project && organization ? ( <> - + {query.data?.isGitHubIntegrationFeatureEnabled && !project.isProjectNameInGitHubCheckEnabled ? ( ) : null} @@ -441,8 +437,8 @@ function ProjectSettingsContent(props: { organizationId: string; projectId: stri )} @@ -455,11 +451,14 @@ function ProjectSettingsContent(props: { organizationId: string; projectId: stri ); } -export function ProjectSettingsPage(props: { organizationId: string; projectId: string }) { +export function ProjectSettingsPage(props: { organizationSlug: string; projectSlug: string }) { return ( <> - + ); } @@ -468,8 +467,8 @@ export const DeleteProjectMutation = graphql(` mutation deleteProject($selector: ProjectSelectorInput!) { deleteProject(selector: $selector) { selector { - organization - project + organizationSlug + projectSlug } deletedProject { __typename @@ -482,10 +481,10 @@ export const DeleteProjectMutation = graphql(` export function DeleteProjectModal(props: { isOpen: boolean; toggleModalOpen: () => void; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; }) { - const { organizationId, projectId } = props; + const { organizationSlug, projectSlug } = props; const [, mutate] = useMutation(DeleteProjectMutation); const { toast } = useToast(); const router = useRouter(); @@ -493,8 +492,8 @@ export function DeleteProjectModal(props: { const handleDelete = async () => { const { error } = await mutate({ selector: { - organization: organizationId, - project: projectId, + organizationSlug, + projectSlug, }, }); @@ -513,7 +512,7 @@ export function DeleteProjectModal(props: { void router.navigate({ to: '/$organizationSlug', params: { - organizationSlug: organizationId, + organizationSlug, }, }); } diff --git a/packages/web/app/src/pages/project.tsx b/packages/web/app/src/pages/project.tsx index cb2a9358ed..ea6d06300f 100644 --- a/packages/web/app/src/pages/project.tsx +++ b/packages/web/app/src/pages/project.tsx @@ -37,8 +37,8 @@ const TargetCard = (props: { requestsOverTime: { date: string; value: number }[] | null; schemaVersionsCount: number | null; days: number; - organizationId: string; - projectId: string; + organizationSlug: string; + projectSlug: string; }): ReactElement => { const target = useFragment(TargetCard_TargetFragment, props.target); const { highestNumberOfRequests } = props; @@ -69,8 +69,8 @@ const TargetCard = (props: { @@ -214,7 +214,7 @@ export const ProjectIndexRouteSearch = z.object({ type RouteSearchProps = z.infer; const ProjectsPageContent = ( - props: { organizationId: string; projectId: string } & RouteSearchProps, + props: { organizationSlug: string; projectSlug: string } & RouteSearchProps, ) => { const period = useRef<{ from: string; @@ -246,8 +246,8 @@ const ProjectsPageContent = ( const [query] = useQuery({ query: ProjectOverviewPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, chartResolution: days, // 14 days = 14 data points period: period.current, }, @@ -303,14 +303,14 @@ const ProjectsPageContent = ( }, [targetConnection?.nodes]); if (query.error) { - return ; + return ; } return (
@@ -428,8 +428,8 @@ const ProjectsPageContent = ( highestNumberOfRequests={highestNumberOfRequests} requestsOverTime={target.requestsOverTime} schemaVersionsCount={target.schemaVersionsCount} - organizationId={props.organizationId} - projectId={props.projectId} + organizationSlug={props.organizationSlug} + projectSlug={props.projectSlug} /> )) ) @@ -443,8 +443,8 @@ const ProjectsPageContent = ( highestNumberOfRequests={highestNumberOfRequests} requestsOverTime={null} schemaVersionsCount={null} - organizationId={props.organizationId} - projectId={props.projectId} + organizationSlug={props.organizationSlug} + projectSlug={props.projectSlug} /> ))} @@ -457,12 +457,12 @@ const ProjectsPageContent = ( const ProjectOverviewPageQuery = graphql(` query ProjectOverviewPageQuery( - $organizationSlug: ID! - $projectSlug: ID! + $organizationSlug: String! + $projectSlug: String! $chartResolution: Int! $period: DateRangeInput! ) { - targets(selector: { organization: $organizationSlug, project: $projectSlug }) { + targets(selector: { organizationSlug: $organizationSlug, projectSlug: $projectSlug }) { total nodes { id @@ -480,14 +480,14 @@ const ProjectOverviewPageQuery = graphql(` `); export function ProjectPage( - props: { organizationId: string; projectId: string } & RouteSearchProps, + props: { organizationSlug: string; projectSlug: string } & RouteSearchProps, ): ReactElement { return ( <> @@ -150,9 +154,9 @@ export function TargetAppVersionPage(props: { <> @@ -163,9 +167,9 @@ export function TargetAppVersionPage(props: { App Deployments @@ -268,9 +272,9 @@ export function TargetAppVersionPage(props: { ; }) { const appDeployment = useFragment(AppTableRow_AppDeploymentFragment, props.appDeployment); @@ -114,9 +122,9 @@ function AppTableRow(props: { className="font-mono text-xs font-bold" to="/$organizationSlug/$projectSlug/$targetSlug/apps/$appName/$appVersion" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, appName: appDeployment.name, appVersion: appDeployment.version, }} @@ -166,13 +174,17 @@ function AppTableRow(props: { ); } -function TargetAppsView(props: { organizationId: string; projectId: string; targetId: string }) { +function TargetAppsView(props: { + organizationSlug: string; + projectSlug: string; + targetSlug: string; +}) { const [data] = useQuery({ query: TargetAppsViewQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }); const client = useClient(); @@ -187,9 +199,9 @@ function TargetAppsView(props: { organizationId: string; projectId: string; targ void router.navigate({ to: '/$organizationSlug/$projectSlug/$targetSlug', params: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, replace: true, }); @@ -260,9 +272,9 @@ function TargetAppsView(props: { organizationId: string; projectId: string; targ {data.data?.target?.appDeployments?.edges.map(edge => ( ))} @@ -283,9 +295,9 @@ function TargetAppsView(props: { organizationId: string; projectId: string; targ setIsLoadingMore(true); void client .query(TargetAppsViewFetchMoreQuery, { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, after: data?.data?.target?.appDeployments?.pageInfo?.endCursor, }) .toPromise() @@ -311,23 +323,23 @@ function TargetAppsView(props: { organizationId: string; projectId: string; targ } export function TargetAppsPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { return ( <> diff --git a/packages/web/app/src/pages/target-checks-single.tsx b/packages/web/app/src/pages/target-checks-single.tsx index fa860ab97f..edaed21921 100644 --- a/packages/web/app/src/pages/target-checks-single.tsx +++ b/packages/web/app/src/pages/target-checks-single.tsx @@ -52,9 +52,9 @@ const ApproveFailedSchemaCheckMutation = graphql(` `); function ApproveFailedSchemaCheckModal(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; schemaCheckId: string; contextId: string | null | undefined; onClose(): void; @@ -137,9 +137,9 @@ function ApproveFailedSchemaCheckModal(props: { onClick={() => approve({ input: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, schemaCheckId: props.schemaCheckId, comment: approvalComment, }, @@ -411,9 +411,9 @@ const DefaultSchemaView_SchemaCheckFragment = graphql(` function DefaultSchemaView(props: { schemaCheck: FragmentType; projectType: ProjectType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const schemaCheck = useFragment(DefaultSchemaView_SchemaCheckFragment, props.schemaCheck); const [selectedView, setSelectedView] = useState('details'); @@ -495,9 +495,9 @@ function DefaultSchemaView(props: { {schemaCheck.breakingSchemaChanges?.nodes.length ? (
} criticality={CriticalityLevel.Breaking} @@ -509,9 +509,9 @@ function DefaultSchemaView(props: { {schemaCheck.safeSchemaChanges ? (
; schemaCheck: FragmentType; projectType: ProjectType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const contractCheck = useFragment(ContractCheckView_ContractCheckFragment, props.contractCheck); const schemaCheck = useFragment(ContractCheckView_SchemaCheckFragment, props.schemaCheck); @@ -690,9 +690,9 @@ function ContractCheckView(props: { {contractCheck.breakingSchemaChanges?.nodes.length && (
} criticality={CriticalityLevel.Breaking} @@ -704,9 +704,9 @@ function ContractCheckView(props: { {contractCheck.safeSchemaChanges && (
; projectType: ProjectType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const schemaCheck = useFragment(SchemaChecksView_SchemaCheckFragment, props.schemaCheck); @@ -943,18 +943,18 @@ function SchemaChecksView(props: { {selectedContractCheckNode ? ( ) : ( @@ -1002,20 +1002,24 @@ const ActiveSchemaCheck_SchemaCheckFragment = graphql(` const ActiveSchemaCheckQuery = graphql(` query ActiveSchemaCheck_ActiveSchemaCheckQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $schemaCheckId: ID! ) { target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { id schemaCheck(id: $schemaCheckId) { ...ActiveSchemaCheck_SchemaCheckFragment } } - project(selector: { organization: $organizationSlug, project: $projectSlug }) { + project(selector: { organizationSlug: $organizationSlug, projectSlug: $projectSlug }) { id type } @@ -1024,17 +1028,17 @@ const ActiveSchemaCheckQuery = graphql(` const ActiveSchemaCheck = (props: { schemaCheckId: string | null; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): React.ReactElement | null => { const { schemaCheckId } = props; const [query] = useQuery({ query: ActiveSchemaCheckQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, schemaCheckId: schemaCheckId ?? '', }, pause: !schemaCheckId, @@ -1123,9 +1127,9 @@ const ActiveSchemaCheck = (props: { setApprovalOpen(false)} - organizationId={props.organizationId} - projectId={props.projectId} - targetId={props.targetId} + organizationSlug={props.organizationSlug} + projectSlug={props.projectSlug} + targetSlug={props.targetSlug} schemaCheckId={schemaCheck.id} contextId={schemaCheck.contextId} /> @@ -1175,9 +1179,9 @@ const ActiveSchemaCheck = (props: { ) : null}
@@ -1186,18 +1190,18 @@ const ActiveSchemaCheck = (props: { }; export function TargetChecksSinglePage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; schemaCheckId: string; }) { return ( <> diff --git a/packages/web/app/src/pages/target-checks.tsx b/packages/web/app/src/pages/target-checks.tsx index 285ba4ff0a..6b65df374a 100644 --- a/packages/web/app/src/pages/target-checks.tsx +++ b/packages/web/app/src/pages/target-checks.tsx @@ -18,14 +18,18 @@ import { Outlet, Link as RouterLink, useParams, useRouter } from '@tanstack/reac const SchemaChecks_NavigationQuery = graphql(` query SchemaChecks_NavigationQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $after: String $filters: SchemaChecksFilter ) { target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { id schemaChecks(first: 20, after: $after, filters: $filters) { @@ -68,17 +72,17 @@ const Navigation = (props: { isLastPage: boolean; onLoadMore: (cursor: string) => void; filters?: SchemaCheckFilters; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; schemaCheckId?: string; }) => { const [query] = useQuery({ query: SchemaChecks_NavigationQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, after: props.after, filters: { changed: props.filters?.showOnlyChanged ?? false, @@ -103,9 +107,9 @@ const Navigation = (props: { key={edge.node.id} to="/$organizationSlug/$projectSlug/$targetSlug/checks/$schemaCheckId" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, schemaCheckId: edge.node.id, }} search={{ @@ -171,12 +175,12 @@ const Navigation = (props: { const ChecksPageQuery = graphql(` query ChecksPageQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $filters: SchemaChecksFilter ) { - organization(selector: { organization: $organizationSlug }) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id rateLimit { @@ -185,7 +189,11 @@ const ChecksPageQuery = graphql(` } } target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { id schemaChecks(first: 1) { @@ -206,7 +214,11 @@ const ChecksPageQuery = graphql(` } `); -function ChecksPageContent(props: { organizationId: string; projectId: string; targetId: string }) { +function ChecksPageContent(props: { + organizationSlug: string; + projectSlug: string; + targetSlug: string; +}) { const [paginationVariables, setPaginationVariables] = useState>(() => [ null, ]); @@ -230,9 +242,9 @@ function ChecksPageContent(props: { organizationId: string; projectId: string; t const [query] = useQuery({ query: ChecksPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, filters: { changed: filters.showOnlyChanged ?? false, failed: filters.showOnlyFailed ?? false, @@ -241,7 +253,7 @@ function ChecksPageContent(props: { organizationId: string; projectId: string; t }); if (query.error) { - return ; + return ; } const hasSchemaChecks = !!query.data?.target?.schemaChecks?.edges?.length; @@ -282,9 +294,9 @@ function ChecksPageContent(props: { organizationId: string; projectId: string; t return ( <> @@ -327,9 +339,9 @@ function ChecksPageContent(props: { organizationId: string; projectId: string; t
{paginationVariables.map((cursor, index) => ( diff --git a/packages/web/app/src/pages/target-explorer-deprecated.tsx b/packages/web/app/src/pages/target-explorer-deprecated.tsx index 52a34790ce..195bc7feb0 100644 --- a/packages/web/app/src/pages/target-explorer-deprecated.tsx +++ b/packages/web/app/src/pages/target-explorer-deprecated.tsx @@ -152,13 +152,17 @@ const DeprecatedSchemaView = memo(function _DeprecatedSchemaView(props: { const DeprecatedSchemaExplorer_DeprecatedSchemaQuery = graphql(` query DeprecatedSchemaExplorer_DeprecatedSchemaQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $period: DateRangeInput! ) { target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { id slug @@ -176,9 +180,9 @@ const DeprecatedSchemaExplorer_DeprecatedSchemaQuery = graphql(` } operationsStats( selector: { - organization: $organizationSlug - project: $projectSlug - target: $targetSlug + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug period: $period } ) { @@ -215,7 +219,7 @@ function DeprecatedSchemaExplorer(props: { }, [dateRangeController.resolvedRange]); if (query.error) { - return ; + return ; } const latestSchemaVersion = query.data?.target?.latestSchemaVersion; @@ -237,9 +241,9 @@ function DeprecatedSchemaExplorer(props: { onUpdate={args => dateRangeController.setSelectedPreset(args.preset)} />
@@ -293,11 +297,11 @@ function DeprecatedSchemaExplorer(props: { const TargetExplorerDeprecatedSchemaPageQuery = graphql(` query TargetExplorerDeprecatedSchemaPageQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! ) { - organization(selector: { organization: $organizationSlug }) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id rateLimit { @@ -307,27 +311,31 @@ const TargetExplorerDeprecatedSchemaPageQuery = graphql(` } } hasCollectedOperations( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) } `); function ExplorerDeprecatedSchemaPageContent(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const [query] = useQuery({ query: TargetExplorerDeprecatedSchemaPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }); if (query.error) { - return ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -335,18 +343,18 @@ function ExplorerDeprecatedSchemaPageContent(props: { return ( {currentOrganization ? ( hasCollectedOperations ? ( ) : (
@@ -363,9 +371,9 @@ function ExplorerDeprecatedSchemaPageContent(props: { } export function TargetExplorerDeprecatedPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { return ( <> diff --git a/packages/web/app/src/pages/target-explorer-type.tsx b/packages/web/app/src/pages/target-explorer-type.tsx index 38bf8dfcce..f25d8693a2 100644 --- a/packages/web/app/src/pages/target-explorer-type.tsx +++ b/packages/web/app/src/pages/target-explorer-type.tsx @@ -123,13 +123,13 @@ export function TypeRenderer(props: { const TargetExplorerTypenamePageQuery = graphql(` query TargetExplorerTypenamePageQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $period: DateRangeInput! $typename: String! ) { - organization(selector: { organization: $organizationSlug }) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id slug @@ -139,7 +139,11 @@ const TargetExplorerTypenamePageQuery = graphql(` } } target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { id slug @@ -156,9 +160,9 @@ const TargetExplorerTypenamePageQuery = graphql(` } operationsStats( selector: { - organization: $organizationSlug - project: $projectSlug - target: $targetSlug + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug period: $period } ) { @@ -168,9 +172,9 @@ const TargetExplorerTypenamePageQuery = graphql(` `); function TypeExplorerPageContent(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; typename: string; }) { const { resolvedPeriod, dataRetentionInDays, setDataRetentionInDays } = @@ -178,9 +182,9 @@ function TypeExplorerPageContent(props: { const [query] = useQuery({ query: TargetExplorerTypenamePageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, period: resolvedPeriod, typename: props.typename, }, @@ -196,7 +200,7 @@ function TypeExplorerPageContent(props: { }, [setDataRetentionInDays, retentionInDays]); if (query.error) { - return ; + return ; } const currentTarget = query.data?.target; @@ -205,9 +209,9 @@ function TypeExplorerPageContent(props: { return (
@@ -219,9 +223,9 @@ function TypeExplorerPageContent(props: { {latestSchemaVersion && type ? ( <> @@ -229,9 +233,9 @@ function TypeExplorerPageContent(props: { @@ -242,9 +246,9 @@ function TypeExplorerPageContent(props: { ; + return ; } const latestSchemaVersion = query.data?.target?.latestSchemaVersion; @@ -235,9 +239,9 @@ function UnusedSchemaExplorer(props: { onUpdate={args => dateRangeController.setSelectedPreset(args.preset)} />
@@ -291,11 +295,11 @@ function UnusedSchemaExplorer(props: { const TargetExplorerUnusedSchemaPageQuery = graphql(` query TargetExplorerUnusedSchemaPageQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! ) { - organization(selector: { organization: $organizationSlug }) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id rateLimit { @@ -305,27 +309,31 @@ const TargetExplorerUnusedSchemaPageQuery = graphql(` } } hasCollectedOperations( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) } `); function ExplorerUnusedSchemaPageContent(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const [query] = useQuery({ query: TargetExplorerUnusedSchemaPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }); if (query.error) { - return ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -333,18 +341,18 @@ function ExplorerUnusedSchemaPageContent(props: { return ( {currentOrganization ? ( hasCollectedOperations ? ( ) : (
@@ -361,9 +369,9 @@ function ExplorerUnusedSchemaPageContent(props: { } export function TargetExplorerUnusedPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { return ( <> diff --git a/packages/web/app/src/pages/target-explorer.tsx b/packages/web/app/src/pages/target-explorer.tsx index 926934bdbc..889f79ca5c 100644 --- a/packages/web/app/src/pages/target-explorer.tsx +++ b/packages/web/app/src/pages/target-explorer.tsx @@ -96,12 +96,12 @@ function SchemaView(props: { const TargetExplorerPageQuery = graphql(` query TargetExplorerPageQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $period: DateRangeInput! ) { - organization(selector: { organization: $organizationSlug }) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id rateLimit { @@ -111,7 +111,11 @@ const TargetExplorerPageQuery = graphql(` } } target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { id slug @@ -129,9 +133,9 @@ const TargetExplorerPageQuery = graphql(` } operationsStats( selector: { - organization: $organizationSlug - project: $projectSlug - target: $targetSlug + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug period: $period } ) { @@ -141,18 +145,18 @@ const TargetExplorerPageQuery = graphql(` `); function ExplorerPageContent(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const { resolvedPeriod, dataRetentionInDays, setDataRetentionInDays } = useSchemaExplorerContext(); const [query] = useQuery({ query: TargetExplorerPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, period: resolvedPeriod, }, }); @@ -170,7 +174,7 @@ function ExplorerPageContent(props: { const isFilterVisible = useRef(false); if (query.error) { - return ; + return ; } const currentTarget = query.data?.target; @@ -183,9 +187,9 @@ function ExplorerPageContent(props: { return (
@@ -197,18 +201,18 @@ function ExplorerPageContent(props: { {isFilterVisible.current && ( <> @@ -234,9 +238,9 @@ function ExplorerPageContent(props: { @@ -248,9 +252,9 @@ function ExplorerPageContent(props: { ) : latestSchemaVersion ? ( @@ -265,9 +269,9 @@ function ExplorerPageContent(props: { } export function TargetExplorerPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { return ( <> diff --git a/packages/web/app/src/pages/target-history-version.tsx b/packages/web/app/src/pages/target-history-version.tsx index 953bba447d..a8764801e1 100644 --- a/packages/web/app/src/pages/target-history-version.tsx +++ b/packages/web/app/src/pages/target-history-version.tsx @@ -60,9 +60,9 @@ const SchemaVersionView_SchemaVersionFragment = graphql(` function SchemaVersionView(props: { schemaVersion: FragmentType; projectType: ProjectType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const schemaVersion = useFragment(SchemaVersionView_SchemaVersionFragment, props.schemaVersion); @@ -159,15 +159,15 @@ function SchemaVersionView(props: { ) : ( ; projectType: ProjectType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; hasContracts: boolean; }) { const schemaVersion = useFragment( @@ -326,9 +326,9 @@ function DefaultSchemaVersionView(props: { {schemaVersion.breakingSchemaChanges?.nodes.length && (
; projectType: ProjectType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const contractVersion = useFragment( ContractVersionView_ContractVersionFragment, @@ -500,9 +500,9 @@ function ContractVersionView(props: { {contractVersion.breakingSchemaChanges?.nodes.length && (
@@ -625,9 +631,9 @@ function ActiveSchemaVersion(props: { } export function TargetHistoryVersionPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; versionId: string; }) { return ; diff --git a/packages/web/app/src/pages/target-history.tsx b/packages/web/app/src/pages/target-history.tsx index 9cd6c88ae7..0a3e3d31d6 100644 --- a/packages/web/app/src/pages/target-history.tsx +++ b/packages/web/app/src/pages/target-history.tsx @@ -15,13 +15,19 @@ import { Link, Outlet, useParams, useRouter } from '@tanstack/react-router'; const HistoryPage_VersionsPageQuery = graphql(` query HistoryPage_VersionsPageQuery( - $organization: ID! - $project: ID! - $target: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! $first: Int! $after: String ) { - target(selector: { organization: $organization, project: $project, target: $target }) { + target( + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } + ) { id schemaVersions(first: $first, after: $after) { edges { @@ -64,17 +70,17 @@ function ListPage(props: { isLastPage: boolean; onLoadMore: (after: string) => void; versionId?: string; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const { variables, isLastPage, onLoadMore, versionId } = props; const [versionsQuery] = useQuery({ query: HistoryPage_VersionsPageQuery, variables: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, ...variables, }, requestPolicy: 'cache-and-network', @@ -97,9 +103,9 @@ function ListPage(props: { key={version.id} to="/$organizationSlug/$projectSlug/$targetSlug/history/$versionId" params={{ - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, versionId: version.id, }} > @@ -158,9 +164,17 @@ function ListPage(props: { } const TargetHistoryPageQuery = graphql(` - query TargetHistoryPageQuery($organizationSlug: ID!, $projectSlug: ID!, $targetSlug: ID!) { + query TargetHistoryPageQuery( + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! + ) { target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { id latestSchemaVersion { @@ -171,17 +185,17 @@ const TargetHistoryPageQuery = graphql(` `); function HistoryPageContent(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const router = useRouter(); const [query] = useQuery({ query: TargetHistoryPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }); const [pageVariables, setPageVariables] = useState([{ first: 10, after: null as string | null }]); @@ -197,9 +211,9 @@ function HistoryPageContent(props: { void router.navigate({ to: '/$organizationSlug/$projectSlug/$targetSlug/history/$versionId', params: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, versionId: currentTarget.latestSchemaVersion.id, }, }); @@ -207,14 +221,14 @@ function HistoryPageContent(props: { }, [versionId, currentTarget?.latestSchemaVersion?.id]); if (query.error) { - return ; + return ; } return ( @@ -236,9 +250,9 @@ function HistoryPageContent(props: { setPageVariables([...pageVariables, { after, first: 10 }]); }} versionId={versionId} - organizationId={props.organizationId} - projectId={props.projectId} - targetId={props.targetId} + organizationSlug={props.organizationSlug} + projectSlug={props.projectSlug} + targetSlug={props.targetSlug} /> ))}
@@ -260,9 +274,9 @@ function HistoryPageContent(props: { } export function TargetHistoryPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { return ( <> diff --git a/packages/web/app/src/pages/target-insights-client.tsx b/packages/web/app/src/pages/target-insights-client.tsx index 16c4590e74..fcd4f303ac 100644 --- a/packages/web/app/src/pages/target-insights-client.tsx +++ b/packages/web/app/src/pages/target-insights-client.tsx @@ -62,9 +62,9 @@ function ClientView(props: { query: ClientView_ClientStatsQuery, variables: { selector: { - organization: props.organizationSlug, - project: props.projectSlug, - target: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, client: props.clientName, period: dateRangeController.resolvedRange, }, @@ -93,7 +93,7 @@ function ClientView(props: { const totalOperations = query.data?.clientStats?.operations.nodes.length ?? 0; if (query.error) { - return ; + return ; } return ( @@ -335,8 +335,12 @@ function ClientView(props: { } const ClientInsightsPageQuery = graphql(` - query ClientInsightsPageQuery($organizationSlug: ID!, $projectSlug: ID!, $targetSlug: ID!) { - organization(selector: { organization: $organizationSlug }) { + query ClientInsightsPageQuery( + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! + ) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id slug @@ -346,28 +350,32 @@ const ClientInsightsPageQuery = graphql(` } } hasCollectedOperations( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) } `); function ClientInsightsPageContent(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; name: string; }) { const [query] = useQuery({ query: ClientInsightsPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }); if (query.error) { - return ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -375,9 +383,9 @@ function ClientInsightsPageContent(props: { return ( {currentOrganization ? ( @@ -385,9 +393,9 @@ function ClientInsightsPageContent(props: { ) : (
@@ -404,9 +412,9 @@ function ClientInsightsPageContent(props: { } export function TargetInsightsClientPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; name: string; }) { return ( diff --git a/packages/web/app/src/pages/target-insights-coordinate.tsx b/packages/web/app/src/pages/target-insights-coordinate.tsx index 95b863bcbf..0f2cbaf0b6 100644 --- a/packages/web/app/src/pages/target-insights-coordinate.tsx +++ b/packages/web/app/src/pages/target-insights-coordinate.tsx @@ -79,16 +79,16 @@ function SchemaCoordinateView(props: { query: SchemaCoordinateView_SchemaCoordinateStatsQuery, variables: { selector: { - organization: props.organizationSlug, - project: props.projectSlug, - target: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, schemaCoordinate: props.coordinate, period: dateRangeController.resolvedRange, }, targetSelector: { - organization: props.organizationSlug, - project: props.projectSlug, - target: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, resolution: dateRangeController.resolution, }, @@ -114,7 +114,7 @@ function SchemaCoordinateView(props: { const totalClients = query.data?.schemaCoordinateStats?.clients.nodes.length ?? 0; if (query.error) { - return ; + return ; } return ( @@ -386,11 +386,11 @@ function SchemaCoordinateView(props: { const TargetSchemaCoordinatePageQuery = graphql(` query TargetSchemaCoordinatePageQuery( - $organizationSlug: ID! - $projectSlug: ID! - $targetSlug: ID! + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! ) { - organization(selector: { organization: $organizationSlug }) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id slug @@ -400,28 +400,32 @@ const TargetSchemaCoordinatePageQuery = graphql(` } } hasCollectedOperations( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) } `); function TargetSchemaCoordinatePageContent(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; coordinate: string; }) { const [query] = useQuery({ query: TargetSchemaCoordinatePageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }); if (query.error) { - return ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -429,9 +433,9 @@ function TargetSchemaCoordinatePageContent(props: { return ( {currentOrganization ? ( @@ -439,9 +443,9 @@ function TargetSchemaCoordinatePageContent(props: { ) : (
@@ -458,9 +462,9 @@ function TargetSchemaCoordinatePageContent(props: { } export function TargetInsightsCoordinatePage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; coordinate: string; }) { return ( diff --git a/packages/web/app/src/pages/target-insights-operation.tsx b/packages/web/app/src/pages/target-insights-operation.tsx index 5a80fcc639..d8e1586e1d 100644 --- a/packages/web/app/src/pages/target-insights-operation.tsx +++ b/packages/web/app/src/pages/target-insights-operation.tsx @@ -77,9 +77,9 @@ function OperationView({ query: Operation_View_OperationBodyQuery, variables: { selector: { - organization: organizationSlug, - project: projectSlug, - target: targetSlug, + organizationSlug, + projectSlug, + targetSlug, }, hash: operationHash, }, @@ -102,9 +102,9 @@ function OperationView({ period={dateRangeController.resolvedRange} selected={selectedClients} onFilter={setSelectedClients} - organizationId={organizationSlug} - projectId={projectSlug} - targetId={targetSlug} + organizationSlug={organizationSlug} + projectSlug={projectSlug} + targetSlug={targetSlug} /> {!result.fetching && isNotNoQueryOrMutation === false ? ( ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -195,17 +203,17 @@ function OperationInsightsContent(props: { return ( {currentOrganization ? ( hasCollectedOperations ? (
; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -140,17 +148,17 @@ function TargetOperationsPageContent(props: { return ( {currentOrganization ? ( hasCollectedOperations ? ( ) : ( @@ -168,9 +176,9 @@ function TargetOperationsPageContent(props: { } export function TargetInsightsPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { return ( <> diff --git a/packages/web/app/src/pages/target-laboratory.tsx b/packages/web/app/src/pages/target-laboratory.tsx index fc7db7d1f2..96a984ec49 100644 --- a/packages/web/app/src/pages/target-laboratory.tsx +++ b/packages/web/app/src/pages/target-laboratory.tsx @@ -98,29 +98,29 @@ const UpdateOperationMutation = graphql(` `); function Save(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }): ReactElement { const router = useRouter(); const [operationModalOpen, toggleOperationModal] = useToggle(); const { collections } = useCollections({ - organizationId: props.organizationId, - projectId: props.projectId, - targetId: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }); const notify = useNotifications(); const currentOperation = useCurrentOperation({ - organizationId: props.organizationId, - projectId: props.projectId, - targetId: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }); const [, mutateUpdate] = useMutation(UpdateOperationMutation); const { queryEditor, variableEditor, headerEditor, updateActiveTabValues } = useEditorContext()!; const { clearOperation } = useSyncOperationState({ - organizationId: props.organizationId, - projectId: props.projectId, - targetId: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }); const operationFromQueryString = useOperationFromQueryString(); @@ -133,9 +133,9 @@ function Save(props: { void router.navigate({ to: '/$organizationSlug/$projectSlug/$targetSlug/laboratory', params: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, search: { operation: id }, }); @@ -194,9 +194,9 @@ function Save(props: { } const { error, data } = await mutateUpdate({ selector: { - target: props.targetId, - organization: props.organizationId, - project: props.projectId, + targetSlug: props.targetSlug, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, input: { name: currentOperation.name, @@ -231,9 +231,9 @@ function Save(props: { { const operations = collections.flatMap(collection => @@ -277,7 +277,7 @@ function LaboratoryPageContent(props: { query.data?.target?.graphqlEndpointUrl ?? null, ); - const mockEndpoint = `${location.origin}/api/lab/${props.organizationId}/${props.projectId}/${props.targetId}`; + const mockEndpoint = `${location.origin}/api/lab/${props.organizationSlug}/${props.projectSlug}/${props.targetSlug}`; const fetcher = useMemo(() => { return async (params, opts) => { @@ -315,7 +315,7 @@ function LaboratoryPageContent(props: { }, [query.data?.target?.graphqlEndpointUrl, actualSelectedApiEndpoint]); if (query.error) { - return ; + return ; } const FullScreenIcon = isFullScreen ? ExitFullScreenIcon : EnterFullScreenIcon; @@ -327,9 +327,9 @@ function LaboratoryPageContent(props: { void router.navigate({ to: '/$organizationSlug/$projectSlug/$targetSlug/laboratory', params: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, search: userOperations.has(activeTab.id) ? { operation: activeTab.id } : {}, }); @@ -339,9 +339,9 @@ function LaboratoryPageContent(props: { return ( @@ -361,9 +361,9 @@ function LaboratoryPageContent(props: { @@ -468,9 +468,9 @@ function LaboratoryPageContent(props: { {({ prettify }) => ( <> {prettify} @@ -490,9 +490,9 @@ function LaboratoryPageContent(props: { } export function TargetLaboratoryPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { return ( <> diff --git a/packages/web/app/src/pages/target-settings.tsx b/packages/web/app/src/pages/target-settings.tsx index b378ea116b..707d25bd85 100644 --- a/packages/web/app/src/pages/target-settings.tsx +++ b/packages/web/app/src/pages/target-settings.tsx @@ -86,9 +86,9 @@ export const DeleteTokensDocument = graphql(` mutation deleteTokens($input: DeleteTokensInput!) { deleteTokens(input: $input) { selector { - organization - project - target + organizationSlug + projectSlug + targetSlug } deletedTokens } @@ -112,9 +112,9 @@ export const TokensDocument = graphql(` function RegistryAccessTokens(props: { me: FragmentType; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const me = useFragment(RegistryAccessTokens_MeFragment, props.me); const [{ fetching: deleting }, mutate] = useMutation(DeleteTokensDocument); @@ -125,9 +125,9 @@ function RegistryAccessTokens(props: { query: TokensDocument, variables: { selector: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }, }); @@ -137,14 +137,14 @@ function RegistryAccessTokens(props: { const deleteTokens = useCallback(async () => { await mutate({ input: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, - tokens: checked, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, + tokenIds: checked, }, }); setChecked([]); - }, [checked, mutate, props.organizationId, props.projectId, props.targetId]); + }, [checked, mutate, props.organizationSlug, props.projectSlug, props.targetSlug]); const canManage = canAccessTarget(TargetAccessScope.TokensWrite, me); @@ -214,9 +214,9 @@ function RegistryAccessTokens(props: {
{isModalOpen && ( @@ -243,9 +243,9 @@ const Settings_UpdateBaseSchemaMutation = graphql(` const ExtendBaseSchema = (props: { baseSchema: string; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) => { const [mutation, mutate] = useMutation(Settings_UpdateBaseSchemaMutation); const [baseSchema, setBaseSchema] = useState(props.baseSchema); @@ -296,9 +296,9 @@ const ExtendBaseSchema = (props: { onClick={async () => { await mutate({ input: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, newBase: baseSchema, }, }).then(result => { @@ -348,9 +348,9 @@ const ClientExclusion_AvailableClientNamesQuery = graphql(` function ClientExclusion( props: PropsWithoutRef< { - organizationId: string; - projectId: string; - selectedTargets: string[]; + organizationSlug: string; + projectSlug: string; + selectedTargetIds: string[]; clientsFromSettings: string[]; value: string[]; } & Pick, 'name' | 'disabled' | 'onBlur' | 'onChange'> @@ -361,9 +361,9 @@ function ClientExclusion( query: ClientExclusion_AvailableClientNamesQuery, variables: { selector: { - organization: props.organizationId, - project: props.projectId, - targetIds: props.selectedTargets, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetIds: props.selectedTargetIds, period: { from: formatISO(subDays(now, 90)), to: formatISO(now), @@ -462,9 +462,9 @@ function floorDate(date: Date): Date { } const ConditionalBreakingChanges = (props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) => { const [targetValidation, setValidation] = useMutation(SetTargetValidationMutation); const [mutation, updateValidation] = useMutation( @@ -474,16 +474,16 @@ const ConditionalBreakingChanges = (props: { query: TargetSettingsPage_TargetSettingsQuery, variables: { selector: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, targetsSelector: { - organization: props.organizationId, - project: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, }, organizationSelector: { - organization: props.organizationId, + organizationSlug: props.organizationSlug, }, }, }); @@ -508,7 +508,7 @@ const ConditionalBreakingChanges = (props: { initialValues: { percentage: settings?.percentage || 0, period: settings?.period || 0, - targets: settings?.targets.map(t => t.id) || [], + targetIds: settings?.targets.map(t => t.id) || [], excludedClients: settings?.excludedClients ?? [], }, validationSchema: Yup.object().shape({ @@ -526,15 +526,15 @@ const ConditionalBreakingChanges = (props: { return Number(num.toFixed(2)) === num; }) .required(), - targets: Yup.array().of(Yup.string()).min(1), + targetIds: Yup.array().of(Yup.string()).min(1), excludedClients: Yup.array().of(Yup.string()), }), onSubmit: values => updateValidation({ input: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, ...values, }, }).then(result => { @@ -586,9 +586,9 @@ const ConditionalBreakingChanges = (props: { onCheckedChange={async enabled => { await setValidation({ input: { - target: props.targetId, // targetId is the target we are updating - project: props.projectId, - organization: props.organizationId, + targetSlug: props.targetSlug, + projectSlug: props.projectSlug, + organizationSlug: props.organizationSlug, enabled, }, }); @@ -652,11 +652,11 @@ const ConditionalBreakingChanges = (props: {
- {values.targets.length > 0 ? ( + {values.targetIds.length > 0 ? ( (
{ await setFieldValue( 'targets', isChecked - ? [...values.targets, pt.id] - : values.targets.filter(value => value !== pt.id), + ? [...values.targetIds, pt.id] + : values.targetIds.filter(value => value !== pt.id), ); }} onBlur={() => setFieldTouched('targets', true)} @@ -706,8 +706,8 @@ const ConditionalBreakingChanges = (props: {
- {touched.targets && errors.targets && ( -
{errors.targets}
+ {touched.targetIds && errors.targetIds && ( +
{errors.targetIds}
)}
@@ -753,7 +753,7 @@ const SlugFormSchema = z.object({ }); type SlugFormValues = z.infer; -function TargetSlug(props: { organizationId: string; projectId: string; targetId: string }) { +function TargetSlug(props: { organizationSlug: string; projectSlug: string; targetSlug: string }) { const router = useRouter(); const { toast } = useToast(); @@ -762,7 +762,7 @@ function TargetSlug(props: { organizationId: string; projectId: string; targetId mode: 'all', resolver: zodResolver(SlugFormSchema), defaultValues: { - slug: props.targetId, + slug: props.targetSlug, }, }); @@ -771,9 +771,9 @@ function TargetSlug(props: { organizationId: string; projectId: string; targetId try { const result = await slugMutate({ input: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, slug: data.slug, }, }); @@ -789,8 +789,8 @@ function TargetSlug(props: { organizationId: string; projectId: string; targetId void router.navigate({ to: '/$organizationSlug/$projectSlug/$targetSlug/settings', params: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, targetSlug: result.data.updateTargetSlug.ok.target.slug, }, search: { @@ -842,8 +842,8 @@ function TargetSlug(props: { organizationId: string; projectId: string; targetId
- {env.appBaseUrl.replace(/https?:\/\//i, '')}/{props.organizationId}/ - {props.projectId}/ + {env.appBaseUrl.replace(/https?:\/\//i, '')}/{props.organizationSlug}/ + {props.projectSlug}/
@@ -882,9 +882,9 @@ const TargetSettingsPage_UpdateTargetGraphQLEndpointUrl = graphql(` function GraphQLEndpointUrl(props: { graphqlEndpointUrl: string | null; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { const { toast } = useToast(); const [mutation, mutate] = useMutation(TargetSettingsPage_UpdateTargetGraphQLEndpointUrl); @@ -903,9 +903,9 @@ function GraphQLEndpointUrl(props: { onSubmit: values => mutate({ input: { - organization: props.organizationId, - project: props.projectId, - target: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, graphqlEndpointUrl: values.graphqlEndpointUrl === '' ? null : values.graphqlEndpointUrl, }, }).then(result => { @@ -937,9 +937,9 @@ function GraphQLEndpointUrl(props: { Hive Laboratory @@ -988,9 +988,9 @@ const TargetSettingsPage_UpdateTargetSlugMutation = graphql(` updateTargetSlug(input: $input) { ok { selector { - organization - project - target + organizationSlug + projectSlug + targetSlug } target { id @@ -1022,7 +1022,11 @@ const TargetSettingsPage_OrganizationFragment = graphql(` } `); -function TargetDelete(props: { organizationId: string; projectId: string; targetId: string }) { +function TargetDelete(props: { + organizationSlug: string; + projectSlug: string; + targetSlug: string; +}) { const [isModalOpen, toggleModalOpen] = useToggle(); return ( @@ -1051,9 +1055,9 @@ function TargetDelete(props: { organizationId: string; projectId: string; target @@ -1062,8 +1066,12 @@ function TargetDelete(props: { organizationId: string; projectId: string; target } const TargetSettingsPageQuery = graphql(` - query TargetSettingsPageQuery($organizationSlug: ID!, $projectSlug: ID!, $targetSlug: ID!) { - organization(selector: { organization: $organizationSlug }) { + query TargetSettingsPageQuery( + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! + ) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { id slug @@ -1073,13 +1081,17 @@ const TargetSettingsPageQuery = graphql(` } } } - project(selector: { organization: $organizationSlug, project: $projectSlug }) { + project(selector: { organizationSlug: $organizationSlug, projectSlug: $projectSlug }) { id slug type } target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { id slug @@ -1119,18 +1131,18 @@ const subPages = [ type SubPage = (typeof subPages)[number]['key']; function TargetSettingsContent(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; page?: SubPage; }) { const router = useRouter(); const [query] = useQuery({ query: TargetSettingsPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }); @@ -1166,14 +1178,14 @@ function TargetSettingsContent(props: { ); if (query.error) { - return ; + return ; } return ( {currentOrganization && currentProject && currentTarget && organizationForSettings ? ( @@ -1215,21 +1227,21 @@ function TargetSettingsContent(props: { {props.page === 'general' && hasSettingsAccess ? ( <> {hasDeleteAccess && ( )} @@ -1237,39 +1249,39 @@ function TargetSettingsContent(props: { {props.page === 'cdn' && hasReadAccess ? ( ) : null} {props.page === 'registry-token' && hasTokensWriteAccess ? ( ) : null} {props.page === 'breaking-changes' && hasSettingsAccess ? ( ) : null} {props.page === 'base-schema' && hasRegistryWriteAccess ? ( ) : null} {props.page === 'schema-contracts' && hasSettingsAccess ? ( ) : null}
@@ -1282,18 +1294,18 @@ function TargetSettingsContent(props: { } export function TargetSettingsPage(props: { - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; page?: SubPage; }) { return ( <> @@ -1303,11 +1315,6 @@ export function TargetSettingsPage(props: { export const DeleteTargetMutation = graphql(` mutation deleteTarget($selector: TargetSelectorInput!) { deleteTarget(selector: $selector) { - selector { - organization - project - target - } deletedTarget { __typename id @@ -1319,11 +1326,11 @@ export const DeleteTargetMutation = graphql(` export function DeleteTargetModal(props: { isOpen: boolean; toggleModalOpen: () => void; - organizationId: string; - projectId: string; - targetId: string; + organizationSlug: string; + projectSlug: string; + targetSlug: string; }) { - const { organizationId, projectId, targetId } = props; + const { organizationSlug, projectSlug, targetSlug } = props; const [, mutate] = useMutation(DeleteTargetMutation); const { toast } = useToast(); const router = useRouter(); @@ -1331,9 +1338,9 @@ export function DeleteTargetModal(props: { const handleDelete = async () => { const { error } = await mutate({ selector: { - organization: organizationId, - project: projectId, - target: targetId, + organizationSlug, + projectSlug, + targetSlug, }, }); if (error) { @@ -1351,8 +1358,8 @@ export function DeleteTargetModal(props: { void router.navigate({ to: '/$organizationSlug/$projectSlug', params: { - organizationSlug: organizationId, - projectSlug: projectId, + organizationSlug: organizationSlug, + projectSlug: projectSlug, }, }); } diff --git a/packages/web/app/src/pages/target.tsx b/packages/web/app/src/pages/target.tsx index f137f4459e..e95d1a5a00 100644 --- a/packages/web/app/src/pages/target.tsx +++ b/packages/web/app/src/pages/target.tsx @@ -188,9 +188,9 @@ function SchemaView(props: { scope: TargetAccessScope.RegistryWrite, member: organization.me, redirect: false, - organizationId: organization.slug, - projectId: project.slug, - targetId: target.slug, + organizationSlug: organization.slug, + projectSlug: project.slug, + targetSlug: target.slug, }); const { latestSchemaVersion } = target; @@ -272,9 +272,9 @@ function SchemaView(props: { {canMarkAsValid ? ( <> {' '} @@ -287,35 +287,47 @@ function SchemaView(props: { } const TargetSchemaPageQuery = graphql(` - query TargetSchemaPageQuery($organizationSlug: ID!, $projectSlug: ID!, $targetSlug: ID!) { - organization(selector: { organization: $organizationSlug }) { + query TargetSchemaPageQuery( + $organizationSlug: String! + $projectSlug: String! + $targetSlug: String! + ) { + organization(selector: { organizationSlug: $organizationSlug }) { organization { ...SchemaView_OrganizationFragment } } - project(selector: { organization: $organizationSlug, project: $projectSlug }) { + project(selector: { organizationSlug: $organizationSlug, projectSlug: $projectSlug }) { ...SchemaView_ProjectFragment } target( - selector: { organization: $organizationSlug, project: $projectSlug, target: $targetSlug } + selector: { + organizationSlug: $organizationSlug + projectSlug: $projectSlug + targetSlug: $targetSlug + } ) { ...SchemaView_TargetFragment } } `); -function TargetSchemaPage(props: { organizationId: string; projectId: string; targetId: string }) { +function TargetSchemaPage(props: { + organizationSlug: string; + projectSlug: string; + targetSlug: string; +}) { const [query] = useQuery({ query: TargetSchemaPageQuery, variables: { - organizationSlug: props.organizationId, - projectSlug: props.projectId, - targetSlug: props.targetId, + organizationSlug: props.organizationSlug, + projectSlug: props.projectSlug, + targetSlug: props.targetSlug, }, }); if (query.error) { - return ; + return ; } const currentOrganization = query.data?.organization?.organization; @@ -324,9 +336,9 @@ function TargetSchemaPage(props: { organizationId: string; projectId: string; ta return (
@@ -339,9 +351,9 @@ function TargetSchemaPage(props: { organizationId: string; projectId: string; ta Unused schema @@ -352,9 +364,9 @@ function TargetSchemaPage(props: { organizationId: string; projectId: string; ta Deprecated schema @@ -371,14 +383,18 @@ function TargetSchemaPage(props: { organizationId: string; projectId: string; ta ); } -export function TargetPage(props: { organizationId: string; projectId: string; targetId: string }) { +export function TargetPage(props: { + organizationSlug: string; + projectSlug: string; + targetSlug: string; +}) { return ( <> ); diff --git a/packages/web/app/src/router.tsx b/packages/web/app/src/router.tsx index 8fbd5241f5..8456ac4965 100644 --- a/packages/web/app/src/router.tsx +++ b/packages/web/app/src/router.tsx @@ -331,7 +331,7 @@ const transferOrganizationRoute = createRoute({ path: 'action/transfer/$organizationSlug/$code', component: function TransferOrganizationRoute() { const { organizationSlug, code } = transferOrganizationRoute.useParams(); - return ; + return ; }, }); @@ -351,7 +351,7 @@ const organizationIndexRoute = createRoute({ const { search, sortBy, sortOrder } = organizationIndexRoute.useSearch(); return ( ; + return ; }, }); @@ -376,7 +376,9 @@ const organizationSupportTicketRoute = createRoute({ path: 'view/support/ticket/$ticketId', component: function OrganizationSupportTicketRoute() { const { organizationSlug, ticketId } = organizationSupportTicketRoute.useParams(); - return ; + return ( + + ); }, }); @@ -385,7 +387,7 @@ const organizationSubscriptionRoute = createRoute({ path: 'view/subscription', component: function OrganizationSubscriptionRoute() { const { organizationSlug } = organizationSubscriptionRoute.useParams(); - return ; + return ; }, }); @@ -405,7 +407,7 @@ const organizationSubscriptionManageRoute = createRoute({ path: 'view/manage-subscription', component: function OrganizationSubscriptionManageRoute() { const { organizationSlug } = organizationSubscriptionManageRoute.useParams(); - return ; + return ; }, }); @@ -414,7 +416,7 @@ const organizationPolicyRoute = createRoute({ path: 'view/policy', component: function OrganizationPolicyRoute() { const { organizationSlug } = organizationPolicyRoute.useParams(); - return ; + return ; }, }); @@ -423,7 +425,7 @@ const organizationSettingsRoute = createRoute({ path: 'view/settings', component: function OrganizationSettingsRoute() { const { organizationSlug } = organizationSettingsRoute.useParams(); - return ; + return ; }, }); @@ -450,7 +452,7 @@ const organizationMembersRoute = createRoute({ return ( @@ -474,8 +476,8 @@ const projectIndexRoute = createRoute({ const { search, sortBy, sortOrder } = projectIndexRoute.useSearch(); return ( ; + return ; }, }); @@ -498,7 +500,7 @@ const projectPolicyRoute = createRoute({ path: 'view/policy', component: function ProjectPolicyRoute() { const { organizationSlug, projectSlug } = projectPolicyRoute.useParams(); - return ; + return ; }, }); @@ -507,7 +509,7 @@ const projectAlertsRoute = createRoute({ path: 'view/alerts', component: function ProjectAlertsRoute() { const { organizationSlug, projectSlug } = projectAlertsRoute.useParams(); - return ; + return ; }, }); @@ -524,7 +526,11 @@ const targetIndexRoute = createRoute({ component: function TargetRoute() { const { organizationSlug, projectSlug, targetSlug } = targetIndexRoute.useParams(); return ( - + ); }, }); @@ -555,9 +561,9 @@ const targetSettingsRoute = createRoute({ return ( ); @@ -571,9 +577,9 @@ const targetLaboratoryRoute = createRoute({ const { organizationSlug, projectSlug, targetSlug } = targetLaboratoryRoute.useParams(); return ( ); }, @@ -586,9 +592,9 @@ const targetAppsRoute = createRoute({ const { organizationSlug, projectSlug, targetSlug } = targetAppsRoute.useParams(); return ( ); }, @@ -602,9 +608,9 @@ const targetAppVersionRoute = createRoute({ targetAppVersionRoute.useParams(); return ( @@ -619,9 +625,9 @@ const targetInsightsRoute = createRoute({ const { organizationSlug, projectSlug, targetSlug } = targetInsightsRoute.useParams(); return ( ); }, @@ -635,9 +641,9 @@ const targetInsightsCoordinateRoute = createRoute({ targetInsightsCoordinateRoute.useParams(); return ( ); @@ -652,9 +658,9 @@ const targetInsightsClientRoute = createRoute({ targetInsightsClientRoute.useParams(); return ( ); @@ -669,9 +675,9 @@ const targetInsightsOperationsRoute = createRoute({ targetInsightsOperationsRoute.useParams(); return ( @@ -686,9 +692,9 @@ const targetHistoryRoute = createRoute({ const { organizationSlug, projectSlug, targetSlug } = targetHistoryRoute.useParams(); return ( ); }, @@ -702,9 +708,9 @@ const targetHistoryVersionRoute = createRoute({ targetHistoryVersionRoute.useParams(); return ( ); @@ -718,9 +724,9 @@ const targetExplorerRoute = createRoute({ const { organizationSlug, projectSlug, targetSlug } = targetExplorerRoute.useParams(); return ( ); }, @@ -734,9 +740,9 @@ const targetExplorerTypeRoute = createRoute({ targetExplorerTypeRoute.useParams(); return ( ); @@ -750,9 +756,9 @@ const targetExplorerDeprecatedRoute = createRoute({ const { organizationSlug, projectSlug, targetSlug } = targetExplorerDeprecatedRoute.useParams(); return ( ); }, @@ -765,9 +771,9 @@ const targetExplorerUnusedRoute = createRoute({ const { organizationSlug, projectSlug, targetSlug } = targetExplorerUnusedRoute.useParams(); return ( ); }, @@ -780,9 +786,9 @@ const targetChecksRoute = createRoute({ const { organizationSlug, projectSlug, targetSlug } = targetChecksRoute.useParams(); return ( ); }, @@ -796,9 +802,9 @@ const targetChecksSingleRoute = createRoute({ targetChecksSingleRoute.useParams(); return ( ); diff --git a/packages/web/app/src/server/github.ts b/packages/web/app/src/server/github.ts index 663038f447..44d9638118 100644 --- a/packages/web/app/src/server/github.ts +++ b/packages/web/app/src/server/github.ts @@ -24,8 +24,8 @@ const SetupCallbackQuery = z.object({ }); const ConnectParams = z.object({ - organizationId: z.string({ - required_error: 'Invalid organizationId', + organizationSlug: z.string({ + required_error: 'Invalid organizationSlug', }), }); @@ -38,16 +38,16 @@ export function connectGithub(server: FastifyInstance) { return; } - const { installation_id: installationId, state: orgId } = queryResult.data; + const { installation_id: installationId, state: organizationSlug } = queryResult.data; // const installationId = req.query.installation_id as string; // const orgId = req.query.state as string; await ensureGithubIntegration(req, { installationId, - orgId, + organizationSlug, }); - void res.redirect(`/${orgId}/view/settings`); + void res.redirect(`/${organizationSlug}/view/settings`); }); server.get('/api/github/setup-callback', async (req, res) => { @@ -58,14 +58,18 @@ export function connectGithub(server: FastifyInstance) { return; } - let { installation_id: installationId, state: orgId } = queryResult.data; + let { installation_id: installationId, state: organizationSlug } = queryResult.data; - req.log.info('GitHub setup callback (installationId=%s, orgId=%s)', installationId, orgId); + req.log.info( + 'GitHub setup callback (installationId=%s, organizationSlug=%s)', + installationId, + organizationSlug, + ); - if (orgId) { + if (organizationSlug) { await ensureGithubIntegration(req, { installationId, - orgId, + organizationSlug, }); } else { const result = await graphql<{ @@ -94,17 +98,17 @@ export function connectGithub(server: FastifyInstance) { }, }); - orgId = result.data?.organizationByGitHubInstallationId?.slug; + organizationSlug = result.data?.organizationByGitHubInstallationId?.slug; } - if (orgId) { - void res.redirect(`/${orgId}/view/settings`); + if (organizationSlug) { + void res.redirect(`/${organizationSlug}/view/settings`); } else { void res.redirect('/'); } }); - server.get('/api/github/connect/:organizationId', async (req, res) => { + server.get('/api/github/connect/:organizationSlug', async (req, res) => { if (!env.github) { req.log.error('GitHub is not set up.'); throw new Error('GitHub is not set up.'); @@ -117,15 +121,15 @@ export function connectGithub(server: FastifyInstance) { return; } - const { organizationId } = paramsResult.data; + const { organizationSlug } = paramsResult.data; - req.log.info('Connect to GitHub (orgId=%s)', organizationId); + req.log.info('Connect to GitHub (organizationSlug=%s)', organizationSlug); const url = `https://github.com/apps/${env.github.appName}/installations/new`; const redirectUrl = `${env.appBaseUrl}/api/github/callback`; - void res.redirect(`${url}?state=${organizationId}&redirect_url=${redirectUrl}`); + void res.redirect(`${url}?state=${organizationSlug}&redirect_url=${redirectUrl}`); }); } @@ -133,10 +137,10 @@ async function ensureGithubIntegration( req: FastifyRequest, input: { installationId: string; - orgId: string; + organizationSlug: string; }, ) { - const { orgId, installationId } = input; + const { organizationSlug, installationId } = input; await graphql({ url: env.graphqlPublicEndpoint, headers: { @@ -153,7 +157,7 @@ async function ensureGithubIntegration( `, variables: { input: { - organization: orgId, + organizationSlug, installationId, }, }, diff --git a/packages/web/app/src/server/lab.ts b/packages/web/app/src/server/lab.ts index 06c23e23f3..0b07e2b015 100644 --- a/packages/web/app/src/server/lab.ts +++ b/packages/web/app/src/server/lab.ts @@ -5,14 +5,17 @@ import { env } from '@/env/backend'; import { addMocksToSchema } from '@graphql-tools/mock'; const LabParams = z.object({ - organizationId: z.string({ - required_error: 'Missing organizationId (format /api/lab/:organizationId/:projectId/:targetId)', + organizationSlug: z.string({ + required_error: + 'Missing organizationSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)', }), - projectId: z.string({ - required_error: 'Missing projectId (format /api/lab/:organizationId/:projectId/:targetId)', + projectSlug: z.string({ + required_error: + 'Missing projectSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)', }), - targetId: z.string({ - required_error: 'Missing targetId (format /api/lab/:organizationId/:projectId/:targetId)', + targetSlug: z.string({ + required_error: + 'Missing targetSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)', }), }); @@ -25,7 +28,7 @@ const LabBody = z.object({ }); export function connectLab(server: FastifyInstance) { - server.all('/api/lab/:organizationId/:projectId/:targetId', async (req, res) => { + server.all('/api/lab/:organizationSlug/:projectSlug/:targetSlug', async (req, res) => { const url = env.graphqlPublicEndpoint; const labParamsResult = LabParams.safeParse(req.params); @@ -35,7 +38,7 @@ export function connectLab(server: FastifyInstance) { return; } - const { organizationId, projectId, targetId } = labParamsResult.data; + const { organizationSlug, projectSlug, targetSlug } = labParamsResult.data; const headers: Record = {}; @@ -57,9 +60,9 @@ export function connectLab(server: FastifyInstance) { `, variables: { selector: { - organization: organizationId, - project: projectId, - target: targetId, + organizationSlug: organizationSlug, + projectSlug: projectSlug, + targetSlug: targetSlug, }, }, }; diff --git a/packages/web/app/src/server/slack.ts b/packages/web/app/src/server/slack.ts index 8156ece9cb..5de1f4fd70 100644 --- a/packages/web/app/src/server/slack.ts +++ b/packages/web/app/src/server/slack.ts @@ -14,8 +14,8 @@ const CallBackQuery = z.object({ }); const ConnectParams = z.object({ - organizationId: z.string({ - required_error: 'Invalid organizationId', + organizationSlug: z.string({ + required_error: 'Invalid organizationSlug', }), }); @@ -32,9 +32,9 @@ export function connectSlack(server: FastifyInstance) { return; } - const { code, state: orgId } = queryResult.data; + const { code, state: organizationSlug } = queryResult.data; - req.log.info('Fetching data from Slack API (orgId=%s)', orgId); + req.log.info('Fetching data from Slack API (orgId=%s)', organizationSlug); const slackResponse = await fetch('https://slack.com/api/oauth.v2.access', { method: 'POST', @@ -66,15 +66,15 @@ export function connectSlack(server: FastifyInstance) { `, variables: { input: { - organization: orgId, + organizationSlug: organizationSlug, token, }, }, }); - void res.redirect(`/${orgId}/view/settings`); + void res.redirect(`/${organizationSlug}/view/settings`); }); - server.get('/api/slack/connect/:organizationId', async (req, res) => { + server.get('/api/slack/connect/:organizationSlug', async (req, res) => { req.log.info('Connect to Slack'); if (env.slack === null) { req.log.error('The Slack integration is not enabled.'); @@ -87,12 +87,12 @@ export function connectSlack(server: FastifyInstance) { return; } - const { organizationId } = paramsResult.data; - req.log.info('Connect organization to Slack (id=%s)', organizationId); + const { organizationSlug } = paramsResult.data; + req.log.info('Connect organization to Slack (id=%s)', organizationSlug); const slackUrl = `https://slack.com/oauth/v2/authorize?scope=incoming-webhook,chat:write,chat:write.public,commands&client_id=${env.slack.clientId}`; const redirectUrl = `${env.appBaseUrl}/api/slack/callback`; - void res.redirect(`${slackUrl}&state=${organizationId}&redirect_uri=${redirectUrl}`); + void res.redirect(`${slackUrl}&state=${organizationSlug}&redirect_uri=${redirectUrl}`); }); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a585f0103d..45446d7ef8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1847,7 +1847,7 @@ importers: version: 4.3.1(vite@5.4.6(@types/node@20.16.1)(less@4.2.0)(terser@5.31.1)) autoprefixer: specifier: 10.4.20 - version: 10.4.20(postcss@8.4.47) + version: 10.4.20(postcss@8.4.41) class-variance-authority: specifier: 0.7.0 version: 0.7.0 @@ -25275,8 +25275,8 @@ snapshots: '@typescript-eslint/parser': 7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4) eslint: 8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva) eslint-config-prettier: 9.1.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) eslint-plugin-jsonc: 2.11.1(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) eslint-plugin-mdx: 3.0.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) @@ -26408,16 +26408,6 @@ snapshots: postcss: 8.4.41 postcss-value-parser: 4.2.0 - autoprefixer@10.4.20(postcss@8.4.47): - dependencies: - browserslist: 4.23.3 - caniuse-lite: 1.0.30001651 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.4.47 - postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.5: {} avvio@8.3.0: @@ -28300,13 +28290,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)): dependencies: debug: 4.3.6(supports-color@8.1.1) enhanced-resolve: 5.17.0 eslint: 8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva) - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -28337,14 +28327,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)): + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4) eslint: 8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) transitivePeerDependencies: - supports-color @@ -28360,7 +28350,7 @@ snapshots: eslint: 8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva) eslint-compat-utils: 0.1.2(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 @@ -28370,7 +28360,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva))(typescript@5.5.4))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)))(eslint@8.57.0(patch_hash=fjbpfrtrjd6idngyeqxnwopfva)) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3