Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 70 additions & 4 deletions src/api/gql/inviteLinks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,19 @@ export function useInviteLinks(afterCursor?: string) {
};
}

export const CREATE_INVITE_LINK = graphql(`
mutation CreateInviteLink(
// The capability is interpolated as an unquoted GraphQL enum literal in a
// fixed per-value mutation rather than passed as a `$capability: Capability!`
// variable. This keeps the query string from referring to the `Capability`
// enum type by name, so a backend rename of the type cannot break parsing.
const CREATE_INVITE_LINK_ADMIN = graphql(`
mutation CreateInviteLinkAdmin(
$catalogPrefix: Prefix!
$capability: Capability!
$singleUse: Boolean!
$detail: String
) {
createInviteLink(
catalogPrefix: $catalogPrefix
capability: $capability
capability: admin
singleUse: $singleUse
detail: $detail
) {
Expand All @@ -79,6 +82,69 @@ export const CREATE_INVITE_LINK = graphql(`
}
`);

const CREATE_INVITE_LINK_READ = graphql(`
mutation CreateInviteLinkRead(
$catalogPrefix: Prefix!
$singleUse: Boolean!
$detail: String
) {
createInviteLink(
catalogPrefix: $catalogPrefix
capability: read
singleUse: $singleUse
detail: $detail
) {
token
catalogPrefix
capability
singleUse
detail
createdAt
}
}
`);

const CREATE_INVITE_LINK_WRITE = graphql(`
mutation CreateInviteLinkWrite(
$catalogPrefix: Prefix!
$singleUse: Boolean!
$detail: String
) {
createInviteLink(
catalogPrefix: $catalogPrefix
capability: write
singleUse: $singleUse
detail: $detail
) {
token
catalogPrefix
capability
singleUse
detail
createdAt
}
}
`);

export const CREATE_INVITE_LINK_BY_CAPABILITY = {
admin: CREATE_INVITE_LINK_ADMIN,
read: CREATE_INVITE_LINK_READ,
write: CREATE_INVITE_LINK_WRITE,
} as const;

export type CreateInviteLinkCapability =
keyof typeof CREATE_INVITE_LINK_BY_CAPABILITY;

export function isCreateInviteLinkCapability(
value: unknown
): value is CreateInviteLinkCapability {
return (
value === 'admin' ||
value === 'read' ||
value === 'write'
);
}

export const DELETE_INVITE_LINK = graphql(`
mutation DeleteInviteLink($token: UUID!) {
deleteInviteLink(token: $token)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ import { usePostHog } from '@posthog/react';
import { useIntl } from 'react-intl';
import { useMutation } from 'urql';

import { CREATE_INVITE_LINK } from 'src/api/gql/inviteLinks';
import {
CREATE_INVITE_LINK_BY_CAPABILITY,
isCreateInviteLinkCapability,
} from 'src/api/gql/inviteLinks';
import TechnicalEmphasis from 'src/components/derivation/Create/TechnicalEmphasis';
import PrefixedName from 'src/components/inputs/PrefixedName';
import useValidatePrefix from 'src/components/inputs/PrefixedName/useValidatePrefix';
Expand Down Expand Up @@ -82,8 +85,6 @@ export function GenerateInvitation({ setError }: InviteErrorProps) {
const postHog = usePostHog();
const { palette } = useTheme();

const [{ fetching }, createMutation] = useMutation(CREATE_INVITE_LINK);

const {
handlers: prefixHandlers,
name,
Expand All @@ -100,6 +101,11 @@ export function GenerateInvitation({ setError }: InviteErrorProps) {
const [capability, setCapability] = useState<Capability>(
capabilityOptions[0]
);
const [{ fetching }, createMutation] = useMutation(
CREATE_INVITE_LINK_BY_CAPABILITY[
isCreateInviteLinkCapability(capability) ? capability : 'read'
]
);
const [singleUse, setSingleUse] = useState(true);
const [accessScope, setAccessScope] = useState<string | null>(null);
const subPrefixInputRef = useRef<HTMLInputElement>(null);
Expand All @@ -119,7 +125,6 @@ export function GenerateInvitation({ setError }: InviteErrorProps) {

const result = await createMutation({
catalogPrefix,
capability,
singleUse,
});

Expand Down
18 changes: 15 additions & 3 deletions src/gql-types/gql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ type Documents = {
"\n query ConnectorTagData($imageName: String!, $fullImageName: String!) {\n connector(imageName: $imageName) {\n id\n imageName\n logoUrl\n title\n }\n connectorSpec(fullImageName: $fullImageName) {\n id\n imageTag\n defaultCaptureInterval\n disableBackfill\n documentationUrl\n endpointSpecSchema\n resourceSpecSchema\n protocol\n }\n }\n": typeof types.ConnectorTagDataDocument,
"\n query DataPlanes($after: String) {\n dataPlanes(first: 100, after: $after) {\n edges {\n node {\n name\n cloudProvider\n region\n isPublic\n fqdn\n cidrBlocks\n awsIamUserArn\n gcpServiceAccountEmail\n azureApplicationClientId\n azureApplicationName\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n": typeof types.DataPlanesDocument,
"\n query InviteLinks($first: Int, $after: String) {\n inviteLinks(first: $first, after: $after) {\n edges {\n node {\n token\n ssoProviderId\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n cursor\n }\n pageInfo {\n ...PageInfoFields\n }\n }\n }\n": typeof types.InviteLinksDocument,
"\n mutation CreateInviteLink(\n $catalogPrefix: Prefix!\n $capability: Capability!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: $capability\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n": typeof types.CreateInviteLinkDocument,
"\n mutation CreateInviteLinkAdmin(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: admin\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n": typeof types.CreateInviteLinkAdminDocument,
"\n mutation CreateInviteLinkRead(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: read\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n": typeof types.CreateInviteLinkReadDocument,
"\n mutation CreateInviteLinkWrite(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: write\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n": typeof types.CreateInviteLinkWriteDocument,
"\n mutation DeleteInviteLink($token: UUID!) {\n deleteInviteLink(token: $token)\n }\n": typeof types.DeleteInviteLinkDocument,
"\n mutation RedeemInviteLink($token: UUID!) {\n redeemInviteLink(token: $token) {\n capability\n catalogPrefix\n }\n }\n": typeof types.RedeemInviteLinkDocument,
"\n query LiveSpecsQuery($prefix: Prefix!, $after: String) {\n liveSpecs(by: { prefix: $prefix }, first: 100, after: $after) {\n edges {\n cursor\n node {\n catalogName\n liveSpec {\n catalogType\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n": typeof types.LiveSpecsQueryDocument,
Expand All @@ -48,7 +50,9 @@ const documents: Documents = {
"\n query ConnectorTagData($imageName: String!, $fullImageName: String!) {\n connector(imageName: $imageName) {\n id\n imageName\n logoUrl\n title\n }\n connectorSpec(fullImageName: $fullImageName) {\n id\n imageTag\n defaultCaptureInterval\n disableBackfill\n documentationUrl\n endpointSpecSchema\n resourceSpecSchema\n protocol\n }\n }\n": types.ConnectorTagDataDocument,
"\n query DataPlanes($after: String) {\n dataPlanes(first: 100, after: $after) {\n edges {\n node {\n name\n cloudProvider\n region\n isPublic\n fqdn\n cidrBlocks\n awsIamUserArn\n gcpServiceAccountEmail\n azureApplicationClientId\n azureApplicationName\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n": types.DataPlanesDocument,
"\n query InviteLinks($first: Int, $after: String) {\n inviteLinks(first: $first, after: $after) {\n edges {\n node {\n token\n ssoProviderId\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n cursor\n }\n pageInfo {\n ...PageInfoFields\n }\n }\n }\n": types.InviteLinksDocument,
"\n mutation CreateInviteLink(\n $catalogPrefix: Prefix!\n $capability: Capability!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: $capability\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n": types.CreateInviteLinkDocument,
"\n mutation CreateInviteLinkAdmin(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: admin\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n": types.CreateInviteLinkAdminDocument,
"\n mutation CreateInviteLinkRead(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: read\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n": types.CreateInviteLinkReadDocument,
"\n mutation CreateInviteLinkWrite(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: write\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n": types.CreateInviteLinkWriteDocument,
"\n mutation DeleteInviteLink($token: UUID!) {\n deleteInviteLink(token: $token)\n }\n": types.DeleteInviteLinkDocument,
"\n mutation RedeemInviteLink($token: UUID!) {\n redeemInviteLink(token: $token) {\n capability\n catalogPrefix\n }\n }\n": types.RedeemInviteLinkDocument,
"\n query LiveSpecsQuery($prefix: Prefix!, $after: String) {\n liveSpecs(by: { prefix: $prefix }, first: 100, after: $after) {\n edges {\n cursor\n node {\n catalogName\n liveSpec {\n catalogType\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n": types.LiveSpecsQueryDocument,
Expand Down Expand Up @@ -117,7 +121,15 @@ export function graphql(source: "\n query InviteLinks($first: Int, $after: St
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n mutation CreateInviteLink(\n $catalogPrefix: Prefix!\n $capability: Capability!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: $capability\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n"): (typeof documents)["\n mutation CreateInviteLink(\n $catalogPrefix: Prefix!\n $capability: Capability!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: $capability\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n"];
export function graphql(source: "\n mutation CreateInviteLinkAdmin(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: admin\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n"): (typeof documents)["\n mutation CreateInviteLinkAdmin(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: admin\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n mutation CreateInviteLinkRead(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: read\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n"): (typeof documents)["\n mutation CreateInviteLinkRead(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: read\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(source: "\n mutation CreateInviteLinkWrite(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: write\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n"): (typeof documents)["\n mutation CreateInviteLinkWrite(\n $catalogPrefix: Prefix!\n $singleUse: Boolean!\n $detail: String\n ) {\n createInviteLink(\n catalogPrefix: $catalogPrefix\n capability: write\n singleUse: $singleUse\n detail: $detail\n ) {\n token\n catalogPrefix\n capability\n singleUse\n detail\n createdAt\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
Expand Down
Loading
Loading