CreateCharacterAsync([FromBody] RPGCharacterCreationRequest <TRaceType, TClassType> request, CancellationToken token = default)
        {
            //TODO: Fix GetAccountId API
            int accountId = ClaimsReader.GetAccountId <int>(User);

            if (!ModelState.IsValid)
            {
                return(Failure <RPGCharacterCreationResult, CharacterCreationResponseCode>(CharacterCreationResponseCode.GeneralError));
            }

            //TODO: Add validation pipeline.
            if (String.IsNullOrWhiteSpace(request.Name))
            {
                return(Failure <RPGCharacterCreationResult, CharacterCreationResponseCode>(CharacterCreationResponseCode.InvalidName));
            }

            try
            {
                DBRPGCharacter character = await CharacterRepository.CreateCharacterAsync(accountId, request.Name, request.Race, request.ClassType, token);

                return(Success <RPGCharacterCreationResult, CharacterCreationResponseCode>(new RPGCharacterCreationResult(character.Id)));
            }
            catch (Exception e)
            {
                if (Logger.IsEnabled(LogLevel.Error))
                {
                    Logger.LogError($"Failed to create Character: {request} Reason: {e}");
                }

                return(Failure <RPGCharacterCreationResult, CharacterCreationResponseCode>(CharacterCreationResponseCode.GeneralError));
            }
        }
 public FullCharacterData(DBRPGCharacter character, DBRPGCharacterDefinition <TRaceType, TClassType> definition)
 {
     Character  = character ?? throw new ArgumentNullException(nameof(character));
     Definition = definition ?? throw new ArgumentNullException(nameof(definition));
 }