Trying out some json converters

This commit is contained in:
2021-11-06 16:25:14 -04:00
parent 12c90a27b4
commit d1840fb164
8 changed files with 134 additions and 3 deletions

View File

@@ -114,7 +114,11 @@ namespace TOOHUCardAPI.Controllers
private async Task<IActionResult> Get(string body) private async Task<IActionResult> Get(string body)
{ {
PlayerDataGetRequestObject requestObject = JsonConvert.DeserializeObject<PlayerDataGetRequestObject>(body); PlayerDataGetRequestObject requestObject = JsonConvert.DeserializeObject<PlayerDataGetRequestObject>(body);
IEnumerable<User> users = await Task.WhenAll(requestObject.Ids.Values.Select(val => _userService.LoginUser(val))); IEnumerable<User> users = new List<User>();
foreach (var val in requestObject.Ids.Values)
{
users = users.Append(await _userService.LoginUser(val)); // threading errors
}
IEnumerable<long> queriedUserSteamIds = requestObject.Ids.Select(i => i.Value); IEnumerable<long> queriedUserSteamIds = requestObject.Ids.Select(i => i.Value);
IEnumerable<PlayerDataGetResponseObjectPlayer> responsePlayers = users IEnumerable<PlayerDataGetResponseObjectPlayer> responsePlayers = users
.Where(user => queriedUserSteamIds.Contains(user.SteamId)) .Where(user => queriedUserSteamIds.Contains(user.SteamId))

View File

@@ -37,6 +37,7 @@ namespace TOOHUCardAPI.DTO.PlayerData
[JsonProperty("power_max_total")] public int PowerMaxTotal { get; set; } [JsonProperty("power_max_total")] public int PowerMaxTotal { get; set; }
[JsonProperty("pet_model")] public string PetModel { get; set; } [JsonProperty("pet_model")] public string PetModel { get; set; }
[JsonProperty("pet_effect")] public string PetEffect { get; set; } [JsonProperty("pet_effect")] public string PetEffect { get; set; }
public Dictionary<string, string> EncodedCardGroups { get; set; }
public Dictionary<string, object> ToDynamicProperties() public Dictionary<string, object> ToDynamicProperties()
{ {
@@ -52,6 +53,9 @@ namespace TOOHUCardAPI.DTO.PlayerData
PlayerDataGetResponseObjectPlayer responseObject = mapper.Map<PlayerDataGetResponseObjectPlayer>(user); PlayerDataGetResponseObjectPlayer responseObject = mapper.Map<PlayerDataGetResponseObjectPlayer>(user);
responseObject.IsFirstWin = user.LastFirstWin.AddDays(1) < DateTime.Now ? 1 : 0; responseObject.IsFirstWin = user.LastFirstWin.AddDays(1) < DateTime.Now ? 1 : 0;
responseObject.LevelList = user.CardLevels.EncodeLevelList(); responseObject.LevelList = user.CardLevels.EncodeLevelList();
responseObject.EncodedCardGroups = user.EncodedCardGroups
.Select(ecg => KeyValuePair.Create(ecg.GroupKey, ecg.EncodedString))
.ToDictionary(kv => kv.Key, kv => kv.Value);
return responseObject; return responseObject;
} }
} }

View File

@@ -0,0 +1,14 @@
using System.Collections.Generic;
namespace TOOHUCardAPI.DTO.RankData
{
public class RankCardDTO
{
public string ItemName { get; set; }
public int Star { get; set; }
public long Damage { get; set; }
public int Power { get; set; }
public int Attack { get; set; }
public Dictionary<int, string> Equip { get; set; }
}
}

View File

@@ -1,7 +1,18 @@
using System.Collections.Generic;
using Newtonsoft.Json;
namespace TOOHUCardAPI.DTO.RankData namespace TOOHUCardAPI.DTO.RankData
{ {
public class RankDataGetResponse : OkResponse public class RankDataGetResponse : OkResponse
{ {
[JsonProperty("bo")]
public RankDataGetResponseBody Body { get; set; }
}
public class RankDataGetResponseBody
{
[JsonProperty()]
public Dictionary<int, object> FFAEntries { get; set; }
public Dictionary<int, object> TeamEntries { get; set; }
} }
} }

