private async Task UpdateConfigEntryAsync(GameConfigurationUpdateRequest <TConfigType> request, int ownershipId, CancellationToken token = default)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            switch (request.Source)
            {
            case ConfigurationSourceType.Account:
            {
                var entry = await AccountConfigRepository.RetrieveAsync(new GameConfigurationKey <TConfigType>(ownershipId, request.ConfigType), token);

                entry.Data = new GameConfigData(request.Data);
                await AccountConfigRepository.UpdateAsync(new GameConfigurationKey <TConfigType>(ownershipId, request.ConfigType), entry, token);

                return;
            }

            case ConfigurationSourceType.Character:
            {
                var entry = await CharacterConfigRepository.RetrieveAsync(new GameConfigurationKey <TConfigType>(ownershipId, request.ConfigType), token);

                entry.Data = new GameConfigData(request.Data);
                await CharacterConfigRepository.UpdateAsync(new GameConfigurationKey <TConfigType>(ownershipId, request.ConfigType), entry, token);

                return;
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(request.Source), request.Source, null);
            }
        }
        private async Task <bool> CreateConfigEntryAsync(GameConfigurationUpdateRequest <TConfigType> request, int ownershipId, CancellationToken token = default)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            switch (request.Source)
            {
            case ConfigurationSourceType.Account:
                return(await AccountConfigRepository.TryCreateAsync(new AccountGameConfiguration <TConfigType>(ownershipId, new GameConfigData(request.Data), request.ConfigType), token));

            case ConfigurationSourceType.Character:
                return(await CharacterConfigRepository.TryCreateAsync(new CharacterGameConfiguration <TConfigType>(ownershipId, new GameConfigData(request.Data), request.ConfigType), token));

            default:
                throw new ArgumentOutOfRangeException(nameof(request.Source), request.Source, null);
            }
        }
        private async Task <bool> ContainsConfigEntryAsync(ConfigurationSourceType source, TConfigType configType, int ownershipId, CancellationToken token = default)
        {
            if (configType == null)
            {
                throw new ArgumentNullException(nameof(configType));
            }
            if (!Enum.IsDefined(typeof(ConfigurationSourceType), source))
            {
                throw new InvalidEnumArgumentException(nameof(source), (int)source, typeof(ConfigurationSourceType));
            }

            switch (source)
            {
            case ConfigurationSourceType.Account:
                return(await AccountConfigRepository.ContainsAsync(new GameConfigurationKey <TConfigType>(ownershipId, configType), token));

            case ConfigurationSourceType.Character:
                return(await CharacterConfigRepository.ContainsAsync(new GameConfigurationKey <TConfigType>(ownershipId, configType), token));

            default:
                throw new ArgumentOutOfRangeException(nameof(source), source, null);
            }
        }