├── .config
└── dotnet-tools.json
├── .editorconfig
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── custom.md
│ └── feature_request.md
├── PULL_REQUEST_TEMPLATE.md
└── workflows
│ └── codeql-analysis.yml
├── .gitignore
├── .vscode
└── extensions.json
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── build-ui.sh
├── docs
└── arch.drawio.svg
├── global.json
├── nuget.config
└── src
├── Backend
├── Confix.sln
├── Directory.Build.props
├── Directory.Packages.props
├── src
│ ├── Authentication
│ │ ├── ApiKey
│ │ │ ├── ApiKey.cs
│ │ │ ├── ApiKeyAuthenticationSucceededContext.cs
│ │ │ ├── ApiKeyDefaults.cs
│ │ │ ├── ApiKeyExtensions.cs
│ │ │ ├── ApiKeyHandler.cs
│ │ │ ├── ApiKeyOptions.cs
│ │ │ └── IApiKeyProvider.cs
│ │ ├── Authentication.csproj
│ │ ├── Authorization
│ │ │ ├── AuthorizationRule.cs
│ │ │ ├── AuthorizationService.cs
│ │ │ ├── ClaimRequirement.cs
│ │ │ ├── Extensions
│ │ │ │ ├── AuthorizationPolicyExtensions.cs
│ │ │ │ ├── AuthorizationRuleExtensions.cs
│ │ │ │ ├── AuthorizationRuleServiceCollectionExtensions.cs
│ │ │ │ └── SessionAccessorExtensions.cs
│ │ │ ├── Group.cs
│ │ │ ├── IAuthorizationRule.cs
│ │ │ ├── IAuthorizationService.cs
│ │ │ ├── ISession.cs
│ │ │ ├── ISessionAccessor.cs
│ │ │ ├── Permission.cs
│ │ │ ├── Permissions.cs
│ │ │ ├── Policies.cs
│ │ │ ├── Providers
│ │ │ │ ├── GroupProvider.cs
│ │ │ │ ├── IGroupProvider.cs
│ │ │ │ ├── IRoleProvider.cs
│ │ │ │ └── RoleProvider.cs
│ │ │ ├── Repositories
│ │ │ │ ├── IGroupStore.cs
│ │ │ │ └── IRoleStore.cs
│ │ │ ├── Requirement.cs
│ │ │ ├── Role.cs
│ │ │ ├── RoleScope.cs
│ │ │ ├── Scope.cs
│ │ │ ├── Scopes.cs
│ │ │ ├── Session.cs
│ │ │ ├── SessionAccessor.cs
│ │ │ ├── UserInfo.cs
│ │ │ └── WellKnownNamespaces.cs
│ │ ├── ClientCredentials
│ │ │ ├── AddTokenMessageHandler.cs
│ │ │ ├── ClientCredentialCache.cs
│ │ │ ├── ClientCredentialServiceCollectionExtensions.cs
│ │ │ ├── ClientCredentialsClientOptions.cs
│ │ │ └── IClientCredentialCache.cs
│ │ ├── Extensions
│ │ │ └── StringExtensions.cs
│ │ └── InternalsVisibleTo.cs
│ ├── Authoring.Abstractions
│ │ ├── ApiKeys
│ │ │ ├── DataLoaders
│ │ │ │ └── IApiKeyById.cs
│ │ │ ├── Models
│ │ │ │ └── ApiKeyWithSecret.cs
│ │ │ ├── Service
│ │ │ │ └── IApiKeyService.cs
│ │ │ └── Stores
│ │ │ │ └── IApiKeyStore.cs
│ │ ├── Applications
│ │ │ ├── Changes
│ │ │ │ ├── AddComponentToApplicationPartChange.cs
│ │ │ │ ├── AddPartToApplicationChange.cs
│ │ │ │ ├── ApplicationPartComponentValuesChange.cs
│ │ │ │ ├── CreateApplicationChange.cs
│ │ │ │ ├── IApplicationChange.cs
│ │ │ │ ├── IApplicationPartChange.cs
│ │ │ │ ├── IApplicationPartComponentChange.cs
│ │ │ │ ├── PublishedApplicationPartChange.cs
│ │ │ │ ├── RemoveComponentFromApplicationPartChange.cs
│ │ │ │ ├── RemovePartFromApplicationChange.cs
│ │ │ │ ├── RenameApplicationChange.cs
│ │ │ │ └── RenameApplicationPartChange.cs
│ │ │ ├── DataLoaders
│ │ │ │ ├── IApplicationByComponentIdDataLoader.cs
│ │ │ │ ├── IApplicationByPartIdDataLoader.cs
│ │ │ │ ├── IApplicationDataLoader.cs
│ │ │ │ ├── IApplicationPartComponentDataLoader.cs
│ │ │ │ └── IApplicationPartDataLoader.cs
│ │ │ ├── Exceptions
│ │ │ │ ├── ApplicationNotFoundException.cs
│ │ │ │ ├── ApplicationPartComponentNotFoundException.cs
│ │ │ │ └── ApplicationPartNotFoundException.cs
│ │ │ ├── Models
│ │ │ │ ├── Application.cs
│ │ │ │ ├── ApplicationPart.cs
│ │ │ │ └── ApplicationPartComponent.cs
│ │ │ ├── Services
│ │ │ │ └── IApplicationService.cs
│ │ │ └── Stores
│ │ │ │ └── IApplicationStore.cs
│ │ ├── Authoring.Abstractions.csproj
│ │ ├── ChangeLog
│ │ │ ├── Models
│ │ │ │ ├── ChangeLog.cs
│ │ │ │ └── IChange.cs
│ │ │ └── Stores
│ │ │ │ └── IChangeLogStore.cs
│ │ ├── Components
│ │ │ ├── Changes
│ │ │ │ ├── ChangeScopeOfComponentChange.cs
│ │ │ │ ├── ComponentSchemaChange.cs
│ │ │ │ ├── ComponentValuesChange.cs
│ │ │ │ ├── CreateComponentChange.cs
│ │ │ │ ├── IComponentChange.cs
│ │ │ │ ├── RemoveComponentChange.cs
│ │ │ │ └── RenameComponentChange.cs
│ │ │ ├── DataLoaders
│ │ │ │ └── IComponentDataLoader.cs
│ │ │ ├── Exceptions
│ │ │ │ └── ComponentNotFoundException.cs
│ │ │ ├── Models
│ │ │ │ ├── ApplicationComponentScope.cs
│ │ │ │ ├── ApplicationPartComponentScope.cs
│ │ │ │ ├── Component.cs
│ │ │ │ ├── ComponentScope.cs
│ │ │ │ └── NamespaceComponentScope.cs
│ │ │ ├── Services
│ │ │ │ └── IComponentService.cs
│ │ │ └── Stores
│ │ │ │ └── IComponentStore.cs
│ │ ├── Configuration
│ │ │ └── IAuthoringServerBuilder.cs
│ │ ├── Environment
│ │ │ ├── Exceptions
│ │ │ │ ├── EnvironmentCycleDetectedException.cs
│ │ │ │ ├── EnvironmentNameCollisionException.cs
│ │ │ │ └── EnvironmentNotFoundException.cs
│ │ │ ├── Models
│ │ │ │ └── Environment.cs
│ │ │ ├── Services
│ │ │ │ └── IEnvironmentService.cs
│ │ │ └── Stores
│ │ │ │ └── IEnvironmentStore.cs
│ │ ├── Exceptions
│ │ │ ├── EntityIdInvalidException.cs
│ │ │ └── NameTakenException.cs
│ │ ├── Groups
│ │ │ └── Dataloaders
│ │ │ │ └── IGroupByIdDataLoader.cs
│ │ ├── Publishing
│ │ │ ├── DataLoader
│ │ │ │ ├── IPublishedApplicationPartByIdDataloader.cs
│ │ │ │ └── IPublishedApplicationPartsByPartIdDataloader.cs
│ │ │ ├── Models
│ │ │ │ ├── ClaimedVersion.cs
│ │ │ │ └── PublishedApplicationPart.cs
│ │ │ ├── Services
│ │ │ │ └── IPublishingService.cs
│ │ │ └── Stores
│ │ │ │ └── IPublishingStore.cs
│ │ ├── Roles
│ │ │ └── Dataloaders
│ │ │ │ └── IRoleByIdDataLoader.cs
│ │ ├── ScalarNames.cs
│ │ ├── Schema
│ │ │ ├── Exceptions
│ │ │ │ ├── InvalidSchemaException.cs
│ │ │ │ └── SchemaViolationException.cs
│ │ │ └── Models
│ │ │ │ └── SchemaViolation.cs
│ │ └── Variables
│ │ │ ├── Changes
│ │ │ ├── CreateVariableChange.cs
│ │ │ ├── DeleteVariableValueChange.cs
│ │ │ ├── IVariableChange.cs
│ │ │ ├── RenameVariableChange.cs
│ │ │ └── VariableValueChanged.cs
│ │ │ ├── DataLoaders
│ │ │ └── IVariableDataLoader.cs
│ │ │ ├── Models
│ │ │ ├── ApplicationPartVariableScope.cs
│ │ │ ├── ApplicationVariableValueScope.cs
│ │ │ ├── NamespaceVariableScope.cs
│ │ │ ├── Variable.cs
│ │ │ ├── VariableState.cs
│ │ │ ├── VariableValue.cs
│ │ │ └── VariableValueScope.cs
│ │ │ ├── Services
│ │ │ ├── IVariableService.cs
│ │ │ └── VariableValueScopeInput.cs
│ │ │ └── Stores
│ │ │ ├── IVariableStore.cs
│ │ │ └── IVariableValueStore.cs
│ ├── Authoring.Core
│ │ ├── ApiKey
│ │ │ ├── ApiKeyProvider.cs
│ │ │ ├── ApiKeyRequestExecutorBuilderExtensions.cs
│ │ │ ├── Authorization
│ │ │ │ └── ApiKeyAuthorizationPolicy.cs
│ │ │ ├── DataLoaders
│ │ │ │ └── ApiKeyByIdDataloader.cs
│ │ │ └── Services
│ │ │ │ └── ApiKeyService.cs
│ │ ├── Applications
│ │ │ ├── ApplicationServiceCollectionExtensions.cs
│ │ │ ├── Authorization
│ │ │ │ ├── ApplicationAuthorizationRule.cs
│ │ │ │ ├── ApplicationPartAuthorizationRule.cs
│ │ │ │ └── ApplicationPartComponentAuthorizationRule.cs
│ │ │ ├── DataLoaders
│ │ │ │ ├── ApplicationByComponentIdDataLoader.cs
│ │ │ │ ├── ApplicationByIdDataLoader.cs
│ │ │ │ ├── ApplicationByPartIdDataLoader.cs
│ │ │ │ ├── ApplicationPartByIdDataLoader.cs
│ │ │ │ └── ApplicationPartComponentByIdDataloader.cs
│ │ │ └── Services
│ │ │ │ └── ApplicationService.cs
│ │ ├── Authentication
│ │ │ ├── AuthenticationExtensions.cs
│ │ │ ├── AuthoringServerAuthenticationBuilder.cs
│ │ │ └── IAuthoringServerAuthenticationBuilder.cs
│ │ ├── Authoring.Core.csproj
│ │ ├── AuthoringServiceCollectionExtensions.cs
│ │ ├── ChangeLog
│ │ │ ├── Authorization
│ │ │ │ └── ChangeLogAuthorizationRule.cs
│ │ │ ├── ChangeLogServiceCollectionExtensions.cs
│ │ │ ├── DataLoaders
│ │ │ │ ├── ChangeLogByApplicationIdDataloader.cs
│ │ │ │ ├── ChangeLogByApplicationPartComponentIdDataloader.cs
│ │ │ │ ├── ChangeLogByApplicationPartIdDataloader.cs
│ │ │ │ ├── ChangeLogByComponentIdDataloader.cs
│ │ │ │ ├── ChangeLogByIdDataloader.cs
│ │ │ │ └── ChangeLogByVariableIdDataloader.cs
│ │ │ └── Services
│ │ │ │ ├── ChangeLogService.cs
│ │ │ │ └── IChangeLogService.cs
│ │ ├── Components
│ │ │ ├── Authorization
│ │ │ │ └── ComponentAuthorizationRule.cs
│ │ │ ├── ComponentServiceCollectionExtensions.cs
│ │ │ ├── DataLoaders
│ │ │ │ └── ComponentByIdDataLoader.cs
│ │ │ └── Services
│ │ │ │ ├── ComponentService.cs
│ │ │ │ └── ComponentValidationFailed.cs
│ │ ├── Environement
│ │ │ ├── Authorization
│ │ │ │ └── EnvironmentAuthorizationRule.cs
│ │ │ ├── DataLoaders
│ │ │ │ └── EnvironmentByIdDataLoader.cs
│ │ │ ├── EnvironmentServiceCollectionExtensions.cs
│ │ │ └── Services
│ │ │ │ └── EnvironmentService.cs
│ │ ├── Extensions
│ │ │ ├── CollectionExtensions.cs
│ │ │ └── PathExtensions.cs
│ │ ├── Groups
│ │ │ ├── Authorization
│ │ │ │ └── GroupAuthorizationRule.cs
│ │ │ ├── DataLoaders
│ │ │ │ └── ApplicationByIdDataLoader.cs
│ │ │ ├── GroupServiceCollectionExtensions.cs
│ │ │ └── Services
│ │ │ │ ├── GroupService.cs
│ │ │ │ └── IGroupService.cs
│ │ ├── InternalsVisibleTo.cs
│ │ ├── Publishing
│ │ │ ├── Authorization
│ │ │ │ ├── DeveloperAccessAuthorizationRule.cs
│ │ │ │ ├── DeveloperAccessRequest.cs
│ │ │ │ └── PublishedApplicationPartAuthorizationRule.cs
│ │ │ ├── DataLoader
│ │ │ │ ├── PublishedApplicationPartByIdDataloader.cs
│ │ │ │ └── PublishedApplicationPartByIdPartDataloader.cs
│ │ │ ├── Exceptions
│ │ │ │ ├── ClaimVersionFailedException.cs
│ │ │ │ └── PublishingException.cs
│ │ │ ├── PublishingServiceCollectionExtensions.cs
│ │ │ └── Services
│ │ │ │ ├── JsonVariableVisitor.cs
│ │ │ │ ├── JsonVariableVisitorContext.cs
│ │ │ │ ├── PublishingService.cs
│ │ │ │ └── VariableMatch.cs
│ │ ├── Roles
│ │ │ ├── Authorization
│ │ │ │ └── RoleAuthorizationRule.cs
│ │ │ ├── DataLoaders
│ │ │ │ └── RoleByIdDataloader.cs
│ │ │ └── Services
│ │ │ │ ├── IRoleService.cs
│ │ │ │ ├── RoleService.cs
│ │ │ │ └── RoleServiceCollectionExtensions.cs
│ │ ├── Schema
│ │ │ ├── SchemaServiceCollectionExtensions.cs
│ │ │ └── Services
│ │ │ │ ├── ISchemaValidator.cs
│ │ │ │ ├── SchemaValidator.cs
│ │ │ │ └── ValueHelper.cs
│ │ ├── ThrowHelper.cs
│ │ └── Variables
│ │ │ ├── Authorization
│ │ │ ├── VariableAuthorizationRule.cs
│ │ │ └── VariableValueAuthorizationRule.cs
│ │ │ ├── DataLoaders
│ │ │ └── VariableByIdDataLoader.cs
│ │ │ ├── Services
│ │ │ └── VariableService.cs
│ │ │ └── VariableServiceCollectionExtensions.cs
│ ├── Authoring.GraphQL
│ │ ├── ApiKeys
│ │ │ ├── ApiKeyMutations.cs
│ │ │ ├── ApiKeyQueries.cs
│ │ │ └── Configuration
│ │ │ │ └── ApplicationRequestExecutorBuilderExtensions.cs
│ │ ├── Applications
│ │ │ ├── ApplicationMutations.cs
│ │ │ ├── ApplicationQueries.cs
│ │ │ ├── Configuration
│ │ │ │ └── ApplicationRequestExecutorBuilderExtensions.cs
│ │ │ ├── Errors
│ │ │ │ ├── ApplicationIdInvalid.cs
│ │ │ │ ├── ApplicationNameTaken.cs
│ │ │ │ ├── ApplicationNotFoundError.cs
│ │ │ │ ├── ApplicationPartComponentNotFoundError.cs
│ │ │ │ ├── ApplicationPartIdInvalid.cs
│ │ │ │ ├── ApplicationPartNameTaken.cs
│ │ │ │ ├── ApplicationPartNotFoundError.cs
│ │ │ │ ├── ComponentNotFoundError.cs
│ │ │ │ ├── EnvironmentNameCollisionError.cs
│ │ │ │ └── EnvironmentPartNotFoundError.cs
│ │ │ ├── Extensions
│ │ │ │ ├── ApplicationApplicationPartExtensions.cs
│ │ │ │ ├── ApplicationExtensions.cs
│ │ │ │ ├── ApplicationPartComponentChangeLogExtensions.cs
│ │ │ │ ├── ApplicationPartComponentExtensions.cs
│ │ │ │ ├── ApplicationPartExtensions.cs
│ │ │ │ └── DeployedEnvironement.cs
│ │ │ └── Relay
│ │ │ │ ├── ApplicationNode.cs
│ │ │ │ ├── ApplicationPartComponentNode.cs
│ │ │ │ └── ApplicationPartNode.cs
│ │ ├── Authoring.GraphQL.csproj
│ │ ├── ChangeLog
│ │ │ ├── ChangeLogQueries.cs
│ │ │ ├── Configuration
│ │ │ │ └── ChangeLogRequestExecutorBuilderExtensions.cs
│ │ │ └── Relay
│ │ │ │ └── ChangeLogNode.cs
│ │ ├── Components
│ │ │ ├── ComponentMutations.cs
│ │ │ ├── ComponentQueries.cs
│ │ │ ├── Configuration
│ │ │ │ └── ComponentsRequestExecutorBuilderExtensions.cs
│ │ │ ├── Errors
│ │ │ │ ├── ComponentNameTaken.cs
│ │ │ │ ├── SchemaInvalidError.cs
│ │ │ │ └── ValueSchemaViolation.cs
│ │ │ ├── Extensions
│ │ │ │ ├── ComponentExtensions.cs
│ │ │ │ └── ComponentScopeExtensions.cs
│ │ │ ├── PaginationResolverContextExtensions.cs
│ │ │ ├── Relay
│ │ │ │ └── ComponentNode.cs
│ │ │ └── Types
│ │ │ │ ├── ComponentScopeInput.cs
│ │ │ │ └── ComponentScopeType.cs
│ │ ├── Environment
│ │ │ ├── Configuration
│ │ │ │ └── EnvironmentsRequestExecutorBuilderExtensions.cs
│ │ │ ├── EnvironmentMutations.cs
│ │ │ ├── EnvironmentQueries.cs
│ │ │ ├── Extensions
│ │ │ │ └── EnvironementExtenstions.cs
│ │ │ └── Relay
│ │ │ │ └── EnvironmentNode.cs
│ │ ├── GraphQLServiceCollectionExtensions.cs
│ │ ├── Groups
│ │ │ ├── Configuration
│ │ │ │ └── GroupsRequestExecutorBuilderExtensions.cs
│ │ │ ├── GroupMutations.cs
│ │ │ ├── GroupQueries.cs
│ │ │ ├── RoleScopeExtensions.cs
│ │ │ └── Transport
│ │ │ │ ├── ClaimRequirementInput.cs
│ │ │ │ ├── IRequirementInput.cs
│ │ │ │ └── RequirementInput.cs
│ │ ├── InternalsVisibleTo.cs
│ │ ├── PersistedQueries
│ │ │ └── RelayResourceManifestQueryStorage.cs
│ │ ├── Publishing
│ │ │ ├── ApplicationPartPublishingExtensions.cs
│ │ │ ├── ClaimVersionResult.cs
│ │ │ ├── Configuration
│ │ │ │ └── PublishingRequestExecutorBuilderExtensions.cs
│ │ │ ├── Extensions
│ │ │ │ ├── ClaimResultExtensions.cs
│ │ │ │ ├── ClaimedVersionExtensions.cs
│ │ │ │ └── PublishedApplicationPartExtensions.cs
│ │ │ ├── LatestPublishedVersion.cs
│ │ │ ├── LatestPublishedVersionResultType.cs
│ │ │ ├── PublishedApplicationPartNode.cs
│ │ │ ├── PublishingMutations.cs
│ │ │ └── PublishingQueries.cs
│ │ ├── Roles
│ │ │ ├── Configuration
│ │ │ │ └── RolesRequestExecutorBuilderExtensions.cs
│ │ │ ├── RoleMutations.cs
│ │ │ └── RoleQueries.cs
│ │ ├── Shared
│ │ │ ├── IUserError.cs
│ │ │ ├── SchemaViolationType.cs
│ │ │ ├── SdlType.cs
│ │ │ └── UserError.cs
│ │ ├── Tracing
│ │ │ ├── ErrorLoggingDiagnosticEventListener.cs
│ │ │ └── GraphQLActivityEnricher.cs
│ │ ├── Variable
│ │ │ ├── Configuration
│ │ │ │ └── VariablesRequestExecutorBuilderExtensions.cs
│ │ │ ├── Extensions
│ │ │ │ ├── VariableExtensions.cs
│ │ │ │ └── VariableValueExtensions.cs
│ │ │ ├── Relay
│ │ │ │ └── VariableNode.cs
│ │ │ ├── VariableMutations.cs
│ │ │ ├── VariableQueries.cs
│ │ │ └── VariableValueScopeType.cs
│ │ └── Viewer
│ │ │ ├── Configuration
│ │ │ └── RolesRequestExecutorBuilderExtensions.cs
│ │ │ ├── Viewer.cs
│ │ │ └── ViewerQueries.cs
│ ├── Authoring.Host
│ │ ├── Authoring.Host.csproj
│ │ ├── Program.cs
│ │ ├── Properties
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Authoring.Messaging
│ │ ├── Authoring.Messaging.csproj
│ │ ├── AuthoringServerBuilderMessagingExtensions.cs
│ │ ├── CreateVaultConfigClient.cs
│ │ └── ICreateVaultConfigClient.cs
│ ├── Authoring.Store.Mongo
│ │ ├── ApiKey
│ │ │ ├── ApiKeyCollectionConfiguration.cs
│ │ │ └── ApiKeyStore.cs
│ │ ├── Applications
│ │ │ ├── ApplicationCollectionConfiguration.cs
│ │ │ └── ApplicationStore.cs
│ │ ├── Authoring.Store.Mongo.csproj
│ │ ├── AuthoringDbContext.cs
│ │ ├── ChangeLogs
│ │ │ ├── ChangeLogCollectionConfiguration.cs
│ │ │ ├── ChangeLogStore.cs
│ │ │ └── WellKnownChangeLogFields.cs
│ │ ├── Components
│ │ │ ├── ComponentCollectionConfiguration.cs
│ │ │ └── ComponentStore.cs
│ │ ├── Environments
│ │ │ ├── EnvironmentCollectionConfiguration.cs
│ │ │ └── EnvironmentStore.cs
│ │ ├── Groups
│ │ │ ├── GroupCollectionConfiguration.cs
│ │ │ └── GroupStore.cs
│ │ ├── IAuthoringDbContext.cs
│ │ ├── ImmutableHashSetSerializer.cs
│ │ ├── MongoStoreServiceCollectionExtensions.cs
│ │ ├── Publishing
│ │ │ ├── ClaimedVersionCollectionConfiguration.cs
│ │ │ ├── PublishedApplicationPartCollectionConfiguration.cs
│ │ │ └── PublishingStore.cs
│ │ ├── Roles
│ │ │ ├── RoleCollectionConfiguration.cs
│ │ │ └── RoleStore.cs
│ │ ├── SerializerHelpers.cs
│ │ └── Variables
│ │ │ ├── FilterDefinitionBuilderExtensions.cs
│ │ │ ├── VariableCollectionConfiguration.cs
│ │ │ ├── VariableStore.cs
│ │ │ ├── VariableValueCollectionConfiguration.cs
│ │ │ └── VariableValueStore.cs
│ ├── Authoring.UI
│ │ ├── .gitignore
│ │ ├── Authoring.UI.csproj
│ │ ├── EmbeddedUIMiddlewareExtensions.cs
│ │ ├── EmbeddedUiMiddleware.cs
│ │ └── UI
│ │ │ └── .keep
│ ├── Authoring
│ │ ├── Authoring.csproj
│ │ ├── Configuration
│ │ │ ├── AuthoringApplicationBuilderExtensions.cs
│ │ │ ├── AuthoringServerBuilder.cs
│ │ │ ├── AuthoringServerBuilderExtensions.cs
│ │ │ ├── ConfixServerBuilderExtensions.cs
│ │ │ └── SessionManagementEndpoints.cs
│ │ └── Seed
│ │ │ ├── AdminRequirementOptions.cs
│ │ │ ├── SeedExtensions.cs
│ │ │ ├── SeedOptions.cs
│ │ │ └── SeedWorker.cs
│ ├── Common
│ │ ├── Common.csproj
│ │ ├── Exceptions
│ │ │ └── UnauthorizedOperationException.cs
│ │ ├── Settings.cs
│ │ ├── TaskHelper.cs
│ │ ├── Token
│ │ │ ├── ITokenProvider.cs
│ │ │ ├── Token.cs
│ │ │ ├── TokenProvider.cs
│ │ │ └── TokenProviderServiceCollectionExtensions.cs
│ │ └── TransactionHelper.cs
│ ├── CryptoProviders.Abstractions
│ │ ├── CryptoProviderDescriptor.cs
│ │ ├── CryptoProviders.Abstractions.csproj
│ │ ├── Encryption
│ │ │ ├── EncryptedValue.cs
│ │ │ ├── IDecryptor.cs
│ │ │ └── IEncryptor.cs
│ │ ├── Extensions
│ │ │ └── EncryptorExtensions.cs
│ │ ├── ICryptoProviderDescriptor.cs
│ │ ├── IEncryptionKeyProvider.cs
│ │ └── Secrets
│ │ │ ├── DataEncryptionKey.cs
│ │ │ └── IDataEncryptionKeyRepository.cs
│ ├── CryptoProviders.AzureKeyVault
│ │ ├── Configuration
│ │ │ ├── AzureKeyVaultOptions.cs
│ │ │ └── AzureKeyVaultServiceCollectionExtensions.cs
│ │ ├── CryptoProviders.AzureKeyVault.csproj
│ │ ├── CryptographyClientFactory.cs
│ │ ├── EncryptionKeyProvider.cs
│ │ ├── ICryptographyClientFactory.cs
│ │ ├── IKeyEncryptionKeyCache.cs
│ │ └── KeyEncryptionKeyCache.cs
│ ├── CryptoProviders.Mongo
│ │ ├── CryptoDbContext.cs
│ │ ├── CryptoProviders.Mongo.csproj
│ │ ├── DataEncryptionKeyRepository.cs
│ │ ├── ICryptoDbContext.cs
│ │ ├── MongoCryptoServiceCollectionExtensions.cs
│ │ └── SecretCollectionConfiguration.cs
│ ├── CryptoProviders
│ │ ├── CfbEncryption.cs
│ │ ├── CryptoProviders.csproj
│ │ ├── CypherAndIv.cs
│ │ ├── EncryptionKeyCryptoProvider.cs
│ │ └── InMemoryCryptoProvider.cs
│ ├── Messaging.RabbitMQ
│ │ ├── Messaging.RabbitMQ.csproj
│ │ ├── RabbitMqMessagingBuilderExtensions.cs
│ │ ├── RabbitMqMessagingUrlFactory.cs
│ │ └── RabbitMqOptions.cs
│ ├── Messaging.ServiceBus
│ │ ├── Messaging.ServiceBus.csproj
│ │ ├── ServiceBusMessagingBuilderExtensions.cs
│ │ ├── ServiceBusMessagingUrlFactory.cs
│ │ └── ServiceBusOptions.cs
│ ├── Messaging
│ │ ├── IMessagingBuilder.cs
│ │ ├── IMessagingUrlFactory.cs
│ │ ├── Messages
│ │ │ ├── CreateVaultConfigRequest.cs
│ │ │ └── CreateVaultConfigResponse.cs
│ │ ├── Messaging.csproj
│ │ ├── MessagingBuilder.cs
│ │ ├── MessagingServiceCollectionConfigurationExtensions.cs
│ │ └── RequestClient.cs
│ ├── Samples.Host
│ │ ├── Program.cs
│ │ ├── Properties
│ │ │ └── launchSettings.json
│ │ ├── Samples.Host.csproj
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ ├── Tooling
│ │ ├── .graphqlrc.json
│ │ ├── Bind.cs
│ │ ├── ClaimCommand.cs
│ │ ├── ClaimCommand.graphql
│ │ ├── ConfixApp.cs
│ │ ├── ConfixClientCommandLineBuilderExtensions.cs
│ │ ├── ConfixRootCommand.cs
│ │ ├── Extensions
│ │ │ ├── ConsoleExtensions.cs
│ │ │ └── ExitException.cs
│ │ ├── Helpers
│ │ │ ├── CommandLineBuilderExtensions.cs
│ │ │ └── ExitCodes.cs
│ │ ├── Options
│ │ │ ├── ApiKeyOption.cs
│ │ │ ├── AppOption.cs
│ │ │ ├── EnvironmentOption.cs
│ │ │ ├── JsonOption.cs
│ │ │ ├── Optional.cs
│ │ │ ├── PartOption.cs
│ │ │ ├── Required.cs
│ │ │ ├── TagOption.cs
│ │ │ └── UrlOption.cs
│ │ ├── Program.cs
│ │ ├── Tooling.csproj
│ │ ├── persisted
│ │ │ └── queries.json
│ │ ├── schema.extensions.graphql
│ │ └── schema.graphql
│ ├── Vault.Abstractions
│ │ ├── Configuration
│ │ │ ├── Configuration.cs
│ │ │ ├── IConfigurationStore.cs
│ │ │ ├── TokenPair.cs
│ │ │ └── Transport
│ │ │ │ ├── GetConfigurationResponse.cs
│ │ │ │ ├── PutConfigurationRequest.cs
│ │ │ │ ├── PutConfigurationResponse.cs
│ │ │ │ ├── RefreshConfigurationRequest.cs
│ │ │ │ └── RefreshConfigurationResponse.cs
│ │ ├── IConfigurationService.cs
│ │ ├── IVaultServerBuilder.cs
│ │ ├── Vault.Abstractions.csproj
│ │ └── WellKnown.cs
│ ├── Vault.Authentication
│ │ ├── AuthenticationExtensions.cs
│ │ └── Vault.Authentication.csproj
│ ├── Vault.Client
│ │ ├── ConfigurationClient.cs
│ │ ├── ConfigurationClientOptions.cs
│ │ ├── IConfigurationClient.cs
│ │ ├── QueryBuilderExtensions.cs
│ │ ├── Vault.Client.csproj
│ │ └── VaultClientServiceCollectionExtensions.cs
│ ├── Vault.Configuration
│ │ ├── .graphqlrc.json
│ │ ├── ApplicationPart.cs
│ │ ├── AuthoringClientFactory.cs
│ │ ├── ConfixConfigurationBuilderExtensions.cs
│ │ ├── JsonConfigurationFileParser.cs
│ │ ├── VariableProvider.cs
│ │ ├── VaulConfigurationProvider.cs
│ │ ├── Vault.Configuration.csproj
│ │ ├── VaultClientFactory.cs
│ │ ├── VaultConfiguration.graphql
│ │ ├── VaultConfigurationSource.cs
│ │ ├── persisted
│ │ │ └── queries.json
│ │ ├── schema.extensions.graphql
│ │ └── schema.graphql
│ ├── Vault.Console
│ │ ├── Program.cs
│ │ └── Vault.Console.csproj
│ ├── Vault.Core
│ │ ├── Configuration
│ │ │ └── ConfigurationService.cs
│ │ ├── Controllers
│ │ │ └── ConfigurationController.cs
│ │ ├── Exceptions
│ │ │ └── ConfigurationNotFoundException.cs
│ │ ├── Vault.Core.csproj
│ │ └── VaultCoreServiceCollectionExtensions.cs
│ ├── Vault.Host
│ │ ├── Program.cs
│ │ ├── Properties
│ │ │ └── launchSettings.json
│ │ └── Vault.Host.csproj
│ ├── Vault.Messaging
│ │ ├── CreateVaultConfigConsumer.cs
│ │ ├── Properties
│ │ │ └── launchSettings.json
│ │ ├── Vault.Messaging.csproj
│ │ └── VaultServerBuilderMessagingExtensions.cs
│ ├── Vault.Store.Mongo
│ │ ├── ConfigurationCollectionConfiguration.cs
│ │ ├── ConfigurationStore.cs
│ │ ├── IVaultDbContext.cs
│ │ ├── MongoStoreServiceCollectionExtensions.cs
│ │ ├── Vault.Store.Mongo.csproj
│ │ └── VaultDbContext.cs
│ └── Vault
│ │ ├── EndpointRouteBuilderExtensions.cs
│ │ ├── Vault.csproj
│ │ ├── VaultServerBuilder.cs
│ │ ├── VaultServerBuilderExtensions.cs
│ │ └── VaultServiceCollectionExtensions.cs
└── test
│ ├── Authoring.Authentication.Tests
│ ├── Authoring.Authentication.Tests.csproj
│ ├── GroupProviderTests.cs
│ ├── RoleProviderTests.cs
│ ├── SessionAccessorTests.cs
│ ├── SessionTests.cs
│ └── __snapshots__
│ │ ├── SessionAccessorTests.GetSession_WithValidAPIToken_ReturnsSession.snap
│ │ ├── SessionAccessorTests.GetSession_WithValidUserClaims_ReturnsSession.snap
│ │ ├── SessionTests.GetGrantsForScope_ForScope_MatchSnapshot_Application.snap
│ │ ├── SessionTests.GetGrantsForScope_ForScope_MatchSnapshot_Component.snap
│ │ ├── SessionTests.GetGrantsForScope_ForScope_MatchSnapshot_Configuration.snap
│ │ ├── SessionTests.GetGrantsForScope_ForScope_MatchSnapshot_Identity.snap
│ │ └── SessionTests.GetGrantsForScope_ForScope_MatchSnapshot_Variable.snap
│ ├── Authoring.GraphQL.Tests
│ ├── Authoring.GraphQL.Tests.csproj
│ ├── RelayResourceManifestQueryStorageTests.cs
│ ├── SchemaTests.cs
│ └── __snapshots__
│ │ └── SchemaTests.PrintSchema.snap
│ ├── Authoring.Integration.Tests
│ ├── .graphqlrc.json
│ ├── ApplicationTests.cs
│ ├── ApplicationTests.graphql
│ ├── Authoring.Integration.Tests.csproj
│ ├── ComponentTests.cs
│ ├── ComponentTests.graphql
│ ├── Fragments.graphql
│ ├── Helpers
│ │ ├── AssertHelpers.cs
│ │ ├── InMemoryKeyEncryptionKeyExtensions.cs
│ │ ├── InMemoryMessagingBuilderExtensions.cs
│ │ ├── TestExecutorBuilder.cs
│ │ ├── TestHelper.cs
│ │ ├── UserExtensions.cs
│ │ └── Wellknown.cs
│ ├── __snapshots__
│ │ ├── ComponentTests.ComponentById_ValidId_ReturnsComponent.snap
│ │ ├── ComponentTests.CreateComponent_BrokenSchema_ReturnsError.snap
│ │ ├── ComponentTests.CreateComponent_ReadPermission_Fail.snap
│ │ ├── ComponentTests.CreateComponent_ValidInput_CreatesComponent.snap
│ │ ├── ComponentTests.RenameComponent_ReadPermission_Fails.snap
│ │ ├── ComponentTests.UpdateComponentSchema_InvalidSchema_Error.snap
│ │ ├── ComponentTests.UpdateComponentSchema_NewValuesDontMatchSchema_Error.snap
│ │ ├── ComponentTests.UpdateComponentSchema_ValidValues_UpdatesComponent.snap
│ │ ├── ComponentTests.UpdateComponentSchema_WithoutWritePermission_Fails.snap
│ │ ├── ComponentTests.UpdateComponentScopes_ValidScopes_UpdatesComponent.snap
│ │ ├── ComponentTests.UpdateComponentScopes_WithoutWritePermission_Fails.snap
│ │ ├── ComponentTests.UpdateComponentValues_NewValuesDontMatchSchema_Error.snap
│ │ ├── ComponentTests.UpdateComponentValues_ValidValues_UpdatesComponent.snap
│ │ └── ComponentTests.UpdateComponentValues_WithoutWritePermission_Fails.snap
│ ├── schema.extensions.graphql
│ └── schema.graphql
│ ├── Authoring.Store.Mongo.Tests
│ ├── Authoring.Store.Mongo.Tests.csproj
│ ├── VariableValueStoreTests.cs
│ └── __snapshots__
│ │ ├── VariableValueStoreTests.GetByKeyAsync_GetAllKeyFieldsNullVariable_ReturnsRightVariable.snap
│ │ ├── VariableValueStoreTests.GetByKeyAsync_GetAllKeyFieldsSetVariable_ReturnsRightVariable.snap
│ │ ├── VariableValueStoreTests.GetByKeyAsync_GetOneKeyFieldSetVariable_ReturnsRightVariable.snap
│ │ ├── VariableValueStoreTests.GetByKeyAsync_GetTwoKeyFieldsSetVariable_ReturnsRightVariable.snap
│ │ ├── VariableValueStoreTests.UpsertAsync_SaveNewVariableValueEmptyValues_SuccessfullyInserted.snap
│ │ ├── VariableValueStoreTests.UpsertAsync_SaveNewVariableValue_SuccessfullyInserted.snap
│ │ ├── VariableValueStoreTests.UpsertAsync_SaveVariableWithNewKey_NewInserted.snap
│ │ └── VariableValueStoreTests.UpsertAsync_UpdateVariableByExistingKey_SuccessfullyUpdated.snap
│ ├── CryptoProviders.AzureKeyVault.Tests
│ ├── CryptoProviders.AzureKeyVault.Tests.csproj
│ ├── KeyVaultVariableCryptoProviderTests.cs
│ ├── TestContext.cs
│ └── appsettings.json
│ └── Directory.Build.props
└── Frontend
├── .gitignore
├── .graphqlrc.json
├── .prettierignore
├── .prettierrc.json
├── README.md
├── index.html
├── package.json
├── persisted_queries.json
├── public
├── favicon.ico
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
├── relay.config.js
├── schema-extensions
└── relay-directives.graphql
├── schema.graphql
├── src
├── App.css
├── App.tsx
├── Connections.ts
├── RelayEnvironment.ts
├── __generated__
│ ├── AddComponentsToApplicationPartDialog.graphql.ts
│ ├── AddComponentsToApplicationPartDialogMutation.graphql.ts
│ ├── AddPartToApplicationDialogMutation.graphql.ts
│ ├── ApiKeysList.graphql.ts
│ ├── ApiKeysListPaginationQuery.graphql.ts
│ ├── ApiKeysListQuery.graphql.ts
│ ├── ApiKeysList_ApiKeyListItem.graphql.ts
│ ├── ApplicationCascader.graphql.ts
│ ├── ApplicationCascader_ApplicationPagination_Query.graphql.ts
│ ├── ApplicationCascader_Applications.graphql.ts
│ ├── ApplicationPartChangeLog.graphql.ts
│ ├── ApplicationPartComponents.graphql.ts
│ ├── ApplicationPartComponents_ApplicationPartComponentsDisplay.graphql.ts
│ ├── ApplicationPartSectionHeader.graphql.ts
│ ├── ApplicationsList.graphql.ts
│ ├── ApplicationsListItem.graphql.ts
│ ├── ApplicationsListItem_ApplicationPart.graphql.ts
│ ├── ApplicationsListItem_Component.graphql.ts
│ ├── ApplicationsListItem_DefaultListItem.graphql.ts
│ ├── ApplicationsListItem_SelectedListItem.graphql.ts
│ ├── ApplicationsListPaginationQuery.graphql.ts
│ ├── ApplicationsListQuery.graphql.ts
│ ├── ChangeComponentScopeDialog.graphql.ts
│ ├── ChangeComponentScopeDialogMutation.graphql.ts
│ ├── ChangeLog.graphql.ts
│ ├── ChangeLog_AddComponentToApplicationPartChange.graphql.ts
│ ├── ChangeLog_AddPartToApplicationChange.graphql.ts
│ ├── ChangeLog_ApplicationPartComponentValuesChange.graphql.ts
│ ├── ChangeLog_ComponentSchemaChange.graphql.ts
│ ├── ChangeLog_ComponentValuesChange.graphql.ts
│ ├── ChangeLog_CreateComponentChange.graphql.ts
│ ├── ChangeLog_CreateVariableChange.graphql.ts
│ ├── ChangeLog_DeleteVariableValueChange.graphql.ts
│ ├── ChangeLog_PublishedApplicationPartChange.graphql.ts
│ ├── ChangeLog_RemoveComponentChange.graphql.ts
│ ├── ChangeLog_RemoveComponentFromApplicationPartChange.graphql.ts
│ ├── ChangeLog_RemovePartFromApplicationChange.graphql.ts
│ ├── ChangeLog_RenameApplicationChange.graphql.ts
│ ├── ChangeLog_RenameApplicationPartChange.graphql.ts
│ ├── ChangeLog_RenameComponentChange.graphql.ts
│ ├── ChangeLog_RenameVariableChange.graphql.ts
│ ├── ChangeLog_VariableValueChange.graphql.ts
│ ├── CompareApplicationPartComponentVersions_Query.graphql.ts
│ ├── ComponentsList.graphql.ts
│ ├── ComponentsListPaginationQuery.graphql.ts
│ ├── ComponentsListQuery.graphql.ts
│ ├── ComponentsSelectQuery.graphql.ts
│ ├── Connections_applications.graphql.ts
│ ├── Connections_components.graphql.ts
│ ├── DeployedEnvironmentsOverview.graphql.ts
│ ├── EditApiKeyQuery.graphql.ts
│ ├── EditApiKey_Form.graphql.ts
│ ├── EditApiKey_Header.graphql.ts
│ ├── EditApiKey_RoleScopeSection.graphql.ts
│ ├── EditApiKey_UpdateApiKeyRoles_Mutation.graphql.ts
│ ├── EditApplication.graphql.ts
│ ├── EditApplicationPart.graphql.ts
│ ├── EditApplicationPartComponent.graphql.ts
│ ├── EditApplicationPartComponent_ApplicationPartComponentChangeLog.graphql.ts
│ ├── EditApplicationPartComponent_EditConfiguration.graphql.ts
│ ├── EditApplicationPartComponent_GetById_Query.graphql.ts
│ ├── EditApplicationPartComponent_UpdateComponentValues_Mutation.graphql.ts
│ ├── EditApplicationPartQuery.graphql.ts
│ ├── EditApplicationPart_DeployedEnvironments.graphql.ts
│ ├── EditApplicationPart_Variable.graphql.ts
│ ├── EditApplication_ApplicationChangeLog.graphql.ts
│ ├── EditApplication_ApplicationParts.graphql.ts
│ ├── EditApplication_ApplicationPartsDisplay.graphql.ts
│ ├── EditApplication_Query.graphql.ts
│ ├── EditApplication_RefetchQuery.graphql.ts
│ ├── EditApplication_Variables.graphql.ts
│ ├── EditComponent.graphql.ts
│ ├── EditComponentQuery.graphql.ts
│ ├── EditComponentUpdateMutation.graphql.ts
│ ├── EditComponent_AvailableIn.graphql.ts
│ ├── EditComponent_AvailableIn_Query.graphql.ts
│ ├── EditComponent_ComponentChangeLog.graphql.ts
│ ├── EditComponent_EditComponentForm.graphql.ts
│ ├── EditEnvironmentQuery.graphql.ts
│ ├── EditEnvironment_EditEnvironmentForm.graphql.ts
│ ├── EditEnvironment_Header.graphql.ts
│ ├── EditEnvironment_IsDeveloperAccessAllowedFrom.graphql.ts
│ ├── EditEnvironment_ParentEnvironement.graphql.ts
│ ├── EditGroupQuery.graphql.ts
│ ├── EditGroup_Form.graphql.ts
│ ├── EditGroup_Header.graphql.ts
│ ├── EditGroup_RequirementsSection.graphql.ts
│ ├── EditGroup_RoleScopeSection.graphql.ts
│ ├── EditGroup_UpdateGroupRequirements_Mutation.graphql.ts
│ ├── EditGroup_UpdateGroupRoles_Mutation.graphql.ts
│ ├── EditRoleForm_ChangeRolePermissions_Mutation.graphql.ts
│ ├── EditRoleQuery.graphql.ts
│ ├── EditRole_Form.graphql.ts
│ ├── EditRole_Header.graphql.ts
│ ├── EditVariable.graphql.ts
│ ├── EditVariableQuery.graphql.ts
│ ├── EditVariable_ApplicationPartSelector.graphql.ts
│ ├── EditVariable_ApplicationSelector.graphql.ts
│ ├── EditVariable_ApplicationSelector_Query.graphql.ts
│ ├── EditVariable_EditVariableForm.graphql.ts
│ ├── EditVariable_VariableChangeLog.graphql.ts
│ ├── EnvironmentsList.graphql.ts
│ ├── EnvironmentsListPaginationQuery.graphql.ts
│ ├── EnvironmentsListQuery.graphql.ts
│ ├── EnvironmentsList_EnvironmentListItem.graphql.ts
│ ├── EnvironmentsSelectQuery.graphql.ts
│ ├── ExplorerTreePaginationQuery.graphql.ts
│ ├── ExplorerTreeQuery.graphql.ts
│ ├── ExplorerTree_Application.graphql.ts
│ ├── ExplorerTree_ApplicationDetails.graphql.ts
│ ├── ExplorerTree_ApplicationPart.graphql.ts
│ ├── ExplorerTree_Applications.graphql.ts
│ ├── GroupsList.graphql.ts
│ ├── GroupsListPaginationQuery.graphql.ts
│ ├── GroupsListQuery.graphql.ts
│ ├── GroupsList_ListItem.graphql.ts
│ ├── NewApiKeyMutation.graphql.ts
│ ├── NewApplicationMutation.graphql.ts
│ ├── NewComponentMutation.graphql.ts
│ ├── NewComponent_Query.graphql.ts
│ ├── NewEnvironmentMutation.graphql.ts
│ ├── NewGroupMutation.graphql.ts
│ ├── NewRoleMutation.graphql.ts
│ ├── NewVariableMutation.graphql.ts
│ ├── PublishApplicationPartDialogMutation.graphql.ts
│ ├── PublishedApplicationParts.graphql.ts
│ ├── PublishedApplicationPartsQuery.graphql.ts
│ ├── RemoveApiKeyDialogMutation.graphql.ts
│ ├── RemoveComponentFromApplicationPartDialogMutation.graphql.ts
│ ├── RemoveEnvironmentDialogMutation.graphql.ts
│ ├── RemoveGroupDialogMutation.graphql.ts
│ ├── RemovePartFromApplicationDialogMutation.graphql.ts
│ ├── RemoveRoleDialogMutation.graphql.ts
│ ├── RenameApplicationDialogMutation.graphql.ts
│ ├── RenameApplicationPartDialogMutation.graphql.ts
│ ├── RenameComponentDialogMutation.graphql.ts
│ ├── RenameEnvironmentDialogMutation.graphql.ts
│ ├── RenameGroupDialogMutation.graphql.ts
│ ├── RenameRoleDialogMutation.graphql.ts
│ ├── RenameVariableDialogMutation.graphql.ts
│ ├── RolesList.graphql.ts
│ ├── RolesListPaginationQuery.graphql.ts
│ ├── RolesListQuery.graphql.ts
│ ├── RolesList_RoleListItem.graphql.ts
│ ├── RolesSelectQuery.graphql.ts
│ ├── SaveDeveloperAccessButtonMutation.graphql.ts
│ ├── SetParentEnvironmentDialogMutation.graphql.ts
│ ├── UserContextProviderQuery.graphql.ts
│ ├── VariableEditorDeleteVariableValueMutation.graphql.ts
│ ├── VariableEditorQuery.graphql.ts
│ ├── VariableEditorSaveVariableMutation.graphql.ts
│ ├── VariableEditor_useEnvironments.graphql.ts
│ ├── VariableEditor_useEnvironmentsPaginationQuery.graphql.ts
│ ├── VariableSelectQuery.graphql.ts
│ ├── VariableValueList.graphql.ts
│ ├── VariablesList.graphql.ts
│ ├── VariablesListPaginationQuery.graphql.ts
│ ├── VariablesListQuery.graphql.ts
│ └── VariablesList_ListItem.graphql.ts
├── applications
│ ├── Applications.tsx
│ ├── ApplicationsList.tsx
│ ├── CompareApplicationPartComponentVersions.tsx
│ ├── EditApplication.tsx
│ ├── EditApplicationPart.tsx
│ ├── EditApplicationPartComponent.tsx
│ ├── NewApplication.tsx
│ ├── components
│ │ ├── ApplicationCascader.tsx
│ │ ├── ApplicationPartChangeLog.tsx
│ │ ├── ApplicationPartComponents.tsx
│ │ ├── ApplicationPartSectionHeader.tsx
│ │ ├── ComponentDiffEditor.tsx
│ │ ├── DeployedEnvironmentsOverview.tsx
│ │ ├── PublishedApplicationParts.tsx
│ │ ├── SchemaComponentEditor.tsx
│ │ └── buildJsonSchema.tsx
│ ├── dialogs
│ │ ├── AddComponentsToApplicationPartDialog.tsx
│ │ ├── AddPartToApplicationDialog.tsx
│ │ ├── PublishApplicationPartDialog.tsx
│ │ ├── RemoveComponentFromApplicationPartDialog.tsx
│ │ ├── RemovePartFromApplicationDialog.tsx
│ │ ├── RenameApplicationDialog.tsx
│ │ └── RenameApplicationPartDialog.tsx
│ └── validation
│ │ └── applicationSchema.tsx
├── components
│ ├── Components.tsx
│ ├── ComponentsList.tsx
│ ├── EditComponent.tsx
│ ├── NewComponent.tsx
│ ├── componentSchema.tsx
│ └── controls
│ │ ├── ComponentsSelect.tsx
│ │ └── dialogs
│ │ ├── ChangeComponentScopeDialog.tsx
│ │ └── RenameComponentDialog.tsx
├── config.ts
├── environment
│ ├── EditEnvironment.tsx
│ ├── Environments.tsx
│ ├── EnvironmentsList.tsx
│ ├── NewEnvironment.tsx
│ ├── controls
│ │ ├── EnvironmentsSelect.tsx
│ │ ├── buttons
│ │ │ └── SaveDeveloperAccessButton.tsx
│ │ └── dialogs
│ │ │ ├── RemoveEnvironmentDialog.tsx
│ │ │ ├── RenameEnvironmentDialog.tsx
│ │ │ └── SetParentEnvironmentDialog.tsx
│ └── environmentSchema.tsx
├── explorer
│ ├── Explorer.tsx
│ └── ExplorerTree.tsx
├── fetchGraphQL.ts
├── icons
│ └── icons.tsx
├── images
│ ├── logo.png
│ └── logo_small.png
├── index.css
├── index.tsx
├── logo.svg
├── react-app-env.d.ts
├── reportWebVitals.ts
├── routes.tsx
├── settings
│ ├── Settings.tsx
│ ├── apiKeys
│ │ ├── ApiKeys.tsx
│ │ ├── ApiKeysList.tsx
│ │ ├── EditApiKey.tsx
│ │ ├── NewApiKey.tsx
│ │ └── controls
│ │ │ └── dialogs
│ │ │ └── RemoveApiKeyDialog.tsx
│ ├── groups
│ │ ├── EditGroup.tsx
│ │ ├── Groups.tsx
│ │ ├── GroupsList.tsx
│ │ ├── NewGroup.tsx
│ │ ├── controls
│ │ │ └── dialogs
│ │ │ │ ├── RemoveGroupDialog.tsx
│ │ │ │ └── RenameGroupDialog.tsx
│ │ └── groupSchema.tsx
│ ├── roles
│ │ ├── EditRole.tsx
│ │ ├── NewRole.tsx
│ │ ├── Roles.tsx
│ │ ├── RolesList.tsx
│ │ ├── controls
│ │ │ ├── RolesSelect.tsx
│ │ │ ├── dialogs
│ │ │ │ ├── RemoveRoleDialog.tsx
│ │ │ │ └── RenameRoleDialog.tsx
│ │ │ └── forms
│ │ │ │ └── PermissionForm.tsx
│ │ └── roleSchema.tsx
│ └── shared
│ │ └── RoleScopeEdit.tsx
├── setupTests.ts
├── shared
│ ├── ButtonBar.tsx
│ ├── ChangeLog.tsx
│ ├── ColorTag.tsx
│ ├── CommitErrors.tsx
│ ├── DefaultSuspense.tsx
│ ├── DetailView.tsx
│ ├── EditablePageHeader.tsx
│ ├── FormField.tsx
│ ├── FullSizeBox.tsx
│ ├── InfiniteScrollList.tsx
│ ├── InlinePage.tsx
│ ├── Page.tsx
│ ├── PaginatedListWithSearch.tsx
│ ├── QueryOptions.ts
│ ├── SearchBar.tsx
│ ├── SectionHeader.tsx
│ ├── TabRow.tsx
│ ├── UseFormik.ts
│ ├── UserContext.tsx
│ ├── Wrapper.tsx
│ ├── chunkBy.ts
│ ├── colors.ts
│ ├── debounce.ts
│ ├── distinct.ts
│ ├── editor
│ │ ├── ComponentEditor.tsx
│ │ ├── SchemaEditor.tsx
│ │ └── defaultEditorOptions.tsx
│ ├── ensureDate.ts
│ ├── formatDate.ts
│ ├── formatGraphQL.tsx
│ ├── groupBy.ts
│ ├── hacks.ts
│ ├── hashCode.ts
│ ├── id.tsx
│ ├── noop.ts
│ ├── pipeCommitFn.tsx
│ ├── useCommitForm.ts
│ ├── useConnectionId.ts
│ ├── useDefaultRefetch.ts
│ ├── useDelay.ts
│ ├── useEventListener.ts
│ ├── useGoTo.ts
│ ├── useHandler.ts
│ ├── useIntersectionObserver.ts
│ ├── useLoadNextChain.ts
│ ├── useMultiplexer.ts
│ ├── useQuery.ts
│ ├── useTabSwitcher.ts
│ ├── useToggle.ts
│ └── withSilentSuspense.tsx
├── types
│ ├── babel-plugin-relay.d.ts
│ └── react-app-env.d.ts
└── variables
│ ├── EditVariable.tsx
│ ├── NewVariable.tsx
│ ├── Variables.tsx
│ ├── VariablesList.tsx
│ ├── controls
│ ├── VariableEditor.tsx
│ ├── VariableSelect.tsx
│ ├── VariableValueList.tsx
│ └── dialogs
│ │ └── RenameVariableDialog.tsx
│ └── variableSchema.tsx
├── tsconfig.json
├── vite.config.ts
└── yarn.lock
/.config/dotnet-tools.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 1,
3 | "isRoot": true,
4 | "tools": {
5 | "strawberryshake.tools": {
6 | "version": "13.0.5",
7 | "commands": [
8 | "dotnet-graphql"
9 | ]
10 | },
11 | "dotnet-sonarscanner": {
12 | "version": "4.8.0",
13 | "commands": [
14 | "dotnet-sonarscanner"
15 | ]
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 |
5 | ---
6 |
7 | **Describe the bug**
8 | A clear and concise description of what the bug is.
9 |
10 | **To Reproduce**
11 | Steps to reproduce the behavior:
12 | 1. Go to '...'
13 | 2. Click on '....'
14 | 3. Scroll down to '....'
15 | 4. See error
16 |
17 | **Expected behavior**
18 | A clear and concise description of what you expected to happen.
19 |
20 | **Desktop (please complete the following information):**
21 | - OS: [e.g. iOS]
22 | - Version [e.g. 22]
23 |
24 | **Additional context**
25 | Add any other context about the problem here.
26 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/custom.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Custom issue template
3 | about: Describe this issue template's purpose here.
4 |
5 | ---
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 |
5 | ---
6 |
7 | **Is your feature request related to a problem? Please describe.**
8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
9 |
10 | **Describe the solution you'd like**
11 | A clear and concise description of what you want to happen.
12 |
13 | **Describe alternatives you've considered**
14 | A clear and concise description of any alternative solutions or features you've considered.
15 |
16 | **Additional context**
17 | Add any other context or screenshots about the feature request here.
18 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | Summary of the changes (Less than 80 chars)
2 |
3 | - Detail 1
4 | - Detail 2
5 |
6 | Addresses #bugnumber (in this specific format)
7 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "hediet.vscode-drawio"
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Work in Progress
2 |
3 | ## Getting Started
4 |
5 | ## Features
6 |
7 | ## Community
8 |
9 | This project has adopted the code of conduct defined by the [Contributor Covenant](https://contributor-covenant.org/)
10 | to clarify expected behavior in our community. For more information, see the [Swiss Life OSS Code of Conduct](https://swisslife-oss.github.io/coc).
11 |
12 | ### Architecture
13 | 
14 |
--------------------------------------------------------------------------------
/build-ui.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | rm -rf ./src/Backend/src/Authoring.UI/UI/
3 | yarn --cwd ./src/Frontend
4 | yarn --cwd ./src/Frontend build
5 | cp -R ./src/Frontend/build/* ./src/Backend/src/Authoring.UI/UI
6 | touch ./src/Backend/src/Authoring.UI/UI/.keep
7 |
--------------------------------------------------------------------------------
/global.json:
--------------------------------------------------------------------------------
1 | {
2 | "sdk": {
3 | "version": "7.0.203"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/nuget.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/Backend/Directory.Build.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | $([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))
5 |
6 |
7 |
8 |
9 | net7.0
10 | ConfiX
11 | enable
12 | preview
13 | enable
14 | true
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/ApiKey/ApiKey.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Immutable;
2 | using Confix.Authentication.Authorization;
3 | using HotChocolate;
4 | using HotChocolate.Types.Relay;
5 |
6 | namespace Confix.Authentication.ApiKey;
7 |
8 | public record ApiKey(
9 | [property: ID] Guid Id,
10 | string Name,
11 | [property: GraphQLIgnore] string KeyHash,
12 | [property: GraphQLIgnore] string KeyPrefix,
13 | ImmutableHashSet Roles)
14 | {
15 | private const int PrefixLength = 10;
16 | public static readonly int KeyLength = 64;
17 |
18 |
19 | public static string GetPrefix(string key)
20 | {
21 | if (key.Length < PrefixLength)
22 | {
23 | throw new ArgumentException("Provided key is too short", nameof(key));
24 | }
25 |
26 | return key[..PrefixLength];
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/ApiKey/ApiKeyAuthenticationSucceededContext.cs:
--------------------------------------------------------------------------------
1 | using System.Security.Claims;
2 | using Microsoft.AspNetCore.Authentication;
3 | using Microsoft.AspNetCore.Http;
4 |
5 | namespace Confix.Authentication.ApiKey;
6 |
7 | public class ApiKeyAuthenticationSucceededContext : ResultContext
8 | {
9 | public ApiKeyAuthenticationSucceededContext(
10 | HttpContext context,
11 | AuthenticationScheme scheme,
12 | ApiKeyOptions options,
13 | ClaimsPrincipal principal)
14 | : base(context, scheme, options)
15 | {
16 | Principal = principal;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/ApiKey/ApiKeyDefaults.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.ApiKey;
2 |
3 | public static class ApiKeyDefaults
4 | {
5 | ///
6 | /// Default value for AuthenticationScheme
7 | ///
8 | public const string AuthenticationScheme = "ApiKey";
9 |
10 | public const string HeaderName = "confix-api-key";
11 |
12 | public const string ApiKeyIdSerializationType = "N";
13 |
14 | public const string ApiKeyClaim = "api-key-id";
15 | }
16 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/ApiKey/ApiKeyExtensions.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Authentication;
2 |
3 | namespace Confix.Authentication.ApiKey;
4 |
5 | public static class ApiKeyExtensions
6 | {
7 | public static AuthenticationBuilder AddApiKey(this AuthenticationBuilder builder)
8 | {
9 | return builder.AddScheme(
10 | ApiKeyDefaults.AuthenticationScheme,
11 | "Api Key",
12 | null);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/ApiKey/ApiKeyOptions.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Authentication;
2 |
3 | namespace Confix.Authentication.ApiKey;
4 |
5 | public class ApiKeyOptions : AuthenticationSchemeOptions
6 | {
7 | }
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/ApiKey/IApiKeyProvider.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.ApiKey;
2 |
3 | public interface IApiKeyProvider
4 | {
5 | ///
6 | /// Validates the key and provides with and instance of .
7 | ///
8 | ///
9 | ///
10 | ///
11 | Task ProvideAsync(string key, CancellationToken cancellationToken);
12 |
13 | Task GetByIdAsync(Guid id, CancellationToken cancellationToken);
14 | }
15 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/ClaimRequirement.cs:
--------------------------------------------------------------------------------
1 | using System.Security.Claims;
2 |
3 | namespace Confix.Authentication.Authorization;
4 |
5 | public record ClaimRequirement(string Type, string Value) : Requirement
6 | {
7 | public override bool Validate(ClaimsPrincipal principal)
8 | {
9 | return principal.HasClaim(Type, Value);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Extensions/AuthorizationRuleServiceCollectionExtensions.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using Microsoft.Extensions.DependencyInjection.Extensions;
3 |
4 | namespace Confix.Authentication.Authorization;
5 |
6 | public static class AuthorizationRuleServiceCollectionExtensions
7 | {
8 | public static IServiceCollection AddAuthorizationRule(
9 | this IServiceCollection services) where TRule : class, IAuthorizationRule
10 | {
11 | services.TryAddScoped();
12 | services.AddScoped();
13 | services.AddScoped, TRule>(sp => sp.GetRequiredService());
14 |
15 | return services;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Extensions/SessionAccessorExtensions.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public static class SessionAccessorExtensions
4 | {
5 | public static async Task IsAuthenticated(
6 | this ISessionAccessor accessor,
7 | CancellationToken cancellationToken)
8 | {
9 | var session = await accessor.GetSession(cancellationToken);
10 |
11 | return session is not null;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Group.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Immutable;
2 | using HotChocolate.Types.Relay;
3 |
4 | namespace Confix.Authentication.Authorization;
5 |
6 | public record Group(
7 | [property: ID] Guid Id,
8 | string Name,
9 | ImmutableHashSet Requirements,
10 | ImmutableHashSet Roles);
11 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/IAuthorizationRule.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics.CodeAnalysis;
2 |
3 | namespace Confix.Authentication.Authorization;
4 |
5 | public interface IAuthorizationRule
6 | {
7 | ValueTask IsAuthorizedFromAsync(
8 | TOther? resource,
9 | Permissions permissions,
10 | CancellationToken cancellationToken);
11 |
12 | ValueTask IsAuthorizedAsync(
13 | [NotNullWhen(true)]T? resource,
14 | Permissions permissions,
15 | CancellationToken cancellationToken);
16 | }
17 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/IAuthorizationService.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public interface IAuthorizationService
4 | {
5 | IAuthorizationRule RuleFor();
6 |
7 | ValueTask IsAuthenticatedAsync(CancellationToken cancellationToken);
8 |
9 | ValueTask EnsureAuthenticated(CancellationToken cancellationToken);
10 | }
11 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/ISession.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public interface ISession
4 | {
5 | IReadOnlyList Groups { get; }
6 |
7 | UserInfo UserInfo { get; }
8 |
9 | IReadOnlySet GetNamespacesWithAccess(Scope scope, Permissions permission);
10 | IReadOnlySet GetGrantsForScope(Scope scope);
11 | bool HasPermission(string @namespace, Scope scope, Permissions permission);
12 | }
13 |
14 | public readonly record struct Grant(string Namespace, Scope Scope, Permissions Permission);
15 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/ISessionAccessor.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public interface ISessionAccessor
4 | {
5 | ValueTask GetSession(CancellationToken cancellationToken);
6 | }
7 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Permission.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public record Permission(Scope Scope, Permissions Permissions);
4 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Permissions.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | [Flags]
4 | public enum Permissions
5 | {
6 | Read = 1,
7 | Write = 2,
8 | Claim = 4,
9 | Publish = 8,
10 | Decrypt = 16
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Policies.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Authorization;
2 |
3 | namespace Confix.Authentication.Authorization;
4 |
5 | public static class Policies
6 | {
7 | public static class Names
8 | {
9 | public const string VaultManage = nameof(VaultManage);
10 | public const string ConfigurationClaim = nameof(ConfigurationClaim);
11 | }
12 |
13 | public static readonly AuthorizationPolicy VaultManagePolicy = new AuthorizationPolicyBuilder()
14 | .RequireClaim("scope", Scopes.VaultManage)
15 | .Build();
16 |
17 | public static readonly AuthorizationPolicy ConfigurationClaimPolicy =
18 | new AuthorizationPolicyBuilder()
19 | .RequireClaim("scope", Scopes.ConfigurationClaim)
20 | .Build();
21 | }
22 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Providers/IGroupProvider.cs:
--------------------------------------------------------------------------------
1 | using System.Security.Claims;
2 |
3 | namespace Confix.Authentication.Authorization;
4 |
5 | internal interface IGroupProvider
6 | {
7 | ValueTask> GetGroupsOfUserAsync(
8 | ClaimsPrincipal principal,
9 | CancellationToken cancellationToken);
10 | }
11 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Providers/IRoleProvider.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | internal interface IRoleProvider
4 | {
5 | ValueTask> GetRoleMapAsync(CancellationToken cancellationToken);
6 | }
7 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Repositories/IGroupStore.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public interface IGroupStore
4 | {
5 | Task> GetAllAsync(CancellationToken cancellationToken);
6 |
7 | Task GetByIdAsync(Guid id, CancellationToken cancellationToken);
8 |
9 | Task UpsertAsync(Group group, CancellationToken cancellationToken);
10 |
11 | Task DeleteByIdAsync(Guid id, CancellationToken cancellationToken);
12 |
13 | IQueryable Query();
14 |
15 | Task> GetByIdsAsync(
16 | IEnumerable ids,
17 | CancellationToken cancellationToken);
18 | }
19 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Repositories/IRoleStore.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public interface IRoleStore
4 | {
5 | Task> GetAllAsync(CancellationToken cancellationToken);
6 |
7 | Task GetByIdAsync(Guid id, CancellationToken cancellationToken);
8 |
9 | Task> GetByIdsAsync(
10 | IEnumerable ids,
11 | CancellationToken cancellationToken);
12 |
13 | Task UpsertAsync(Role group, CancellationToken cancellationToken);
14 |
15 | Task DeleteByIdAsync(Guid id, CancellationToken cancellationToken);
16 |
17 | IQueryable Query();
18 | }
19 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Requirement.cs:
--------------------------------------------------------------------------------
1 | using System.Security.Claims;
2 | using HotChocolate;
3 | using HotChocolate.Types;
4 |
5 | namespace Confix.Authentication.Authorization;
6 |
7 | [UnionType]
8 | public abstract record Requirement
9 | {
10 | [GraphQLIgnore]
11 | public abstract bool Validate(ClaimsPrincipal principal);
12 | }
13 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Role.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate.Types.Relay;
2 |
3 | namespace Confix.Authentication.Authorization;
4 |
5 | public record Role([property: ID] Guid Id, string Name, IReadOnlyList Permissions);
6 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/RoleScope.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate.Types.Relay;
2 |
3 | namespace Confix.Authentication.Authorization;
4 |
5 | public record RoleScope(
6 | string Namespace,
7 | [property: ID(nameof(Role))] IReadOnlyCollection RoleIds);
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Scope.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public enum Scope
4 | {
5 | Configuration,
6 | Application,
7 | Variable,
8 | Identity,
9 | Component,
10 | Environment
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/Scopes.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public static class Scopes
4 | {
5 | public const string VaultManage = "confix.vault.manage";
6 | public const string ConfigurationClaim = "confix.configuration.claim";
7 | }
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/UserInfo.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public record UserInfo(
4 | string Id,
5 | string? Name,
6 | string? Email
7 | );
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Authorization/WellKnownNamespaces.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication.Authorization;
2 |
3 | public static class WellKnownNamespaces
4 | {
5 | public const string Global = nameof(Global);
6 | }
7 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/ClientCredentials/ClientCredentialsClientOptions.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication;
2 |
3 | public class ClientCredentialsClientOptions
4 | {
5 | public string ClientId { get; set; } = string.Empty;
6 | public string Secret { get; set; } = string.Empty;
7 | public string Scopes { get; set; } = string.Empty;
8 | public string Authority { get; set; } = string.Empty;
9 | public string Url { get; set; } = string.Empty;
10 | }
11 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/ClientCredentials/IClientCredentialCache.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication;
2 |
3 | public interface IClientCredentialCache
4 | {
5 | ValueTask GetAccessTokenAsync(
6 | string authority,
7 | string clientId,
8 | string clientSecret,
9 | string scopes,
10 | CancellationToken cancellationToken);
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/Extensions/StringExtensions.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authentication;
2 |
3 | internal static class StringExtensions
4 | {
5 | public static string? ValueOrNull(this string? str)
6 | {
7 | if (string.IsNullOrWhiteSpace(str))
8 | {
9 | return null;
10 | }
11 |
12 | return str;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/Backend/src/Authentication/InternalsVisibleTo.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.CompilerServices;
2 |
3 | [assembly: InternalsVisibleTo("Confix.Authoring.Authentication.Tests")]
4 | [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
5 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/ApiKeys/DataLoaders/IApiKeyById.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authentication.ApiKey;
2 | using GreenDonut;
3 |
4 | namespace Confix.Authoring.ApiKeys.DataLoaders;
5 |
6 | public interface IApiKeyByIdDataLoader : IDataLoader
7 | {
8 | }
9 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/ApiKeys/Models/ApiKeyWithSecret.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authentication.ApiKey;
2 |
3 | namespace Confix.Authoring.ApiKeys;
4 |
5 | public record ApiKeyWithSecret(ApiKey Key, string Secret);
6 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/ApiKeys/Stores/IApiKeyStore.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authentication.ApiKey;
2 |
3 | namespace Confix.Authoring.ApiKeys;
4 |
5 | public interface IApiKeyStore
6 | {
7 | Task> FindPossibleKeysByKeyPrefixAsync(
8 | string key,
9 | CancellationToken cancellationToken);
10 |
11 | Task> FindKeysByIdsAsync(
12 | IEnumerable ids,
13 | CancellationToken cancellationToken);
14 |
15 | Task FindKeyByIdAsync(Guid id, CancellationToken cancellationToken);
16 |
17 | Task DeleteApiKeyByIdAsync(
18 | Guid apiKeyId,
19 | CancellationToken cancellationToken);
20 |
21 | IQueryable Query();
22 |
23 | Task UpsetApiKeyAsync(ApiKey key, CancellationToken cancellationToken);
24 | }
25 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Changes/CreateApplicationChange.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate;
2 | using HotChocolate.Types;
3 |
4 | namespace Confix.Authoring.Store;
5 |
6 | public sealed record CreateApplicationChange : IApplicationChange
7 | {
8 | public CreateApplicationChange(
9 | Guid applicationId,
10 | int applicationVersion,
11 | Application application)
12 | {
13 | ApplicationId = applicationId;
14 | ApplicationVersion = applicationVersion;
15 | Application = application;
16 | }
17 |
18 | public Application Application { get; init; }
19 |
20 | public string Kind => nameof(CreateApplicationChange);
21 |
22 | [GraphQLName("application")]
23 | [UseDataLoader(typeof(IApplicationDataLoader))]
24 | public Guid ApplicationId { get; init; }
25 |
26 | public int ApplicationVersion { get; init; }
27 | }
28 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Changes/IApplicationChange.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IApplicationChange : IChange
6 | {
7 | [GraphQLType(typeof(Application))]
8 | [GraphQLName("application")]
9 | Guid ApplicationId { get; }
10 |
11 | int ApplicationVersion { get; }
12 | }
13 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Changes/IApplicationPartChange.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IApplicationPartChange : IApplicationChange
6 | {
7 | [GraphQLType(typeof(ApplicationPart))]
8 | [GraphQLName("part")]
9 | Guid PartId { get; }
10 |
11 | int PartVersion { get; }
12 | }
13 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Changes/IApplicationPartComponentChange.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IApplicationPartComponentChange : IApplicationPartChange
6 | {
7 | [GraphQLType(typeof(ApplicationPartComponent))]
8 | [GraphQLName("partComponent")]
9 | Guid PartComponentId { get; }
10 |
11 | int PartComponentVersion { get; }
12 | }
13 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Changes/RenameApplicationChange.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate;
2 | using HotChocolate.Types;
3 |
4 | namespace Confix.Authoring.Store;
5 |
6 | public sealed record RenameApplicationChange : IApplicationChange
7 | {
8 | public RenameApplicationChange(Guid applicationId, int applicationVersion, string name)
9 | {
10 | ApplicationId = applicationId;
11 | ApplicationVersion = applicationVersion;
12 | Name = name;
13 | }
14 |
15 | public string Name { get; init; }
16 |
17 | public string Kind => nameof(RenameApplicationChange);
18 |
19 | [GraphQLName("application")]
20 | [UseDataLoader(typeof(IApplicationDataLoader))]
21 | public Guid ApplicationId { get; init; }
22 |
23 | public int ApplicationVersion { get; init; }
24 | }
25 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/DataLoaders/IApplicationByComponentIdDataLoader.cs:
--------------------------------------------------------------------------------
1 | using GreenDonut;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IApplicationByComponentIdDataLoader
6 | : IDataLoader
7 | {
8 | }
9 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/DataLoaders/IApplicationByPartIdDataLoader.cs:
--------------------------------------------------------------------------------
1 | using GreenDonut;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IApplicationByPartIdDataLoader : IDataLoader
6 | {
7 | }
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/DataLoaders/IApplicationDataLoader.cs:
--------------------------------------------------------------------------------
1 | using GreenDonut;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IApplicationDataLoader : IDataLoader
6 | {
7 | }
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/DataLoaders/IApplicationPartComponentDataLoader.cs:
--------------------------------------------------------------------------------
1 | using GreenDonut;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IApplicationPartComponentDataLoader : IDataLoader
6 | {
7 | }
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/DataLoaders/IApplicationPartDataLoader.cs:
--------------------------------------------------------------------------------
1 | using GreenDonut;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IApplicationPartDataLoader : IDataLoader
6 | {
7 | }
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Exceptions/ApplicationNotFoundException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class ApplicationNotFoundException : Exception
4 | {
5 | public ApplicationNotFoundException(Guid applicationId)
6 | {
7 | ApplicationId = applicationId;
8 | }
9 |
10 | public Guid ApplicationId { get; }
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Exceptions/ApplicationPartComponentNotFoundException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class ApplicationPartComponentNotFoundException : Exception
4 | {
5 | public ApplicationPartComponentNotFoundException(Guid componentPartId)
6 | : base($"The component part with id {componentPartId:N}.")
7 | {
8 | ComponentPartId = componentPartId;
9 | }
10 |
11 | public Guid ComponentPartId { get; set; }
12 | }
13 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Exceptions/ApplicationPartNotFoundException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class ApplicationPartNotFoundException : Exception
4 | {
5 | public ApplicationPartNotFoundException(Guid applicationId)
6 | : base($"The application with id `{applicationId:N}` not found.")
7 | {
8 | ApplicationPartId = applicationId;
9 | }
10 |
11 | public Guid ApplicationPartId { get; }
12 | }
13 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Models/Application.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel.DataAnnotations;
2 | using HotChocolate.Types.Relay;
3 |
4 | namespace Confix.Authoring.Store;
5 |
6 | public sealed record Application
7 | {
8 | public Application(Guid id, string? name, string @namespace)
9 | {
10 | Id = id;
11 | Name = name;
12 | Namespace = @namespace;
13 | }
14 |
15 | [ID]
16 | public Guid Id { get; init; }
17 |
18 | [Required]
19 | public string? Name { get; init; }
20 |
21 | public string Namespace { get; init; }
22 |
23 | public int Version { get; init; }
24 |
25 | public ICollection Parts { get; init; } = new List();
26 | }
27 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Models/ApplicationPart.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel.DataAnnotations;
2 | using HotChocolate.Types.Relay;
3 |
4 | namespace Confix.Authoring.Store;
5 |
6 | public sealed record ApplicationPart
7 | {
8 | public ApplicationPart(Guid id, string? name, int version)
9 | {
10 | Id = id;
11 | Name = name;
12 | Version = version;
13 | }
14 |
15 | public ApplicationPart(Guid id, string? name)
16 | {
17 | Id = id;
18 | Name = name;
19 | }
20 |
21 | [ID]
22 | public Guid Id { get; init; }
23 |
24 | [Required]
25 | public string? Name { get; init; }
26 |
27 | public int Version { get; init; }
28 |
29 | public ICollection Components { get; init; } =
30 | new List();
31 | }
32 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Applications/Models/ApplicationPartComponent.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate.Types.Relay;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public sealed record ApplicationPartComponent
6 | {
7 | public ApplicationPartComponent(Guid id, Guid componentId, int version, string? values)
8 | {
9 | Id = id;
10 | ComponentId = componentId;
11 | Version = version;
12 | Values = values;
13 | }
14 |
15 | public ApplicationPartComponent(Guid id, Guid componentId, string? values)
16 | {
17 | Id = id;
18 | ComponentId = componentId;
19 | Values = values;
20 | }
21 |
22 | [ID]
23 | public Guid Id { get; init; }
24 |
25 | public Guid ComponentId { get; init; }
26 |
27 | public int Version { get; init; }
28 |
29 | public string? Values { get; init; }
30 | }
31 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/ChangeLog/Models/ChangeLog.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authentication.Authorization;
2 | using HotChocolate.Types.Relay;
3 |
4 | namespace Confix.Authoring.Store;
5 |
6 | public sealed record ChangeLog
7 | {
8 | public ChangeLog(Guid id, IChange change, UserInfo modifiedBy, DateTime modifiedAt)
9 | {
10 | Id = id;
11 | Change = change;
12 | ModifiedBy = modifiedBy;
13 | ModifiedAt = modifiedAt;
14 | }
15 |
16 | [ID]
17 | public Guid Id { get; init; }
18 |
19 | public IChange Change { get; init; }
20 |
21 | public UserInfo ModifiedBy { get; init; }
22 |
23 | public DateTime ModifiedAt { get; init; }
24 | }
25 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/ChangeLog/Models/IChange.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring.Store;
2 |
3 | public interface IChange
4 | {
5 | string Kind { get; }
6 | }
7 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Changes/ComponentValuesChange.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authoring.Store;
2 | using HotChocolate;
3 | using HotChocolate.Types;
4 |
5 | namespace Confix.Authoring.Changes;
6 |
7 | public sealed class ComponentValuesChange : IComponentChange
8 | {
9 | public ComponentValuesChange(Guid componentId, int componentVersion, string values)
10 | {
11 | ComponentId = componentId;
12 | ComponentVersion = componentVersion;
13 | Values = values;
14 | }
15 |
16 | public string Values { get; init; }
17 |
18 | public string Kind => nameof(ComponentValuesChange);
19 |
20 | [GraphQLName("component")]
21 | [UseDataLoader(typeof(IComponentDataLoader))]
22 | public Guid ComponentId { get; init; }
23 |
24 | public int ComponentVersion { get; init; }
25 | }
26 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Changes/CreateComponentChange.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authoring.Store;
2 | using HotChocolate;
3 | using HotChocolate.Types;
4 |
5 | namespace Confix.Authoring.Changes;
6 |
7 | public sealed class CreateComponentChange : IComponentChange
8 | {
9 | public CreateComponentChange(Guid componentId, int componentVersion, Component component)
10 | {
11 | ComponentId = componentId;
12 | ComponentVersion = componentVersion;
13 | Component = component;
14 | }
15 |
16 | [GraphQLIgnore]
17 | public Component Component { get; init; }
18 |
19 | public string Kind => nameof(ComponentValuesChange);
20 |
21 | [GraphQLName("component")]
22 | [UseDataLoader(typeof(IComponentDataLoader))]
23 | public Guid ComponentId { get; init; }
24 |
25 | public int ComponentVersion { get; init; }
26 | }
27 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Changes/IComponentChange.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authoring.Store;
2 | using HotChocolate;
3 |
4 | namespace Confix.Authoring.Changes;
5 |
6 | public interface IComponentChange : IChange
7 | {
8 | [GraphQLType(typeof(Component))]
9 | [GraphQLName("component")]
10 | Guid ComponentId { get; }
11 |
12 | int ComponentVersion { get; }
13 | }
14 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Changes/RemoveComponentChange.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authoring.Store;
2 | using HotChocolate;
3 | using HotChocolate.Types;
4 |
5 | namespace Confix.Authoring.Changes;
6 |
7 | public sealed class RemoveComponentChange : IComponentChange
8 | {
9 | public RemoveComponentChange(Guid componentId, int componentVersion, Component component)
10 | {
11 | ComponentId = componentId;
12 | ComponentVersion = componentVersion;
13 | Component = component;
14 | }
15 |
16 | [GraphQLIgnore]
17 | public Component Component { get; init; }
18 |
19 | public string Kind => nameof(ComponentValuesChange);
20 |
21 | [GraphQLName("component")]
22 | [UseDataLoader(typeof(IComponentDataLoader))]
23 | public Guid ComponentId { get; init; }
24 |
25 | public int ComponentVersion { get; init; }
26 | }
27 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Changes/RenameComponentChange.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authoring.Store;
2 | using HotChocolate;
3 | using HotChocolate.Types;
4 |
5 | namespace Confix.Authoring.Changes;
6 |
7 | public sealed class RenameComponentChange : IComponentChange
8 | {
9 | public RenameComponentChange(Guid componentId, int componentVersion, string name)
10 | {
11 | ComponentId = componentId;
12 | ComponentVersion = componentVersion;
13 | Name = name;
14 | }
15 |
16 | public string Name { get; init; }
17 |
18 | public string Kind => nameof(RenameComponentChange);
19 |
20 | [GraphQLName("component")]
21 | [UseDataLoader(typeof(IComponentDataLoader))]
22 | public Guid ComponentId { get; init; }
23 |
24 | public int ComponentVersion { get; init; }
25 | }
26 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/DataLoaders/IComponentDataLoader.cs:
--------------------------------------------------------------------------------
1 | using GreenDonut;
2 |
3 | namespace Confix.Authoring.Store;
4 |
5 | public interface IComponentDataLoader : IDataLoader
6 | {
7 | }
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Exceptions/ComponentNotFoundException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public class ComponentNotFoundException : Exception
4 | {
5 | public ComponentNotFoundException(Guid componentId)
6 | : base($"The component with id `{componentId:N}` was not found.")
7 | {
8 | ComponentId = componentId;
9 | }
10 |
11 | public Guid ComponentId { get; }
12 | }
13 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Models/ApplicationComponentScope.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authoring.Store;
2 | using HotChocolate.Types.Relay;
3 |
4 | namespace Confix.Authoring;
5 |
6 | public sealed record ApplicationComponentScope([property: ID]Guid ApplicationId): ComponentScope();
7 |
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Models/ApplicationPartComponentScope.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authoring.Store;
2 | using HotChocolate.Types.Relay;
3 |
4 | namespace Confix.Authoring;
5 |
6 | public sealed record ApplicationPartComponentScope([property: ID]Guid ApplicationPartId): ComponentScope();
7 |
8 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Models/ComponentScope.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public abstract record ComponentScope();
4 |
5 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Models/NamespaceComponentScope.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed record NamespaceComponentScope(string Namespace): ComponentScope();
4 |
5 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Components/Stores/IComponentStore.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring.Store;
2 |
3 | public interface IComponentStore
4 | {
5 | Task GetByIdAsync(Guid id, CancellationToken cancellationToken);
6 |
7 | Task> GetManyByIdAsync(
8 | IEnumerable ids,
9 | CancellationToken cancellationToken);
10 |
11 | Task> GetByFilterAsync(
12 | IEnumerable namespaces,
13 | IEnumerable scopes,
14 | string? search,
15 | int skip,
16 | int take,
17 | CancellationToken cancellationToken);
18 |
19 | Task AddAsync(Component component, CancellationToken cancellationToken);
20 |
21 | Task UpdateAsync(Component component, CancellationToken cancellationToken);
22 | }
23 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Configuration/IAuthoringServerBuilder.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 |
3 | namespace Confix.Authoring;
4 |
5 | public interface IAuthoringServerBuilder
6 | {
7 | IServiceCollection Services { get; }
8 | }
9 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Environment/Exceptions/EnvironmentCycleDetectedException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class EnvironmentCycleDetectedException : Exception
4 | {
5 | public EnvironmentCycleDetectedException(IEnumerable path)
6 | : base("There was a cycle in the parent child relation of environments detected")
7 | {
8 | Path = path.ToArray();
9 | }
10 |
11 | public IReadOnlyList Path { get; }
12 |
13 | public string Code => "EnvironmentCycleDetected";
14 | }
15 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Environment/Exceptions/EnvironmentNameCollisionException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class EnvironmentNameCollisionException : Exception
4 | {
5 | public EnvironmentNameCollisionException(string name)
6 | {
7 | Name = name;
8 | }
9 |
10 | public string Name { get; }
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Environment/Exceptions/EnvironmentNotFoundException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class EnvironmentNotFoundException : Exception
4 | {
5 | public EnvironmentNotFoundException(Guid environmentId)
6 | {
7 | EnvironmentId = environmentId;
8 | }
9 |
10 | public Guid EnvironmentId { get; }
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Environment/Models/Environment.cs:
--------------------------------------------------------------------------------
1 | using HotChocolate.Types.Relay;
2 |
3 | namespace Confix.Authoring;
4 |
5 | public sealed record Environment
6 | {
7 | public Environment(Guid id, string? name = null!)
8 | {
9 | name ??= string.Empty;
10 | Id = id;
11 | Name = name;
12 | }
13 |
14 | [ID]
15 | public Guid Id { get; init; }
16 |
17 | public string Name { get; init; }
18 |
19 | public Guid? ParentId { get; init; }
20 |
21 | public bool AllowDeveloperAccess { get; init; }
22 | }
23 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Exceptions/EntityIdInvalidException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class EntityIdInvalidException : Exception
4 | {
5 | public EntityIdInvalidException(string entityName, Guid entityId)
6 | : base($"The {entityName} id `{entityId}` is invalid.")
7 | {
8 | EntityName = entityName;
9 | EntityId = entityId;
10 | }
11 |
12 | public string EntityName { get; }
13 |
14 | public Guid EntityId { get; }
15 | }
16 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Exceptions/NameTakenException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class NameTakenException : Exception
4 | {
5 | public NameTakenException(string name)
6 | {
7 | Name = name;
8 | }
9 |
10 | public string Name { get; }
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Groups/Dataloaders/IGroupByIdDataLoader.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authentication.Authorization;
2 | using GreenDonut;
3 |
4 | namespace Confix.Authoring.Groups;
5 |
6 | public interface IGroupByIdDataLoader : IDataLoader
7 | {
8 | }
9 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Publishing/DataLoader/IPublishedApplicationPartByIdDataloader.cs:
--------------------------------------------------------------------------------
1 | using GreenDonut;
2 |
3 | namespace Confix.Authoring.Publishing;
4 |
5 | public interface IPublishedApplicationPartByIdDataloader
6 | : IDataLoader
7 | {
8 | }
9 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Publishing/DataLoader/IPublishedApplicationPartsByPartIdDataloader.cs:
--------------------------------------------------------------------------------
1 | using GreenDonut;
2 |
3 | namespace Confix.Authoring.Publishing;
4 |
5 | public interface IPublishedApplicationPartsByPartIdDataloader
6 | : IDataLoader
7 | {
8 | }
9 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Roles/Dataloaders/IRoleByIdDataLoader.cs:
--------------------------------------------------------------------------------
1 | using Confix.Authentication.Authorization;
2 | using GreenDonut;
3 |
4 | namespace Confix.Authoring.Roles;
5 |
6 | public interface IRoleByIdDataLoader : IDataLoader
7 | {
8 | }
9 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/ScalarNames.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public static class ScalarNames
4 | {
5 | public const string String = nameof(String);
6 | public const string Int = nameof(Int);
7 | public const string Boolean = nameof(Boolean);
8 | public const string Float = nameof(Float);
9 | }
10 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Schema/Exceptions/InvalidSchemaException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 |
3 | public sealed class InvalidSchemaException: Exception{
4 | public InvalidSchemaException(GraphQLSchemaError[] errors) : base("The Provided sdl is not valid")
5 | {
6 | Errors = errors;
7 | }
8 |
9 | public GraphQLSchemaError[] Errors;
10 | }
11 | public record GraphQLSchemaError(string message);
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Schema/Exceptions/SchemaViolationException.cs:
--------------------------------------------------------------------------------
1 | namespace Confix.Authoring;
2 | public sealed class SchemaViolationException : Exception
3 | {
4 | public SchemaViolationException(IReadOnlyList violations)
5 | : base("Values has invalid structure.")
6 | {
7 | Violations = violations;
8 | }
9 |
10 | public IReadOnlyList Violations { get; }
11 | }
12 |
--------------------------------------------------------------------------------
/src/Backend/src/Authoring.Abstractions/Schema/Models/SchemaViolation.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel.DataAnnotations;
2 |
3 | namespace Confix.Authoring;
4 |
5 | public sealed class SchemaViolation
6 | {
7 | public SchemaViolation(IReadOnlyList