feat(*): allow to select auth providers + add multiworkspace with subdomain management (#8656)

## Summary
Add support for multi-workspace feature and adjust configurations and
states accordingly.
- Introduced new state isMultiWorkspaceEnabledState.
- Updated ClientConfigProviderEffect component to handle
multi-workspace.
- Modified GraphQL schema and queries to include multi-workspace related
configurations.
- Adjusted server environment variables and their respective
documentation to support multi-workspace toggle.
- Updated server-side logic to handle new multi-workspace configurations
and conditions.
This commit is contained in:
Antoine Moreaux
2024-12-03 19:06:28 +01:00
committed by GitHub
parent 9a65e80566
commit 7943141d03
167 changed files with 5180 additions and 1901 deletions

View File

@ -32,6 +32,12 @@ export type ActivateWorkspaceInput = {
displayName?: InputMaybe<Scalars['String']['input']>;
};
export type ActivateWorkspaceOutput = {
__typename?: 'ActivateWorkspaceOutput';
loginToken: AuthToken;
workspace: Workspace;
};
export type Analytics = {
__typename?: 'Analytics';
/** Boolean that confirms query was dispatched */
@ -81,7 +87,7 @@ export type AuthProviders = {
magicLink: Scalars['Boolean']['output'];
microsoft: Scalars['Boolean']['output'];
password: Scalars['Boolean']['output'];
sso: Scalars['Boolean']['output'];
sso: Array<SsoIdentityProvider>;
};
export type AuthToken = {
@ -106,6 +112,15 @@ export type AuthorizeApp = {
redirectUrl: Scalars['String']['output'];
};
export type AvailableWorkspaceOutput = {
__typename?: 'AvailableWorkspaceOutput';
displayName?: Maybe<Scalars['String']['output']>;
id: Scalars['String']['output'];
logo?: Maybe<Scalars['String']['output']>;
sso: Array<SsoConnection>;
subdomain: Scalars['String']['output'];
};
export type Billing = {
__typename?: 'Billing';
billingFreeTrialDurationInDays?: Maybe<Scalars['Float']['output']>;
@ -161,14 +176,16 @@ export type ClientConfig = {
__typename?: 'ClientConfig';
analyticsEnabled: Scalars['Boolean']['output'];
api: ApiConfig;
authProviders: AuthProviders;
billing: Billing;
captcha: Captcha;
chromeExtensionId?: Maybe<Scalars['String']['output']>;
debugMode: Scalars['Boolean']['output'];
defaultSubdomain?: Maybe<Scalars['String']['output']>;
frontDomain: Scalars['String']['output'];
isMultiWorkspaceEnabled: Scalars['Boolean']['output'];
isSSOEnabled: Scalars['Boolean']['output'];
sentry: Sentry;
signInPrefilled: Scalars['Boolean']['output'];
signUpDisabled: Scalars['Boolean']['output'];
support: Support;
};
@ -332,7 +349,7 @@ export type EditSsoOutput = {
issuer: Scalars['String']['output'];
name: Scalars['String']['output'];
status: SsoIdentityProviderStatus;
type: IdpType;
type: IdentityProviderType;
};
export type EmailPasswordResetLink = {
@ -424,17 +441,13 @@ export enum FileFolder {
WorkspaceLogo = 'WorkspaceLogo'
}
export type FindAvailableSsoidpInput = {
email: Scalars['String']['input'];
};
export type FindAvailableSsoidpOutput = {
__typename?: 'FindAvailableSSOIDPOutput';
id: Scalars['String']['output'];
issuer: Scalars['String']['output'];
name: Scalars['String']['output'];
status: SsoIdentityProviderStatus;
type: IdpType;
type: IdentityProviderType;
workspace: WorkspaceNameAndId;
};
@ -451,22 +464,6 @@ export type FullName = {
lastName: Scalars['String']['output'];
};
export type GenerateJwt = GenerateJwtOutputWithAuthTokens | GenerateJwtOutputWithSsoauth;
export type GenerateJwtOutputWithAuthTokens = {
__typename?: 'GenerateJWTOutputWithAuthTokens';
authTokens: AuthTokens;
reason: Scalars['String']['output'];
success: Scalars['Boolean']['output'];
};
export type GenerateJwtOutputWithSsoauth = {
__typename?: 'GenerateJWTOutputWithSSOAUTH';
availableSSOIDPs: Array<FindAvailableSsoidpOutput>;
reason: Scalars['String']['output'];
success: Scalars['Boolean']['output'];
};
export type GetAuthorizationUrlInput = {
identityProviderId: Scalars['String']['input'];
};
@ -485,7 +482,7 @@ export type GetServerlessFunctionSourceCodeInput = {
version?: Scalars['String']['input'];
};
export enum IdpType {
export enum IdentityProviderType {
Oidc = 'OIDC',
Saml = 'SAML'
}
@ -553,7 +550,7 @@ export enum MessageChannelVisibility {
export type Mutation = {
__typename?: 'Mutation';
activateWorkflowVersion: Scalars['Boolean']['output'];
activateWorkspace: Workspace;
activateWorkspace: ActivateWorkspaceOutput;
addUserToWorkspace: User;
addUserToWorkspaceByInviteToken: User;
authorizeApp: AuthorizeApp;
@ -578,7 +575,7 @@ export type Mutation = {
deleteOneServerlessFunction: ServerlessFunction;
deleteSSOIdentityProvider: DeleteSsoOutput;
deleteUser: User;
deleteWorkflowVersionStep: Scalars['Boolean']['output'];
deleteWorkflowVersionStep: WorkflowAction;
deleteWorkspaceInvitation: Scalars['String']['output'];
disablePostgresProxy: PostgresCredentials;
editSSOIdentityProvider: EditSsoOutput;
@ -586,9 +583,7 @@ export type Mutation = {
enablePostgresProxy: PostgresCredentials;
exchangeAuthorizationCode: ExchangeAuthCode;
executeOneServerlessFunction: ServerlessFunctionExecutionResult;
findAvailableSSOIdentityProviders: Array<FindAvailableSsoidpOutput>;
generateApiKeyToken: ApiKeyToken;
generateJWT: GenerateJwt;
generateTransientToken: TransientToken;
getAuthorizationUrl: GetAuthorizationUrlOutput;
impersonate: Verify;
@ -599,6 +594,7 @@ export type Mutation = {
sendInvitations: SendInvitationsOutput;
signUp: LoginToken;
skipSyncEmailOnboardingStep: OnboardingStepSuccess;
switchWorkspace: PublicWorkspaceDataOutput;
syncRemoteTable: RemoteTable;
syncRemoteTableSchemaChanges: RemoteTable;
track: Analytics;
@ -609,7 +605,7 @@ export type Mutation = {
updateOneRemoteServer: RemoteServer;
updateOneServerlessFunction: ServerlessFunction;
updatePasswordViaResetToken: InvalidatePassword;
updateWorkflowVersionStep: Scalars['Boolean']['output'];
updateWorkflowVersionStep: WorkflowAction;
updateWorkspace: Workspace;
updateWorkspaceFeatureFlag: Scalars['Boolean']['output'];
uploadFile: Scalars['String']['output'];
@ -778,22 +774,12 @@ export type MutationExecuteOneServerlessFunctionArgs = {
};
export type MutationFindAvailableSsoIdentityProvidersArgs = {
input: FindAvailableSsoidpInput;
};
export type MutationGenerateApiKeyTokenArgs = {
apiKeyId: Scalars['String']['input'];
expiresAt: Scalars['String']['input'];
};
export type MutationGenerateJwtArgs = {
workspaceId: Scalars['String']['input'];
};
export type MutationGetAuthorizationUrlArgs = {
input: GetAuthorizationUrlInput;
};
@ -838,6 +824,11 @@ export type MutationSignUpArgs = {
};
export type MutationSwitchWorkspaceArgs = {
workspaceId: Scalars['String']['input'];
};
export type MutationSyncRemoteTableArgs = {
input: RemoteTableInput;
};
@ -1007,6 +998,15 @@ export type ProductPricesEntity = {
totalNumberOfPrices: Scalars['Int']['output'];
};
export type PublicWorkspaceDataOutput = {
__typename?: 'PublicWorkspaceDataOutput';
authProviders: AuthProviders;
displayName?: Maybe<Scalars['String']['output']>;
id: Scalars['String']['output'];
logo?: Maybe<Scalars['String']['output']>;
subdomain: Scalars['String']['output'];
};
export type PublishServerlessFunctionInput = {
/** The id of the function. */
id: Scalars['ID']['input'];
@ -1015,13 +1015,14 @@ export type PublishServerlessFunctionInput = {
export type Query = {
__typename?: 'Query';
billingPortalSession: SessionEntity;
checkUserExists: UserExists;
checkUserExists: UserExistsOutput;
checkWorkspaceInviteHashIsValid: WorkspaceInviteHashValid;
clientConfig: ClientConfig;
currentUser: User;
currentWorkspace: Workspace;
field: Field;
fields: FieldConnection;
findAvailableWorkspacesByEmail: Array<AvailableWorkspaceOutput>;
findDistantTablesWithStatus: Array<RemoteTable>;
findManyRemoteServersByType: Array<RemoteServer>;
findManyServerlessFunctions: Array<ServerlessFunction>;
@ -1032,6 +1033,7 @@ export type Query = {
getAvailablePackages: Scalars['JSON']['output'];
getPostgresCredentials?: Maybe<PostgresCredentials>;
getProductPrices: ProductPricesEntity;
getPublicWorkspaceDataBySubdomain: PublicWorkspaceDataOutput;
getServerlessFunctionSourceCode?: Maybe<Scalars['JSON']['output']>;
getTimelineCalendarEventsFromCompanyId: TimelineCalendarEventsWithTotal;
getTimelineCalendarEventsFromPersonId: TimelineCalendarEventsWithTotal;
@ -1075,6 +1077,11 @@ export type QueryFieldsArgs = {
};
export type QueryFindAvailableWorkspacesByEmailArgs = {
email: Scalars['String']['input'];
};
export type QueryFindDistantTablesWithStatusArgs = {
input: FindManyRemoteTablesInput;
};
@ -1262,6 +1269,24 @@ export type RunWorkflowVersionInput = {
workflowVersionId: Scalars['String']['input'];
};
export type SsoConnection = {
__typename?: 'SSOConnection';
id: Scalars['String']['output'];
issuer: Scalars['String']['output'];
name: Scalars['String']['output'];
status: SsoIdentityProviderStatus;
type: IdentityProviderType;
};
export type SsoIdentityProvider = {
__typename?: 'SSOIdentityProvider';
id: Scalars['String']['output'];
issuer: Scalars['String']['output'];
name: Scalars['String']['output'];
status: SsoIdentityProviderStatus;
type: IdentityProviderType;
};
export enum SsoIdentityProviderStatus {
Active = 'Active',
Error = 'Error',
@ -1353,7 +1378,7 @@ export type SetupSsoOutput = {
issuer: Scalars['String']['output'];
name: Scalars['String']['output'];
status: SsoIdentityProviderStatus;
type: IdpType;
type: IdentityProviderType;
};
/** Sort Directions */
@ -1555,8 +1580,12 @@ export type UpdateWorkspaceInput = {
displayName?: InputMaybe<Scalars['String']['input']>;
domainName?: InputMaybe<Scalars['String']['input']>;
inviteHash?: InputMaybe<Scalars['String']['input']>;
isGoogleAuthEnabled?: InputMaybe<Scalars['Boolean']['input']>;
isMicrosoftAuthEnabled?: InputMaybe<Scalars['Boolean']['input']>;
isPasswordAuthEnabled?: InputMaybe<Scalars['Boolean']['input']>;
isPublicInviteLinkEnabled?: InputMaybe<Scalars['Boolean']['input']>;
logo?: InputMaybe<Scalars['String']['input']>;
subdomain?: InputMaybe<Scalars['String']['input']>;
};
export type User = {
@ -1594,9 +1623,12 @@ export type UserEdge = {
export type UserExists = {
__typename?: 'UserExists';
availableWorkspaces: Array<AvailableWorkspaceOutput>;
exists: Scalars['Boolean']['output'];
};
export type UserExistsOutput = UserExists | UserNotExists;
export type UserInfo = {
__typename?: 'UserInfo';
email: Scalars['String']['output'];
@ -1626,6 +1658,11 @@ export type UserMappingOptionsUser = {
user?: Maybe<Scalars['String']['output']>;
};
export type UserNotExists = {
__typename?: 'UserNotExists';
exists: Scalars['Boolean']['output'];
};
export type UserWorkspace = {
__typename?: 'UserWorkspace';
createdAt: Scalars['DateTime']['output'];
@ -1653,6 +1690,10 @@ export type Verify = {
export type WorkflowAction = {
__typename?: 'WorkflowAction';
id: Scalars['UUID']['output'];
name: Scalars['String']['output'];
settings: Scalars['JSON']['output'];
type: Scalars['String']['output'];
valid: Scalars['Boolean']['output'];
};
export type WorkflowRun = {
@ -1677,9 +1718,13 @@ export type Workspace = {
hasValidEntrepriseKey: Scalars['Boolean']['output'];
id: Scalars['UUID']['output'];
inviteHash?: Maybe<Scalars['String']['output']>;
isGoogleAuthEnabled: Scalars['Boolean']['output'];
isMicrosoftAuthEnabled: Scalars['Boolean']['output'];
isPasswordAuthEnabled: Scalars['Boolean']['output'];
isPublicInviteLinkEnabled: Scalars['Boolean']['output'];
logo?: Maybe<Scalars['String']['output']>;
metadataVersion: Scalars['Float']['output'];
subdomain: Scalars['String']['output'];
updatedAt: Scalars['DateTime']['output'];
workspaceMembersCount?: Maybe<Scalars['Float']['output']>;
};