View File

@@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace TOOHUCardAPI.DTO.RankData
{
public class RankEntryDTO
{
public string RankType { get; set; }
public long SteamId { get; set; }
public long UserId { get; set; }
public string Username { get; set; }
public string Version { get; set; }
public int Wave { get; set; }
public long Damage { get; set; }
// need cards here
public List<RankCardDTO> Cards { get; set; }
}
}

View File

@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using TOOHUCardAPI.DTO.PlayerData;
namespace TOOHUCardAPI.Data.JsonConverters
{
public class PlayerDataGetResponseObjectPlayerConverter : JsonConverter<PlayerDataGetResponseObjectPlayer>
{
public override void WriteJson(JsonWriter writer, PlayerDataGetResponseObjectPlayer value, JsonSerializer serializer)
{
var encodedCardGroups = value.EncodedCardGroups;
value.EncodedCardGroups = null;
JObject jo = JObject.FromObject(value);
foreach (var (key, s) in encodedCardGroups)
{
jo[key] = s;
}
jo.WriteTo(writer);
}
public override PlayerDataGetResponseObjectPlayer ReadJson(JsonReader reader, Type objectType,
PlayerDataGetResponseObjectPlayer existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
PlayerDataGetResponseObjectPlayer playerObject = existingValue ?? new PlayerDataGetResponseObjectPlayer();
serializer.Populate(reader, playerObject);
playerObject.EncodedCardGroups = jo.Properties().Where(prop => prop.Name.Contains("cardgroup"))
.Select(prop => KeyValuePair.Create(prop.Name, prop.Value.ToObject<string>()))
.ToDictionary(kv => kv.Key, kv => kv.Value);
return playerObject;
}
}
}

View File

@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using TOOHUCardAPI.DTO.RankData;
namespace TOOHUCardAPI.Data.JsonConverters
{
public class RankEntryDTOConverter : JsonConverter<RankEntryDTO>
{
public override void WriteJson(JsonWriter writer, RankEntryDTO value, JsonSerializer serializer)
{
List<RankCardDTO> cards = value.Cards;
value.Cards = null;
JObject jo = JObject.FromObject(value);
for (int i = 0; i < cards.Count; i++)
{
jo[$"card{i}"] = JObject.FromObject(cards[i]);
}
jo.WriteTo(writer);
}
public override RankEntryDTO ReadJson(JsonReader reader, Type objectType, RankEntryDTO existingValue, bool hasExistingValue,
JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
RankEntryDTO dto = new RankEntryDTO();
serializer.Populate(reader, dto);
dto.Cards = jo.Properties().Where(prop => prop.Name.Contains("card"))
.Select(i => i.Value.ToObject<RankCardDTO>()).ToList();
return dto;
}
}
}

View File

@@ -12,8 +12,10 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using NLog.Extensions.Logging; using NLog.Extensions.Logging;
using TOOHUCardAPI.Data; using TOOHUCardAPI.Data;
using TOOHUCardAPI.Data.JsonConverters;
using TOOHUCardAPI.Data.Repositories; using TOOHUCardAPI.Data.Repositories;
using TOOHUCardAPI.Data.Services; using TOOHUCardAPI.Data.Services;
@@ -32,7 +34,14 @@ namespace TOOHUCardAPI
// This method gets called by the runtime. Use this method to add services to the container. // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
services.AddControllers().AddNewtonsoftJson(); services.AddControllers().AddNewtonsoftJson(opt =>
{
opt.SerializerSettings.Converters = new List<JsonConverter>
{
new RankEntryDTOConverter(),
new PlayerDataGetResponseObjectPlayerConverter()
};
});
services.AddDbContext<AppDbContext>(opt => services.AddDbContext<AppDbContext>(opt =>
{ {
opt.UseNpgsql(Configuration.GetConnectionString("postgres")); opt.UseNpgsql(Configuration.GetConnectionString("postgres"));