diff --git a/TOOHUCardAPI/Controllers/GameConfigController.cs b/TOOHUCardAPI/Controllers/GameConfigController.cs index eda6a8b..9561500 100644 --- a/TOOHUCardAPI/Controllers/GameConfigController.cs +++ b/TOOHUCardAPI/Controllers/GameConfigController.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using TOOHUCardAPI.Models; +using TOOHUCardAPI.DTO; namespace TOOHUCardAPI.Controllers { diff --git a/TOOHUCardAPI/Controllers/PlayerDataController.cs b/TOOHUCardAPI/Controllers/PlayerDataController.cs index 841ec32..006b9dc 100644 --- a/TOOHUCardAPI/Controllers/PlayerDataController.cs +++ b/TOOHUCardAPI/Controllers/PlayerDataController.cs @@ -5,12 +5,16 @@ using System.Linq; using System.Net.Http; using System.Reflection; using System.Threading.Tasks; +using AutoMapper; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using TOOHUCardAPI.Data; -using TOOHUCardAPI.Models; +using TOOHUCardAPI.Data.Models; +using TOOHUCardAPI.Data.Repositories; +using TOOHUCardAPI.DTO; namespace TOOHUCardAPI.Controllers { @@ -18,6 +22,17 @@ namespace TOOHUCardAPI.Controllers [ApiController] public class PlayerDataController : MethodBasedController { + private readonly ILogger _logger; + private readonly UserRepository _userRepository; + private readonly IMapper _mapper; + + public PlayerDataController(ILogger logger, UserRepository userRepository, IMapper mapper) + { + _logger = logger; + _userRepository = userRepository; + _mapper = mapper; + } + /** * The game uses a single endpoint for player data. * The object they send has a method field that's used to decide what's being done @@ -33,10 +48,17 @@ namespace TOOHUCardAPI.Controllers } [EndpointHandler("get")] - private async Task GetDummy(string body) + private async Task Get(string body) { PlayerDataGetRequestObject requestObject = JsonConvert.DeserializeObject(body); - PlayerDataGetResponseObject response = new PlayerDataGetResponseObject(requestObject.Ids.Keys.Count); + Dictionary users = requestObject.Ids.Aggregate(new Dictionary(), + (dictionary, pair) => + { + User user = _userRepository.GetOrCreateUser(pair.Value); + dictionary[pair.Key] = user; + return dictionary; + }); + PlayerDataGetResponseObject response = new PlayerDataGetResponseObject(users, _mapper); return response; } diff --git a/TOOHUCardAPI/Models/GameConfigResponse.cs b/TOOHUCardAPI/DTO/GameConfigResponse.cs similarity index 72% rename from TOOHUCardAPI/Models/GameConfigResponse.cs rename to TOOHUCardAPI/DTO/GameConfigResponse.cs index 489ab99..1197dcc 100644 --- a/TOOHUCardAPI/Models/GameConfigResponse.cs +++ b/TOOHUCardAPI/DTO/GameConfigResponse.cs @@ -2,15 +2,15 @@ using System; using System.Text.Json.Serialization; using Newtonsoft.Json; -namespace TOOHUCardAPI.Models +namespace TOOHUCardAPI.DTO { /** * GameRules.GameData.code = data.code // "0000" for success GameRules.GameData.msg = data.msg // error message if any - GameRules.GameData.game_code = data.game_code or "" - GameRules.GameData.game_msg = data.game_msg or "" - GameRules.GameData.luck_card = data.luck_card or "" - GameRules.GameData.luck_crit = data.luck_crit or 0 + GameRules.GameData.game_code = data.game_code or "" // Possibly some incrementing value for the room num + GameRules.GameData.game_msg = data.game_msg or "" // message shown on startup + GameRules.GameData.luck_card = data.luck_card or "" // card that luck_crit applies to or "all" + GameRules.GameData.luck_crit = data.luck_crit or 0 // above GameRules.GameData.new_card_list = data.new_card_list or "" GameRules.GameData.open_day_list = data.open_day_list or "" GameRules.GameData.is_open_day = data.is_open_day or 0 @@ -19,14 +19,15 @@ namespace TOOHUCardAPI.Models public class GameConfigResponse { private static string SUCCESS_CODE = "0000"; + private static string DEFAULT_GAME_MESSAGE = "Welcome to english Touhou Card"; [JsonProperty("code")] public string Code { get; set; } = SUCCESS_CODE; [JsonProperty("msg")] public string Message { get; set; } = string.Empty; [JsonProperty("game_code")] public string GameCode { get; set; } = string.Empty; - [JsonProperty("game_msg")] public string GameMessage { get; set; } = string.Empty; + [JsonProperty("game_msg")] public string GameMessage { get; set; } = DEFAULT_GAME_MESSAGE; [JsonProperty("luck_card")] public string LuckCard { get; set; } = string.Empty; [JsonProperty("luck_crit")] public float LuckCrit { get; set; } [JsonProperty("new_card_list")] public string NewCardList { get; set; } = string.Empty; - [JsonProperty("open_day_list")] public string OpenDayList { get; set; } = String.Empty; + [JsonProperty("open_day_list")] public string OpenDayList { get; set; } = string.Empty; [JsonProperty("is_open_day")] public int IsOpenDay { get; set; } [JsonProperty("server_time")] public string ServerTime { get; set; } = string.Empty; diff --git a/TOOHUCardAPI/Models/IMethodBasedRequest.cs b/TOOHUCardAPI/DTO/IMethodBasedRequest.cs similarity index 86% rename from TOOHUCardAPI/Models/IMethodBasedRequest.cs rename to TOOHUCardAPI/DTO/IMethodBasedRequest.cs index 1ec22f5..aecebad 100644 --- a/TOOHUCardAPI/Models/IMethodBasedRequest.cs +++ b/TOOHUCardAPI/DTO/IMethodBasedRequest.cs @@ -1,7 +1,7 @@ using System.Text.Json.Serialization; using Newtonsoft.Json; -namespace TOOHUCardAPI.Models +namespace TOOHUCardAPI.DTO { public interface IMethodBasedRequest { diff --git a/TOOHUCardAPI/Models/PlayerDataRequestObjects.cs b/TOOHUCardAPI/DTO/PlayerDataRequestObjects.cs similarity index 85% rename from TOOHUCardAPI/Models/PlayerDataRequestObjects.cs rename to TOOHUCardAPI/DTO/PlayerDataRequestObjects.cs index 0140308..a4897ff 100644 --- a/TOOHUCardAPI/Models/PlayerDataRequestObjects.cs +++ b/TOOHUCardAPI/DTO/PlayerDataRequestObjects.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace TOOHUCardAPI.Models +namespace TOOHUCardAPI.DTO { public class PlayerDataGetRequestObject { diff --git a/TOOHUCardAPI/Models/PlayerDataResponseObjects.cs b/TOOHUCardAPI/DTO/PlayerDataResponseObjects.cs similarity index 53% rename from TOOHUCardAPI/Models/PlayerDataResponseObjects.cs rename to TOOHUCardAPI/DTO/PlayerDataResponseObjects.cs index 3a85732..eac53ed 100644 --- a/TOOHUCardAPI/Models/PlayerDataResponseObjects.cs +++ b/TOOHUCardAPI/DTO/PlayerDataResponseObjects.cs @@ -1,20 +1,35 @@ using System.Collections.Generic; using System.Linq; +using AutoMapper; using Newtonsoft.Json; +using TOOHUCardAPI.Data.Models; -namespace TOOHUCardAPI.Models +namespace TOOHUCardAPI.DTO { public class PlayerDataGetResponseObject { - public Dictionary bo { get; set; } + [JsonProperty("bo")] + public Dictionary Players { get; set; } - public PlayerDataGetResponseObject(int players) + public PlayerDataGetResponseObject(Dictionary users, IMapper mapper) { - this.bo = new Dictionary(); - foreach (int i in Enumerable.Range(0, players)) - { - bo[i] = new PlayerDataGetResponseObjectPlayer(); - } + this.Players = users.Aggregate(new Dictionary(), + (players, pair) => + { + User user = pair.Value; + players[pair.Key] = new PlayerDataGetResponseObjectPlayer() + { + EndTime = user.EndTime.ToShortDateString(), + KeyTotal = user.KeyTotal, + KeySaveDate = user.KeySaveDate.ToShortDateString(), + LevelList = user.LevelList, + MaxTeamWave = user.MaxTeamWave, + MaxWave = user.MaxWave, + PetLevel = user.PetLevel, + Point = user.Point + }; + return players; + }); } } /** diff --git a/TOOHUCardAPI/Data/AppDbContext.cs b/TOOHUCardAPI/Data/AppDbContext.cs new file mode 100644 index 0000000..fe617e8 --- /dev/null +++ b/TOOHUCardAPI/Data/AppDbContext.cs @@ -0,0 +1,19 @@ +using Microsoft.EntityFrameworkCore; +using TOOHUCardAPI.Data.Models; + +namespace TOOHUCardAPI.Data +{ + public class AppDbContext : DbContext + { + public DbSet Users { get; set; } + + public AppDbContext(DbContextOptions options) : base(options) + { + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); + } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/AutomapProfile.cs b/TOOHUCardAPI/Data/AutomapProfile.cs new file mode 100644 index 0000000..33df9e7 --- /dev/null +++ b/TOOHUCardAPI/Data/AutomapProfile.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using TOOHUCardAPI.Data.Models; +using TOOHUCardAPI.DTO; + +namespace TOOHUCardAPI.Data +{ + public class AutomapProfile : Profile + { + public AutomapProfile() + { + CreateMap(); + CreateMap(); + } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/Models/EncodedCardGroup.cs b/TOOHUCardAPI/Data/Models/EncodedCardGroup.cs new file mode 100644 index 0000000..ebe2a43 --- /dev/null +++ b/TOOHUCardAPI/Data/Models/EncodedCardGroup.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace TOOHUCardAPI.Data.Models +{ + public class EncodedCardGroup + { + [Key] + public int Id { get; set; } + public int CardGroupNumber { get; set; } + public string EncodedString { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/Models/User.cs b/TOOHUCardAPI/Data/Models/User.cs new file mode 100644 index 0000000..a850294 --- /dev/null +++ b/TOOHUCardAPI/Data/Models/User.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace TOOHUCardAPI.Data.Models +{ + public class User + { + [Key] + public string SteamId { get; set; } + public int MaxWave { get; set; } + public int MaxTeamWave { get; set; } + public int PetLevel { get; set; } + public DateTime EndTime { get; set; } + public int KeyTotal { get; set; } + public DateTime KeySaveDate { get; set; } + public bool Vip { get; set; } + public int Point { get; set; } + public string LevelList { get; set; } + public List EncodedCardGroups { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/Repositories/UserRepository.cs b/TOOHUCardAPI/Data/Repositories/UserRepository.cs new file mode 100644 index 0000000..b8c77b2 --- /dev/null +++ b/TOOHUCardAPI/Data/Repositories/UserRepository.cs @@ -0,0 +1,58 @@ +using System; +using System.Linq; +using AutoMapper; +using TOOHUCardAPI.Data.Models; + +namespace TOOHUCardAPI.Data.Repositories +{ + public class UserRepository + { + private readonly AppDbContext _appDbContext; + private readonly IMapper _mapper; + + public UserRepository(AppDbContext appDbContext, IMapper mapper) + { + _appDbContext = appDbContext; + _mapper = mapper; + } + + public User GetUser(string steamId) + { + return _appDbContext.Users.Where((user => user.SteamId.Equals(steamId))).FirstOrDefault(); + } + + public User CreateUser(string steamId) + { + User user = new User() + { + SteamId = steamId, + Vip = true, + EndTime = DateTime.MaxValue, + LevelList = string.Empty, + PetLevel = 1 + }; + _appDbContext.Users.Add(user); + _appDbContext.SaveChanges(); + return user; + } + + public User UpdateUser(User user) + { + var trackedUser = _appDbContext.Users.FirstOrDefault(u => u.SteamId == user.SteamId); + if (trackedUser == default) + { + return trackedUser; + } + + _appDbContext.Update(user); + _appDbContext.SaveChanges(); + return user; + } + + public User GetOrCreateUser(string steamId) + { + User user = GetUser(steamId) ?? CreateUser(steamId); + return user; + } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Migrations/20211028202203_initial.Designer.cs b/TOOHUCardAPI/Migrations/20211028202203_initial.Designer.cs new file mode 100644 index 0000000..6c69f3b --- /dev/null +++ b/TOOHUCardAPI/Migrations/20211028202203_initial.Designer.cs @@ -0,0 +1,91 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TOOHUCardAPI.Data; + +namespace TOOHUCardAPI.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20211028202203_initial")] + partial class initial + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.11"); + + modelBuilder.Entity("TOOHUCardAPI.Data.Models.EncodedCardGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("EncodedString") + .HasColumnType("TEXT"); + + b.Property("UserSteamId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserSteamId"); + + b.ToTable("EncodedCardGroup"); + }); + + modelBuilder.Entity("TOOHUCardAPI.Data.Models.User", b => + { + b.Property("SteamId") + .HasColumnType("TEXT"); + + b.Property("EndTime") + .HasColumnType("TEXT"); + + b.Property("KeySaveDate") + .HasColumnType("TEXT"); + + b.Property("KeyTotal") + .HasColumnType("INTEGER"); + + b.Property("LevelList") + .HasColumnType("TEXT"); + + b.Property("MaxTeamWave") + .HasColumnType("INTEGER"); + + b.Property("MaxWave") + .HasColumnType("INTEGER"); + + b.Property("PetLevel") + .HasColumnType("INTEGER"); + + b.Property("Point") + .HasColumnType("INTEGER"); + + b.Property("Vip") + .HasColumnType("INTEGER"); + + b.HasKey("SteamId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TOOHUCardAPI.Data.Models.EncodedCardGroup", b => + { + b.HasOne("TOOHUCardAPI.Data.Models.User", null) + .WithMany("EncodedCardGroups") + .HasForeignKey("UserSteamId"); + }); + + modelBuilder.Entity("TOOHUCardAPI.Data.Models.User", b => + { + b.Navigation("EncodedCardGroups"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TOOHUCardAPI/Migrations/20211028202203_initial.cs b/TOOHUCardAPI/Migrations/20211028202203_initial.cs new file mode 100644 index 0000000..cb81b7e --- /dev/null +++ b/TOOHUCardAPI/Migrations/20211028202203_initial.cs @@ -0,0 +1,65 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace TOOHUCardAPI.Migrations +{ + public partial class initial : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + SteamId = table.Column(type: "TEXT", nullable: false), + MaxWave = table.Column(type: "INTEGER", nullable: false), + MaxTeamWave = table.Column(type: "INTEGER", nullable: false), + PetLevel = table.Column(type: "INTEGER", nullable: false), + EndTime = table.Column(type: "TEXT", nullable: false), + KeyTotal = table.Column(type: "INTEGER", nullable: false), + KeySaveDate = table.Column(type: "TEXT", nullable: false), + Vip = table.Column(type: "INTEGER", nullable: false), + Point = table.Column(type: "INTEGER", nullable: false), + LevelList = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.SteamId); + }); + + migrationBuilder.CreateTable( + name: "EncodedCardGroup", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + EncodedString = table.Column(type: "TEXT", nullable: true), + UserSteamId = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_EncodedCardGroup", x => x.Id); + table.ForeignKey( + name: "FK_EncodedCardGroup_Users_UserSteamId", + column: x => x.UserSteamId, + principalTable: "Users", + principalColumn: "SteamId", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_EncodedCardGroup_UserSteamId", + table: "EncodedCardGroup", + column: "UserSteamId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "EncodedCardGroup"); + + migrationBuilder.DropTable( + name: "Users"); + } + } +} diff --git a/TOOHUCardAPI/Migrations/AppDbContextModelSnapshot.cs b/TOOHUCardAPI/Migrations/AppDbContextModelSnapshot.cs new file mode 100644 index 0000000..e91366b --- /dev/null +++ b/TOOHUCardAPI/Migrations/AppDbContextModelSnapshot.cs @@ -0,0 +1,89 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TOOHUCardAPI.Data; + +namespace TOOHUCardAPI.Migrations +{ + [DbContext(typeof(AppDbContext))] + partial class AppDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.11"); + + modelBuilder.Entity("TOOHUCardAPI.Data.Models.EncodedCardGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("EncodedString") + .HasColumnType("TEXT"); + + b.Property("UserSteamId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("UserSteamId"); + + b.ToTable("EncodedCardGroup"); + }); + + modelBuilder.Entity("TOOHUCardAPI.Data.Models.User", b => + { + b.Property("SteamId") + .HasColumnType("TEXT"); + + b.Property("EndTime") + .HasColumnType("TEXT"); + + b.Property("KeySaveDate") + .HasColumnType("TEXT"); + + b.Property("KeyTotal") + .HasColumnType("INTEGER"); + + b.Property("LevelList") + .HasColumnType("TEXT"); + + b.Property("MaxTeamWave") + .HasColumnType("INTEGER"); + + b.Property("MaxWave") + .HasColumnType("INTEGER"); + + b.Property("PetLevel") + .HasColumnType("INTEGER"); + + b.Property("Point") + .HasColumnType("INTEGER"); + + b.Property("Vip") + .HasColumnType("INTEGER"); + + b.HasKey("SteamId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TOOHUCardAPI.Data.Models.EncodedCardGroup", b => + { + b.HasOne("TOOHUCardAPI.Data.Models.User", null) + .WithMany("EncodedCardGroups") + .HasForeignKey("UserSteamId"); + }); + + modelBuilder.Entity("TOOHUCardAPI.Data.Models.User", b => + { + b.Navigation("EncodedCardGroups"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TOOHUCardAPI/Startup.cs b/TOOHUCardAPI/Startup.cs index 34a64c7..3ffb706 100644 --- a/TOOHUCardAPI/Startup.cs +++ b/TOOHUCardAPI/Startup.cs @@ -6,11 +6,14 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; +using TOOHUCardAPI.Data; +using TOOHUCardAPI.Data.Repositories; namespace TOOHUCardAPI { @@ -27,6 +30,12 @@ namespace TOOHUCardAPI public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddNewtonsoftJson(); + services.AddDbContext(opt => + { + opt.UseSqlite(Configuration.GetConnectionString("Sqlite")); + }); + services.AddScoped(); + services.AddAutoMapper(typeof(AutomapProfile)); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo {Title = "TOOHUCardAPI", Version = "v1"}); diff --git a/TOOHUCardAPI/TOOHUCardAPI.csproj b/TOOHUCardAPI/TOOHUCardAPI.csproj index d0246d9..4f5e4af 100644 --- a/TOOHUCardAPI/TOOHUCardAPI.csproj +++ b/TOOHUCardAPI/TOOHUCardAPI.csproj @@ -6,9 +6,20 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + diff --git a/TOOHUCardAPI/appsettings.json b/TOOHUCardAPI/appsettings.json index d9d9a9b..e098544 100644 --- a/TOOHUCardAPI/appsettings.json +++ b/TOOHUCardAPI/appsettings.json @@ -1,4 +1,7 @@ { + "ConnectionStrings": { + "Sqlite": "Data Source=test.db" + }, "Logging": { "LogLevel": { "Default": "Information", diff --git a/TOOHUCardAPI/test.db b/TOOHUCardAPI/test.db new file mode 100644 index 0000000..c3af0d8 Binary files /dev/null and b/TOOHUCardAPI/test.db differ diff --git a/TOOHUCardAPI/test.db-shm b/TOOHUCardAPI/test.db-shm new file mode 100644 index 0000000..c88bd57 Binary files /dev/null and b/TOOHUCardAPI/test.db-shm differ diff --git a/TOOHUCardAPI/test.db-wal b/TOOHUCardAPI/test.db-wal new file mode 100644 index 0000000..dbd2595 Binary files /dev/null and b/TOOHUCardAPI/test.db-wal differ