From 9cf11e982f623fd15f05638d3c0cbebd277b4b04 Mon Sep 17 00:00:00 2001 From: littlefoot Date: Sat, 30 Oct 2021 11:20:36 -0400 Subject: [PATCH] Lots of additions and changes --- .../Controllers/MethodBasedController.cs | 4 +- .../Controllers/PlayerBaseDataController.cs | 29 ++++- .../Controllers/PlayerDataController.cs | 80 +++++++++++--- .../DTO/AbstractPlayerTargetedRequest.cs | 7 ++ TOOHUCardAPI/DTO/AbstractResponse.cs | 13 +++ TOOHUCardAPI/DTO/PlayerBaseDataResponse.cs | 17 +++ .../PlayerDataBuyMagicKeyRequest.cs | 8 ++ .../PlayerDataBuyMagicKeyResponse.cs | 10 ++ .../PlayerData/PlayerDataFirstWinRequest.cs | 7 ++ .../PlayerData/PlayerDataFirstWinResponse.cs | 10 ++ .../DTO/PlayerData/PlayerDataGetRequest.cs | 9 ++ .../PlayerDataGetResponseObject.cs} | 21 +++- .../PlayerDataSaveCardGroupRequest.cs | 13 +++ .../PlayerDataSaveCardGroupResponse.cs | 7 ++ .../PlayerDataSaveKeyCountRequest.cs | 11 ++ TOOHUCardAPI/DTO/PlayerDataRequestObjects.cs | 20 ---- TOOHUCardAPI/Data/AppDbContext.cs | 7 ++ TOOHUCardAPI/Data/AppSettings.cs | 33 ++++++ TOOHUCardAPI/Data/AutomapProfile.cs | 3 + TOOHUCardAPI/Data/Enums/Rarity.cs | 10 ++ TOOHUCardAPI/Data/Exceptions.cs | 25 +++++ TOOHUCardAPI/Data/Models/Card.cs | 15 +++ TOOHUCardAPI/Data/Models/User.cs | 2 + TOOHUCardAPI/Data/Services/StoreService.cs | 87 +++++++++++++++ .../20211030045834_more columns.Designer.cs | 103 ++++++++++++++++++ .../Migrations/20211030045834_more columns.cs | 36 ++++++ .../Migrations/AppDbContextModelSnapshot.cs | 6 + TOOHUCardAPI/Startup.cs | 3 + TOOHUCardAPI/appsettings.json | 7 +- 29 files changed, 557 insertions(+), 46 deletions(-) create mode 100644 TOOHUCardAPI/DTO/AbstractPlayerTargetedRequest.cs create mode 100644 TOOHUCardAPI/DTO/PlayerBaseDataResponse.cs create mode 100644 TOOHUCardAPI/DTO/PlayerData/PlayerDataBuyMagicKeyRequest.cs create mode 100644 TOOHUCardAPI/DTO/PlayerData/PlayerDataBuyMagicKeyResponse.cs create mode 100644 TOOHUCardAPI/DTO/PlayerData/PlayerDataFirstWinRequest.cs create mode 100644 TOOHUCardAPI/DTO/PlayerData/PlayerDataFirstWinResponse.cs create mode 100644 TOOHUCardAPI/DTO/PlayerData/PlayerDataGetRequest.cs rename TOOHUCardAPI/DTO/{PlayerDataResponseObjects.cs => PlayerData/PlayerDataGetResponseObject.cs} (64%) create mode 100644 TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveCardGroupRequest.cs create mode 100644 TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveCardGroupResponse.cs create mode 100644 TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveKeyCountRequest.cs delete mode 100644 TOOHUCardAPI/DTO/PlayerDataRequestObjects.cs create mode 100644 TOOHUCardAPI/Data/AppSettings.cs create mode 100644 TOOHUCardAPI/Data/Enums/Rarity.cs create mode 100644 TOOHUCardAPI/Data/Exceptions.cs create mode 100644 TOOHUCardAPI/Data/Models/Card.cs create mode 100644 TOOHUCardAPI/Data/Services/StoreService.cs create mode 100644 TOOHUCardAPI/Migrations/20211030045834_more columns.Designer.cs create mode 100644 TOOHUCardAPI/Migrations/20211030045834_more columns.cs diff --git a/TOOHUCardAPI/Controllers/MethodBasedController.cs b/TOOHUCardAPI/Controllers/MethodBasedController.cs index 4d53d11..0e8b21d 100644 --- a/TOOHUCardAPI/Controllers/MethodBasedController.cs +++ b/TOOHUCardAPI/Controllers/MethodBasedController.cs @@ -11,10 +11,10 @@ namespace TOOHUCardAPI.Controllers { public class MethodBasedController : ControllerBase { - public delegate Task EndpointHandler(string requestBody); + public delegate Task EndpointHandler(string requestBody); private static Dictionary MethodMapByType = new Dictionary(); - protected Task InvokeEndpointHandlerForMethod(object _this, string method, string body) + protected Task InvokeEndpointHandlerForMethod(object _this, string method, string body) { MethodMap registeredEndpointHandlers = GetMethodMapForType(); if (registeredEndpointHandlers.ContainsKey(method)) diff --git a/TOOHUCardAPI/Controllers/PlayerBaseDataController.cs b/TOOHUCardAPI/Controllers/PlayerBaseDataController.cs index ec55069..f6cbdab 100644 --- a/TOOHUCardAPI/Controllers/PlayerBaseDataController.cs +++ b/TOOHUCardAPI/Controllers/PlayerBaseDataController.cs @@ -2,14 +2,41 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using AutoMapper; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using TOOHUCardAPI.Data.Models; +using TOOHUCardAPI.Data.Repositories; +using TOOHUCardAPI.DTO; namespace TOOHUCardAPI.Controllers { [Route("api/[controller]")] [ApiController] - public class PlayerBaseDataController : ControllerBase + public class PlayerBaseDataController : MethodBasedController { + private readonly ILogger _logger; + private readonly UserRepository _userRepository; + private readonly IMapper _mapper; + + public PlayerBaseDataController(ILogger logger, UserRepository userRepository, IMapper mapper) + { + _logger = logger; + _userRepository = userRepository; + _mapper = mapper; + } + + [HttpGet] + public async Task Get(string id) + { + User user = _userRepository.GetUser(id); + if (user == null) + { + return BadRequest("Invalid user id specified"); + } + + return Ok(_mapper.Map(user)); + } } } \ No newline at end of file diff --git a/TOOHUCardAPI/Controllers/PlayerDataController.cs b/TOOHUCardAPI/Controllers/PlayerDataController.cs index 673697a..6b4de0e 100644 --- a/TOOHUCardAPI/Controllers/PlayerDataController.cs +++ b/TOOHUCardAPI/Controllers/PlayerDataController.cs @@ -16,7 +16,9 @@ using Newtonsoft.Json.Linq; using TOOHUCardAPI.Data; using TOOHUCardAPI.Data.Models; using TOOHUCardAPI.Data.Repositories; +using TOOHUCardAPI.Data.Services; using TOOHUCardAPI.DTO; +using TOOHUCardAPI.DTO.PlayerData; namespace TOOHUCardAPI.Controllers { @@ -27,12 +29,14 @@ namespace TOOHUCardAPI.Controllers private readonly ILogger _logger; private readonly UserRepository _userRepository; private readonly IMapper _mapper; + private readonly StoreService _storeService; - public PlayerDataController(ILogger logger, UserRepository userRepository, IMapper mapper) + public PlayerDataController(ILogger logger, UserRepository userRepository, IMapper mapper, StoreService storeService) { _logger = logger; _userRepository = userRepository; _mapper = mapper; + _storeService = storeService; } /** @@ -41,27 +45,71 @@ namespace TOOHUCardAPI.Controllers * So let's use a single entry point and redirect based on that */ [HttpPost] - public async Task EntryPoint([FromBody] object bodyObj) + public async Task EntryPoint([FromBody] object bodyObj) { string body = JsonConvert.SerializeObject(bodyObj); JObject request = JObject.Parse(body); string method = request["method"].ToString(); - return await InvokeEndpointHandlerForMethod(this, method, body); + try + { + return await InvokeEndpointHandlerForMethod(this, method, body); + } + catch (TooHooException e) + { + return Ok(e.response); + } } - [EndpointHandler("save_card_group")] - private async Task SaveCardGroup(string body) + [EndpointHandler("day_first_win")] + private async Task GiveFirstWin(string body) { - PlayerDataSaveCardGroupRequestObject request = - JsonConvert.DeserializeObject(body); + PlayerDataFirstWinRequest request = JsonConvert.DeserializeObject(body); + var bonusPoints = await _storeService.GiveFirstWinBonus(request.SteamId); + + return Ok(new PlayerDataFirstWinResponse + { + BonusPoints = bonusPoints + }); + } + + [EndpointHandler("save_key_count")] + private async Task SaveKeyCount(string body) + { + PlayerDataSaveKeyCountRequest request = JsonConvert.DeserializeObject(body); User user = _userRepository.GetUser(request.SteamId); if (user == null) { - return new PlayerDataSaveCardGroupResponseObject() - { - Code = "0001", - Message = "Invalid player" - }; + throw new InvalidUserException(); + } + + user.KeyTotal = request.KeyTotal; + user.KeyUseCount = request.KeyUseCount; + _userRepository.UpdateUser(user); + return Ok(new OkResponse()); + } + + [EndpointHandler("buy_key")] + private async Task BuyMagicKey(string body) + { + PlayerDataBuyMagicKeyRequest request = JsonConvert.DeserializeObject(body); + + var totalCost = await _storeService.PurchaseMagicKey(request.Count, request.SteamId); + + return Ok(new PlayerDataBuyMagicKeyResponse + { + TotalCost = totalCost + }); + } + + [EndpointHandler("save_card_group")] + private async Task SaveCardGroup(string body) + { + PlayerDataSaveCardGroupRequest request = + JsonConvert.DeserializeObject(body); + User user = _userRepository.GetUser(request.SteamId); + if (user == null) + { + throw new InvalidUserException(); } EncodedCardGroup group = user.EncodedCardGroups.FirstOrDefault(group => group.GroupKey == request.GroupKey) ?? new EncodedCardGroup() @@ -71,18 +119,18 @@ namespace TOOHUCardAPI.Controllers group.EncodedString = request.GroupData; user.EncodedCardGroups = user.EncodedCardGroups.Where(group2 => group.Id != group2.Id).Append(group).ToList(); _userRepository.UpdateUser(user); - return new PlayerDataSaveCardGroupResponseObject(); + return Ok(new PlayerDataSaveCardGroupResponseObject()); } [EndpointHandler("get")] - private async Task Get(string body) + private async Task Get(string body) { PlayerDataGetRequestObject requestObject = JsonConvert.DeserializeObject(body); IEnumerable users = requestObject.Ids.Values.Select(val => _userRepository.GetOrCreateUser(val)); IEnumerable queriedUserSteamIds = requestObject.Ids.Select(i => i.Value); IEnumerable responsePlayers = users .Where(user => queriedUserSteamIds.Contains(user.SteamId)) - .Select(user => _mapper.Map(user)); + .Select(user => user.ToGetResponse(_mapper)); Dictionary playersStatic = requestObject.Ids .Select(pair => KeyValuePair.Create(pair.Key, responsePlayers.FirstOrDefault(resp => resp.SteamId == pair.Value))) @@ -108,7 +156,7 @@ namespace TOOHUCardAPI.Controllers Players = dynamicResponses }; - return response; + return Ok(response); } } diff --git a/TOOHUCardAPI/DTO/AbstractPlayerTargetedRequest.cs b/TOOHUCardAPI/DTO/AbstractPlayerTargetedRequest.cs new file mode 100644 index 0000000..ddc9b2e --- /dev/null +++ b/TOOHUCardAPI/DTO/AbstractPlayerTargetedRequest.cs @@ -0,0 +1,7 @@ +namespace TOOHUCardAPI.DTO +{ + public abstract class AbstractPlayerTargetedRequest : AbstractRequest + { + public string SteamId { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/AbstractResponse.cs b/TOOHUCardAPI/DTO/AbstractResponse.cs index c1ec837..731fb5a 100644 --- a/TOOHUCardAPI/DTO/AbstractResponse.cs +++ b/TOOHUCardAPI/DTO/AbstractResponse.cs @@ -11,4 +11,17 @@ namespace TOOHUCardAPI.DTO [JsonProperty("msg")] public string Message { get; set; } = string.Empty; } + + public class InvalidUserResponse : AbstractResponse + { + public InvalidUserResponse() + { + Code = "0001"; + Message = "Invalid user"; + } + } + + public class OkResponse : AbstractResponse + { + } } \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerBaseDataResponse.cs b/TOOHUCardAPI/DTO/PlayerBaseDataResponse.cs new file mode 100644 index 0000000..87bcb3d --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerBaseDataResponse.cs @@ -0,0 +1,17 @@ +using Newtonsoft.Json; + +namespace TOOHUCardAPI.DTO +{ + public class PlayerBaseDataResponse: AbstractResponse + { + [JsonProperty("steamid")] + public string SteamId { get; set; } + [JsonProperty("pet_level")] public int PetLevel { get; set; } = 1; + [JsonProperty("end_time")] public string EndTime { get; set; } = string.Empty; + [JsonProperty("key_total")] public int KeyTotal { get; set; } = 100; + [JsonProperty("key_save_date")] public string KeySaveDate { get; set; } = string.Empty; + [JsonProperty("vip")] public int Vip { get; set; } = 1; + [JsonProperty("point")] public int Point { get; set; } = 10000; + [JsonProperty("level_list")] public string LevelList { get; set; } = string.Empty; + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataBuyMagicKeyRequest.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataBuyMagicKeyRequest.cs new file mode 100644 index 0000000..c41f974 --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataBuyMagicKeyRequest.cs @@ -0,0 +1,8 @@ +namespace TOOHUCardAPI.DTO.PlayerData +{ + public class PlayerDataBuyMagicKeyRequest : AbstractPlayerTargetedRequest + { + public string UserId { get; set; } + public int Count { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataBuyMagicKeyResponse.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataBuyMagicKeyResponse.cs new file mode 100644 index 0000000..947afd3 --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataBuyMagicKeyResponse.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace TOOHUCardAPI.DTO.PlayerData +{ + public class PlayerDataBuyMagicKeyResponse : AbstractResponse + { + [JsonProperty("cost_point")] + public int TotalCost { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataFirstWinRequest.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataFirstWinRequest.cs new file mode 100644 index 0000000..a8faccf --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataFirstWinRequest.cs @@ -0,0 +1,7 @@ +namespace TOOHUCardAPI.DTO.PlayerData +{ + public class PlayerDataFirstWinRequest : AbstractPlayerTargetedRequest + { + + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataFirstWinResponse.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataFirstWinResponse.cs new file mode 100644 index 0000000..800c31c --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataFirstWinResponse.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace TOOHUCardAPI.DTO.PlayerData +{ + public class PlayerDataFirstWinResponse : AbstractResponse + { + [JsonProperty("bonus_point")] + public int BonusPoints { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetRequest.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetRequest.cs new file mode 100644 index 0000000..2a6d6bc --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetRequest.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace TOOHUCardAPI.DTO.PlayerData +{ + public class PlayerDataGetRequestObject : AbstractRequest + { + public Dictionary Ids; + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerDataResponseObjects.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetResponseObject.cs similarity index 64% rename from TOOHUCardAPI/DTO/PlayerDataResponseObjects.cs rename to TOOHUCardAPI/DTO/PlayerData/PlayerDataGetResponseObject.cs index 95e2298..05052e5 100644 --- a/TOOHUCardAPI/DTO/PlayerDataResponseObjects.cs +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataGetResponseObject.cs @@ -1,15 +1,16 @@ +using System; using System.Collections.Generic; -using System.Dynamic; using System.Linq; using System.Reflection; using AutoMapper; using Newtonsoft.Json; using TOOHUCardAPI.Data.Models; -namespace TOOHUCardAPI.DTO +namespace TOOHUCardAPI.DTO.PlayerData { - public class PlayerDataGetResponseObject + public class PlayerDataGetResponseObject: AbstractResponse { + // Instead of using a defined object, use a dictionary so we can add the necessary cardgroup items. I dont want to make 20 of them in the class [JsonProperty("bo")] public Dictionary> Players { get; set; } @@ -31,6 +32,8 @@ namespace TOOHUCardAPI.DTO [JsonProperty("vip")] public int Vip { get; set; } = 1; [JsonProperty("point")] public int Point { get; set; } = 10000; [JsonProperty("level_list")] public string LevelList { get; set; } = string.Empty; + [JsonProperty("is_first_win")]public int IsFirstWin { get; set; } + [JsonProperty("key_use_count")] public int KeyUseCount { get; set; } public Dictionary ToDynamicProperties() { @@ -38,9 +41,15 @@ namespace TOOHUCardAPI.DTO .ToDictionary(prop => prop.Name, prop => prop.GetValue(this)); } } - - public class PlayerDataSaveCardGroupResponseObject : AbstractResponse + + public static class PlayerDataGetResponseExtensions { - + public static PlayerDataGetResponseObjectPlayer ToGetResponse(this User user, IMapper mapper) + { + PlayerDataGetResponseObjectPlayer responseObject = mapper.Map(user); + responseObject.IsFirstWin = user.LastFirstWin.AddDays(1) < DateTime.Now ? 1 : 0; + + return responseObject; + } } } \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveCardGroupRequest.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveCardGroupRequest.cs new file mode 100644 index 0000000..730b6a2 --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveCardGroupRequest.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; + +namespace TOOHUCardAPI.DTO.PlayerData +{ + public class PlayerDataSaveCardGroupRequest: AbstractPlayerTargetedRequest + { + public string UserId { get; set; } + [JsonProperty("group_key")] + public string GroupKey { get; set; } + [JsonProperty("group_data")] + public string GroupData { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveCardGroupResponse.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveCardGroupResponse.cs new file mode 100644 index 0000000..f637564 --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveCardGroupResponse.cs @@ -0,0 +1,7 @@ +namespace TOOHUCardAPI.DTO.PlayerData +{ + public class PlayerDataSaveCardGroupResponseObject : AbstractResponse + { + + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveKeyCountRequest.cs b/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveKeyCountRequest.cs new file mode 100644 index 0000000..0508c02 --- /dev/null +++ b/TOOHUCardAPI/DTO/PlayerData/PlayerDataSaveKeyCountRequest.cs @@ -0,0 +1,11 @@ +using Newtonsoft.Json; + +namespace TOOHUCardAPI.DTO.PlayerData +{ + public class PlayerDataSaveKeyCountRequest: AbstractPlayerTargetedRequest + { + public string UserId { get; set; } + [JsonProperty("key_total")]public int KeyTotal { get; set; } + [JsonProperty("key_use_count")]public int KeyUseCount { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/DTO/PlayerDataRequestObjects.cs b/TOOHUCardAPI/DTO/PlayerDataRequestObjects.cs deleted file mode 100644 index a0036ac..0000000 --- a/TOOHUCardAPI/DTO/PlayerDataRequestObjects.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace TOOHUCardAPI.DTO -{ - public class PlayerDataGetRequestObject : AbstractRequest - { - public Dictionary Ids; - } - - public class PlayerDataSaveCardGroupRequestObject: AbstractRequest - { - public string SteamId { get; set; } - public string UserId { get; set; } - [JsonProperty("group_key")] - public string GroupKey { get; set; } - [JsonProperty("group_data")] - public string GroupData { get; set; } - } -} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/AppDbContext.cs b/TOOHUCardAPI/Data/AppDbContext.cs index fe617e8..9912070 100644 --- a/TOOHUCardAPI/Data/AppDbContext.cs +++ b/TOOHUCardAPI/Data/AppDbContext.cs @@ -6,11 +6,18 @@ namespace TOOHUCardAPI.Data public class AppDbContext : DbContext { public DbSet Users { get; set; } + public DbSet Cards { get; set; } public AppDbContext(DbContextOptions options) : base(options) { } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); diff --git a/TOOHUCardAPI/Data/AppSettings.cs b/TOOHUCardAPI/Data/AppSettings.cs new file mode 100644 index 0000000..684f9e9 --- /dev/null +++ b/TOOHUCardAPI/Data/AppSettings.cs @@ -0,0 +1,33 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace TOOHUCardAPI.Data +{ + public static class AppSettings + { + public static int PointsPerLevel { get; set; } + public static int PointsPerLevelNormal { get; set; } + public static int FirstWinBonusPoints { get; set; } + public static int PointsPerKey { get; set; } + public static int MaxKeyPurchaseAmount { get; set; } + public static void Init(IConfiguration configuration) + { + var fields = typeof(AppSettings).GetProperties(); + foreach (var propertyInfo in fields) + { + if (propertyInfo.PropertyType == typeof(string)) + { + propertyInfo.SetValue(null, configuration.GetValue(propertyInfo.Name)); + } + else if (propertyInfo.PropertyType == typeof(int)) + { + propertyInfo.SetValue(null, configuration.GetValue(propertyInfo.Name)); + } + else if (propertyInfo.PropertyType == typeof(double)) + { + propertyInfo.SetValue(null, configuration.GetValue(propertyInfo.Name)); + } + } + } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/AutomapProfile.cs b/TOOHUCardAPI/Data/AutomapProfile.cs index 08fb721..8eaa5f3 100644 --- a/TOOHUCardAPI/Data/AutomapProfile.cs +++ b/TOOHUCardAPI/Data/AutomapProfile.cs @@ -1,6 +1,7 @@ using AutoMapper; using TOOHUCardAPI.Data.Models; using TOOHUCardAPI.DTO; +using TOOHUCardAPI.DTO.PlayerData; namespace TOOHUCardAPI.Data { @@ -9,6 +10,8 @@ namespace TOOHUCardAPI.Data public AutomapProfile() { CreateMap(); + CreateMap(); + } } } \ No newline at end of file diff --git a/TOOHUCardAPI/Data/Enums/Rarity.cs b/TOOHUCardAPI/Data/Enums/Rarity.cs new file mode 100644 index 0000000..194cbed --- /dev/null +++ b/TOOHUCardAPI/Data/Enums/Rarity.cs @@ -0,0 +1,10 @@ +namespace TOOHUCardAPI.Data.Enums +{ + public enum Rarity + { + NORMAL = 1, + RARE = 2, + SUPER_RARE = 3, + SUPER_SECRET_RARE = 4 + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/Exceptions.cs b/TOOHUCardAPI/Data/Exceptions.cs new file mode 100644 index 0000000..6c51449 --- /dev/null +++ b/TOOHUCardAPI/Data/Exceptions.cs @@ -0,0 +1,25 @@ +using System; +using TOOHUCardAPI.Data.Services; +using TOOHUCardAPI.DTO; + +namespace TOOHUCardAPI.Data +{ + public abstract class TooHooException : Exception + { + public abstract AbstractResponse response { get; } + } + public class InvalidUserException : TooHooException + { + public override AbstractResponse response => new InvalidUserResponse(); + } + + public class InsufficientPointsException : TooHooException + { + public override AbstractResponse response => new InsufficientPointsResponse(); + } + + public class NotFirstWinException : TooHooException + { + public override AbstractResponse response => new NotFirstWinResponse(); + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/Models/Card.cs b/TOOHUCardAPI/Data/Models/Card.cs new file mode 100644 index 0000000..125e026 --- /dev/null +++ b/TOOHUCardAPI/Data/Models/Card.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; +using TOOHUCardAPI.Data.Enums; + +namespace TOOHUCardAPI.Data.Models +{ + public class Card + { + [Key] + public string ItemCode { get; set; } + public string CardName { get; set; } + public Rarity Rarity { get; set; } + public bool HasVoice { get; set; } + public bool HasPortrait { get; set; } + } +} \ No newline at end of file diff --git a/TOOHUCardAPI/Data/Models/User.cs b/TOOHUCardAPI/Data/Models/User.cs index 031eaf8..8d51ea3 100644 --- a/TOOHUCardAPI/Data/Models/User.cs +++ b/TOOHUCardAPI/Data/Models/User.cs @@ -13,10 +13,12 @@ namespace TOOHUCardAPI.Data.Models public int PetLevel { get; set; } public DateTime EndTime { get; set; } public int KeyTotal { get; set; } + public int KeyUseCount { get; set; } public DateTime KeySaveDate { get; set; } public bool Vip { get; set; } public bool Ban { get; set; } public int Point { get; set; } + public DateTime LastFirstWin { get; set; } public string LevelList { get; set; } public List EncodedCardGroups { get; set; } } diff --git a/TOOHUCardAPI/Data/Services/StoreService.cs b/TOOHUCardAPI/Data/Services/StoreService.cs new file mode 100644 index 0000000..ffb798c --- /dev/null +++ b/TOOHUCardAPI/Data/Services/StoreService.cs @@ -0,0 +1,87 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using TOOHUCardAPI.Data.Models; +using TOOHUCardAPI.Data.Repositories; +using TOOHUCardAPI.DTO; + +namespace TOOHUCardAPI.Data.Services +{ + public class StoreService + { + private readonly ILogger _logger; + private readonly UserRepository _userRepository; + + public StoreService(ILogger logger, UserRepository userRepository) + { + _logger = logger; + _userRepository = userRepository; + } + + private void AddPoints(int points, User user) + { + user.Point = Math.Max(0, user.Point + points); + _userRepository.UpdateUser(user); + _logger.LogInformation($"User with steamid {user.SteamId} was given {points} points. New total: {user.Point}"); + } + + public async Task PurchaseMagicKey(int amt, string steamId) + { + int totalCost = AppSettings.PointsPerKey * amt; + amt = Math.Clamp(amt, 0, AppSettings.MaxKeyPurchaseAmount); + User user = _userRepository.GetUser(steamId); + if (user == null) + { + throw new InvalidUserException(); + } + if (user.Point < totalCost) + { + throw new InsufficientPointsException(); + } + + AddPoints(-totalCost, user); + user.KeyTotal += amt; + _userRepository.UpdateUser(user); + _logger.LogInformation($"User with steamid {user.SteamId} purchased {amt} keys for {totalCost} points. New point value is {user.Point}"); + return totalCost; + } + + public async Task GiveFirstWinBonus(string steamId) + { + User user = _userRepository.GetUser(steamId); + if (user == null) + { + throw new InvalidUserException(); + } + + if (user.LastFirstWin.AddDays(1) > DateTime.Now) + { + throw new NotFirstWinException(); + } + AddPoints(AppSettings.FirstWinBonusPoints, user); + user.LastFirstWin = DateTime.Now; + _userRepository.UpdateUser(user); + _logger.LogInformation($"User with steamid {user.SteamId} received first win of the day bonus, earning {AppSettings.FirstWinBonusPoints} points. New value: {user.Point}"); + return AppSettings.FirstWinBonusPoints; + } + } + + public class InsufficientPointsResponse : AbstractResponse + { + public InsufficientPointsResponse() + { + Code = "0002"; + Message = "Insufficient points"; + } + } + + public class NotFirstWinResponse : AbstractResponse + { + public NotFirstWinResponse() + { + Code = "0003"; + Message = "Not first win of the day"; + } + } + +} \ No newline at end of file diff --git a/TOOHUCardAPI/Migrations/20211030045834_more columns.Designer.cs b/TOOHUCardAPI/Migrations/20211030045834_more columns.Designer.cs new file mode 100644 index 0000000..d3ea945 --- /dev/null +++ b/TOOHUCardAPI/Migrations/20211030045834_more columns.Designer.cs @@ -0,0 +1,103 @@ +// +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("20211030045834_more columns")] + partial class morecolumns + { + 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("GroupKey") + .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("Ban") + .HasColumnType("INTEGER"); + + b.Property("EndTime") + .HasColumnType("TEXT"); + + b.Property("KeySaveDate") + .HasColumnType("TEXT"); + + b.Property("KeyTotal") + .HasColumnType("INTEGER"); + + b.Property("KeyUseCount") + .HasColumnType("INTEGER"); + + b.Property("LastFirstWin") + .HasColumnType("TEXT"); + + 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/20211030045834_more columns.cs b/TOOHUCardAPI/Migrations/20211030045834_more columns.cs new file mode 100644 index 0000000..95b908e --- /dev/null +++ b/TOOHUCardAPI/Migrations/20211030045834_more columns.cs @@ -0,0 +1,36 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace TOOHUCardAPI.Migrations +{ + public partial class morecolumns : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "KeyUseCount", + table: "Users", + type: "INTEGER", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "LastFirstWin", + table: "Users", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "KeyUseCount", + table: "Users"); + + migrationBuilder.DropColumn( + name: "LastFirstWin", + table: "Users"); + } + } +} diff --git a/TOOHUCardAPI/Migrations/AppDbContextModelSnapshot.cs b/TOOHUCardAPI/Migrations/AppDbContextModelSnapshot.cs index 11cc204..1dd395b 100644 --- a/TOOHUCardAPI/Migrations/AppDbContextModelSnapshot.cs +++ b/TOOHUCardAPI/Migrations/AppDbContextModelSnapshot.cs @@ -55,6 +55,12 @@ namespace TOOHUCardAPI.Migrations b.Property("KeyTotal") .HasColumnType("INTEGER"); + b.Property("KeyUseCount") + .HasColumnType("INTEGER"); + + b.Property("LastFirstWin") + .HasColumnType("TEXT"); + b.Property("LevelList") .HasColumnType("TEXT"); diff --git a/TOOHUCardAPI/Startup.cs b/TOOHUCardAPI/Startup.cs index 3ffb706..2986605 100644 --- a/TOOHUCardAPI/Startup.cs +++ b/TOOHUCardAPI/Startup.cs @@ -14,6 +14,7 @@ using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; using TOOHUCardAPI.Data; using TOOHUCardAPI.Data.Repositories; +using TOOHUCardAPI.Data.Services; namespace TOOHUCardAPI { @@ -22,6 +23,7 @@ namespace TOOHUCardAPI public Startup(IConfiguration configuration) { Configuration = configuration; + AppSettings.Init(configuration); } public IConfiguration Configuration { get; } @@ -35,6 +37,7 @@ namespace TOOHUCardAPI opt.UseSqlite(Configuration.GetConnectionString("Sqlite")); }); services.AddScoped(); + services.AddScoped(); services.AddAutoMapper(typeof(AutomapProfile)); services.AddSwaggerGen(c => { diff --git a/TOOHUCardAPI/appsettings.json b/TOOHUCardAPI/appsettings.json index e098544..0d492c3 100644 --- a/TOOHUCardAPI/appsettings.json +++ b/TOOHUCardAPI/appsettings.json @@ -9,5 +9,10 @@ "Microsoft.Hosting.Lifetime": "Information" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "PointsPerLevel": "10", + "PointsPerLevelNormal": "5", + "PointsPerKey": "2", + "FirstWinBonusPoints": "2", + "MaxKeyPurchaseAmount": "200" }