From 41e894cd42d19fa7a96d9d4353ec0e37fc85002e Mon Sep 17 00:00:00 2001 From: morbalint Date: Wed, 14 Feb 2024 17:34:20 +0100 Subject: [PATCH] feat: 2e save character initial implementation WIP 2e is hidden behind url navigation hiding, so hoping that nobody found it yet. Note: DB migration make this commit a bit risky! --- .../Controllers/Character1EController.cs | 90 +++ .../Controllers/Character2EController.cs | 43 ++ Kemkas.Web/Controllers/CharacterController.cs | 80 +- .../Controllers/WeatherForecastController.cs | 35 - Kemkas.Web/Db/ApplicationDbContext.cs | 11 + Kemkas.Web/Db/Enums/Faj.cs | 21 +- Kemkas.Web/Db/Enums/FajExtensions.cs | 92 ++- Kemkas.Web/Db/Enums/Kepzettseg.cs | 38 +- Kemkas.Web/Db/Enums/KepzettsegExtensions.cs | 194 +++-- Kemkas.Web/Db/Enums/Osztaly.cs | 19 +- Kemkas.Web/Db/Enums/OsztalyExtensions.cs | 80 +- ...4163223_AddSecondEditionModels.Designer.cs | 690 ++++++++++++++++++ .../20240214163223_AddSecondEditionModels.cs | 148 ++++ .../ApplicationDbContextModelSnapshot.cs | 195 +++++ Kemkas.Web/Db/Models/V1Karakter.cs | 7 +- Kemkas.Web/Db/Models/V1KarakterKepzettseg.cs | 2 +- Kemkas.Web/Db/Models/V1Szintlepes.cs | 2 + Kemkas.Web/Db/Models/V2Felszereles.cs | 17 + Kemkas.Web/Db/Models/V2Karakter.cs | 44 ++ Kemkas.Web/Db/Models/V2KarakterKepzettseg.cs | 17 + Kemkas.Web/Db/Models/V2Szintlepes.cs | 29 + Kemkas.Web/Kemkas.Web.csproj | 4 + Kemkas.Web/Program.cs | 8 +- .../Character/CharacterPersistenceService.cs | 88 --- .../Character1EDtoToDbModelService.cs} | 46 +- .../Character/CharacterDbModelToDtoService.cs | 12 +- .../Character/CharacterServices.cs | 5 +- .../Character/CharacterValidationService.cs | 6 +- .../Character2EDtoToDbModelService.cs | 82 +++ .../Shared/CharacterPersistenceService.cs | 147 ++++ .../{CharacterDto.cs => Character1eDto.cs} | 2 +- Kemkas.Web/ViewModels/Character2eDto.cs | 46 ++ .../ViewModels/KarakterFelszerelesDto.cs | 3 + .../ViewModels/KarakterTulajdonsagokDto.cs | 3 + Kemkas.Web/ViewModels/Szintlepes.cs | 24 + Kemkas.Web/ViewModels/WeatherForecast.cs | 12 - Kemkas.Web/frontend/src/App.tsx | 4 +- .../src/first-edition/api/character.api.ts | 4 +- .../pages/CreateCharacter2E.tsx | 2 +- 39 files changed, 1987 insertions(+), 365 deletions(-) create mode 100644 Kemkas.Web/Controllers/Character1EController.cs create mode 100644 Kemkas.Web/Controllers/Character2EController.cs delete mode 100644 Kemkas.Web/Controllers/WeatherForecastController.cs create mode 100644 Kemkas.Web/Db/Migrations/20240214163223_AddSecondEditionModels.Designer.cs create mode 100644 Kemkas.Web/Db/Migrations/20240214163223_AddSecondEditionModels.cs create mode 100644 Kemkas.Web/Db/Models/V2Felszereles.cs create mode 100644 Kemkas.Web/Db/Models/V2Karakter.cs create mode 100644 Kemkas.Web/Db/Models/V2KarakterKepzettseg.cs create mode 100644 Kemkas.Web/Db/Models/V2Szintlepes.cs delete mode 100644 Kemkas.Web/Services/Character/CharacterPersistenceService.cs rename Kemkas.Web/Services/{Character/CharacterDtoToDbModelService.cs => FirstEdition/Character/Character1EDtoToDbModelService.cs} (78%) rename Kemkas.Web/Services/{ => FirstEdition}/Character/CharacterDbModelToDtoService.cs (74%) rename Kemkas.Web/Services/{ => FirstEdition}/Character/CharacterServices.cs (76%) rename Kemkas.Web/Services/{ => FirstEdition}/Character/CharacterValidationService.cs (59%) create mode 100644 Kemkas.Web/Services/SecondEdition/Character/Character2EDtoToDbModelService.cs create mode 100644 Kemkas.Web/Services/Shared/CharacterPersistenceService.cs rename Kemkas.Web/ViewModels/{CharacterDto.cs => Character1eDto.cs} (98%) create mode 100644 Kemkas.Web/ViewModels/Character2eDto.cs create mode 100644 Kemkas.Web/ViewModels/Szintlepes.cs delete mode 100644 Kemkas.Web/ViewModels/WeatherForecast.cs diff --git a/Kemkas.Web/Controllers/Character1EController.cs b/Kemkas.Web/Controllers/Character1EController.cs new file mode 100644 index 0000000..30c0a16 --- /dev/null +++ b/Kemkas.Web/Controllers/Character1EController.cs @@ -0,0 +1,90 @@ +using System.ComponentModel.DataAnnotations; +using Kemkas.Web.Db.Models; +using Kemkas.Web.Services.FirstEdition.Character; +using Kemkas.Web.Services.Shared; +using Kemkas.Web.ViewModels; +using Microsoft.AspNetCore.Mvc; + +namespace Kemkas.Web.Controllers; + +/// +/// First edition character endpoints +/// +/// +/// +/// +/// +[ApiController] +[Route("[controller]")] +public class Character1EController( + ICharacterValidationService validationService, + ICharacter1EDtoToDbModelService dtoToDbModelService, + ICharacterDbModelToDtoService dbModelToDtoService, + ICharacterPersistenceService persistenceService) + : ControllerBase +{ + [HttpPost] + public async Task> StoreNewCharacter([FromBody] Character1eDto dto, [FromQuery]bool isPublic = true) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + var errors = validationService.Validate(dto); + if (errors != null) + { + return BadRequest(errors); + } + + V1Karakter model; + try + { + model = dtoToDbModelService.Convert(dto); + } + catch (ValidationException ex) + { + return BadRequest(ex.Message); + } + var id = await persistenceService.StoreNewCharacter1E(model, isPublic); + return id; + } + + [HttpGet("{id:guid}")] + public async Task> GetCharacterById([FromRoute] Guid id) + { + var entity = await persistenceService.GetCharacter1EById(id); + if (entity is null) + { + return NotFound(); + } + + return dbModelToDtoService.Convert(entity); + } + + [HttpPost("{id:guid}")] + public async Task> UpdateCharacter([FromRoute] Guid id, [FromBody] Character1eDto dto, [FromQuery]bool isPublic = true) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + var errors = validationService.Validate(dto); + if (errors != null) + { + return BadRequest(errors); + } + + var original = await persistenceService.GetCharacter1EById(id, tracking: true); + if (original is null) + { + return NotFound(); + } + + dtoToDbModelService.Update(original, dto); + + await persistenceService.UpdateCharacter1E(original, isPublic); + + return id; + } + +} \ No newline at end of file diff --git a/Kemkas.Web/Controllers/Character2EController.cs b/Kemkas.Web/Controllers/Character2EController.cs new file mode 100644 index 0000000..ea0acaf --- /dev/null +++ b/Kemkas.Web/Controllers/Character2EController.cs @@ -0,0 +1,43 @@ +using System.ComponentModel.DataAnnotations; +using Kemkas.Web.Db.Models; +using Kemkas.Web.Services.SecondEdition.Character; +using Kemkas.Web.Services.Shared; +using Kemkas.Web.ViewModels; +using Microsoft.AspNetCore.Mvc; + +namespace Kemkas.Web.Controllers; + +[ApiController] +[Route("[controller]")] +public class Character2EController( + ICharacter2EDtoToDbModelService dtoToDbModelService, + ICharacterPersistenceService persistenceService + ) : ControllerBase +{ + [HttpPost] + public async Task> StoreNewCharacter([FromBody] Character2eDto dto, [FromQuery]bool isPublic = true) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + // var errors = validationService.Validate(dto); + // if (errors != null) + // { + // return BadRequest(errors); + // } + + V2Karakter model; + try + { + model = dtoToDbModelService.Convert(dto); + } + catch (ValidationException ex) + { + return BadRequest(ex.Message); + } + var id = await persistenceService.StoreNewCharacter2E(model, isPublic); + return id; + } + +} \ No newline at end of file diff --git a/Kemkas.Web/Controllers/CharacterController.cs b/Kemkas.Web/Controllers/CharacterController.cs index 11e230b..02f90d2 100644 --- a/Kemkas.Web/Controllers/CharacterController.cs +++ b/Kemkas.Web/Controllers/CharacterController.cs @@ -1,85 +1,19 @@ -using System.ComponentModel.DataAnnotations; -using Kemkas.Web.Db.Models; -using Kemkas.Web.Services.Character; +using Kemkas.Web.Services.FirstEdition.Character; +using Kemkas.Web.Services.Shared; using Kemkas.Web.ViewModels; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Kemkas.Web.Controllers; +/// +/// Shared first and second edition character endpoints +/// +/// [ApiController] [Route("[controller]")] -public class CharacterController( - ICharacterValidationService validationService, - ICharacterDtoToDbModelService dtoToDbModelService, - ICharacterDbModelToDtoService dbModelToDtoService, - ICharacterPersistenceService persistenceService) - : ControllerBase +public class CharacterController(ICharacterPersistenceService persistenceService) : ControllerBase { - [HttpPost] - public async Task> StoreNewCharacter([FromBody] CharacterDto dto, [FromQuery]bool isPublic = true) - { - if (!ModelState.IsValid) - { - return BadRequest(ModelState); - } - var errors = validationService.Validate(dto); - if (errors != null) - { - return BadRequest(errors); - } - - V1Karakter model; - try - { - model = dtoToDbModelService.Convert(dto); - } - catch (ValidationException ex) - { - return BadRequest(ex.Message); - } - var id = await persistenceService.StoreNewCharacter(model, isPublic); - return id; - } - - [HttpGet("{id:guid}")] - public async Task> GetCharacterById([FromRoute] Guid id) - { - var entity = await persistenceService.GetCharacterById(id); - if (entity is null) - { - return NotFound(); - } - - return dbModelToDtoService.Convert(entity); - } - - [HttpPost("{id:guid}")] - public async Task> UpdateCharacter([FromRoute] Guid id, [FromBody] CharacterDto dto, [FromQuery]bool isPublic = true) - { - if (!ModelState.IsValid) - { - return BadRequest(ModelState); - } - var errors = validationService.Validate(dto); - if (errors != null) - { - return BadRequest(errors); - } - - var original = await persistenceService.GetCharacterById(id, tracking: true); - if (original is null) - { - return NotFound(); - } - - dtoToDbModelService.Update(original, dto); - - await persistenceService.UpdateCharacter(original, isPublic); - - return id; - } - [HttpGet] [Authorize] public async Task> GetAllCharacters() diff --git a/Kemkas.Web/Controllers/WeatherForecastController.cs b/Kemkas.Web/Controllers/WeatherForecastController.cs deleted file mode 100644 index 246c5a1..0000000 --- a/Kemkas.Web/Controllers/WeatherForecastController.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Kemkas.Web.ViewModels; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Kemkas.Web.Controllers; - -[ApiController] -[Route("[controller]")] -public class WeatherForecastController : ControllerBase -{ - private static readonly string[] Summaries = new[] - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; - - private readonly ILogger _logger; - - public WeatherForecastController(ILogger logger) - { - _logger = logger; - } - - [HttpGet] - public IEnumerable Get() - { - return Enumerable.Range(1, 5).Select( - index => new WeatherForecast - { - Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - TemperatureC = Random.Shared.Next(-20, 55), - Summary = Summaries[Random.Shared.Next(Summaries.Length)] - }) - .ToArray(); - } -} diff --git a/Kemkas.Web/Db/ApplicationDbContext.cs b/Kemkas.Web/Db/ApplicationDbContext.cs index 789f779..35b73ca 100644 --- a/Kemkas.Web/Db/ApplicationDbContext.cs +++ b/Kemkas.Web/Db/ApplicationDbContext.cs @@ -13,6 +13,8 @@ public class ApplicationDbContext : IdentityDbContext DataProtectionKeys { get; set; } + // 1st edition character + public DbSet Karakterek { get; set; } public DbSet KarakterKepzettsegek { get; set; } @@ -21,4 +23,13 @@ public class ApplicationDbContext : IdentityDbContext Felszerelesek { get; set; } + // 2nd edition character + + public DbSet Karakterek2E { get; set; } + + public DbSet KarakterKepzettsegek2E { get; set; } + + public DbSet Szintlepesek2E { get; set; } + + public DbSet Felszerelesek2E { get; set; } } diff --git a/Kemkas.Web/Db/Enums/Faj.cs b/Kemkas.Web/Db/Enums/Faj.cs index 49ef477..0868b78 100644 --- a/Kemkas.Web/Db/Enums/Faj.cs +++ b/Kemkas.Web/Db/Enums/Faj.cs @@ -1,6 +1,6 @@ namespace Kemkas.Web.Db.Enums; -public enum Faj +public enum Faj1E { Ember = 0, Amazon = 1, @@ -14,4 +14,21 @@ public enum Faj Felszerzet = 9, Gnom = 10, Torpe = 11, -} \ No newline at end of file +} + +public enum Faj2E +{ + Ember = 0, + Amazon = 1, + Birodalmi = 2, + Nomad = 3, + Eszaki = 4, + Osember = 5, + Elf = 6, + Felelf = 7, + Felork = 8, + Felszerzet = 9, + Gnom = 10, + Torpe = 11, +} + diff --git a/Kemkas.Web/Db/Enums/FajExtensions.cs b/Kemkas.Web/Db/Enums/FajExtensions.cs index 316ceb3..5ee7f86 100644 --- a/Kemkas.Web/Db/Enums/FajExtensions.cs +++ b/Kemkas.Web/Db/Enums/FajExtensions.cs @@ -2,42 +2,82 @@ namespace Kemkas.Web.Db.Enums; public static class FajExtensions { - public static Faj Convert(string faj) + public static Faj1E Convert1E(string faj) { return faj switch { - "f_ember" => Faj.Ember, - "f_amazon" => Faj.Amazon, - "f_birodalmi" => Faj.Birodalmi, - "f_etuniai" => Faj.Etuniai, - "f_eszaki" => Faj.Eszaki, - "f_osember" => Faj.Osember, - "f_elf" => Faj.Elf, - "f_felelf" => Faj.Felelf, - "f_felork" => Faj.Felork, - "f_felszerzet" => Faj.Felszerzet, - "f_gnom" => Faj.Gnom, - "f_torpe" => Faj.Torpe, + "f_ember" => Faj1E.Ember, + "f_amazon" => Faj1E.Amazon, + "f_birodalmi" => Faj1E.Birodalmi, + "f_etuniai" => Faj1E.Etuniai, + "f_eszaki" => Faj1E.Eszaki, + "f_osember" => Faj1E.Osember, + "f_elf" => Faj1E.Elf, + "f_felelf" => Faj1E.Felelf, + "f_felork" => Faj1E.Felork, + "f_felszerzet" => Faj1E.Felszerzet, + "f_gnom" => Faj1E.Gnom, + "f_torpe" => Faj1E.Torpe, + _ => throw new Exception("invalid faj: " + faj) + }; + } + + public static Faj2E Convert2E(string faj) + { + return faj switch + { + "f_2e_ember" => Faj2E.Ember, + "f_2e_amazon" => Faj2E.Amazon, + "f_2e_birodalmi" => Faj2E.Birodalmi, + "f_2e_nomad" => Faj2E.Nomad, + "f_2e_eszaki" => Faj2E.Eszaki, + "f_2e_osember" => Faj2E.Osember, + "f_2e_elf" => Faj2E.Elf, + "f_2e_felelf" => Faj2E.Felelf, + "f_2e_felork" => Faj2E.Felork, + "f_2e_felszerzet" => Faj2E.Felszerzet, + "f_2e_gnom" => Faj2E.Gnom, + "f_2e_torpe" => Faj2E.Torpe, _ => throw new Exception("invalid faj: " + faj) }; } - public static string Convert(this Faj faj) + public static string Convert(this Faj1E faj) { return faj switch { - Faj.Ember => "f_ember", - Faj.Amazon => "f_amazon", - Faj.Birodalmi => "f_birodalmi", - Faj.Etuniai => "f_etuniai", - Faj.Eszaki => "f_eszaki", - Faj.Osember => "f_osember", - Faj.Elf => "f_elf", - Faj.Felelf => "f_felelf", - Faj.Felork => "f_felork", - Faj.Felszerzet => "f_felszerzet", - Faj.Gnom => "f_gnom", - Faj.Torpe => "f_torpe", + Faj1E.Ember => "f_ember", + Faj1E.Amazon => "f_amazon", + Faj1E.Birodalmi => "f_birodalmi", + Faj1E.Etuniai => "f_etuniai", + Faj1E.Eszaki => "f_eszaki", + Faj1E.Osember => "f_osember", + Faj1E.Elf => "f_elf", + Faj1E.Felelf => "f_felelf", + Faj1E.Felork => "f_felork", + Faj1E.Felszerzet => "f_felszerzet", + Faj1E.Gnom => "f_gnom", + Faj1E.Torpe => "f_torpe", + _ => throw new Exception("invalid faj: " + faj) + }; + } + + public static string Convert(this Faj2E faj) + { + return faj switch + { + Faj2E.Ember => "f_2e_ember", + Faj2E.Amazon => "f_2e_amazon", + Faj2E.Birodalmi => "f_2e_birodalmi", + Faj2E.Nomad => "f_2e_nomad", + Faj2E.Eszaki => "f_2e_eszaki", + Faj2E.Osember => "f_2e_osember", + Faj2E.Elf => "f_2e_elf", + Faj2E.Felelf => "f_2e_felelf", + Faj2E.Felork => "f_2e_felork", + Faj2E.Felszerzet => "f_2e_felszerzet", + Faj2E.Gnom => "f_2e_gnom", + Faj2E.Torpe => "f_2e_torpe", _ => throw new Exception("invalid faj: " + faj) }; } diff --git a/Kemkas.Web/Db/Enums/Kepzettseg.cs b/Kemkas.Web/Db/Enums/Kepzettseg.cs index 8246187..f3e6b62 100644 --- a/Kemkas.Web/Db/Enums/Kepzettseg.cs +++ b/Kemkas.Web/Db/Enums/Kepzettseg.cs @@ -1,6 +1,6 @@ namespace Kemkas.Web.Db.Enums; -public enum Kepzettseg +public enum Kepzettseg1E { Alkimia = 1, Alcazas = 2, @@ -31,4 +31,40 @@ public enum Kepzettseg Varazslatismeret = 27, Zarnyitas = 28, Zsebmetszes = 29, +} + +// offset by 200 to make it more different from 1e karakter kepzettsegek +// I don't plan to mix them, but let's make it obvious which one is which. +// But it could be useful in one-time character conversions in the future. +public enum Kepzettseg2E +{ + Alkimia = 201, + Alcazas = 202, + Allatidomitas = 203, + Csapdak = 204, + Csillagjoslas = 205, + Egyensulyozas = 206, + Eloadas = 207, + Ertekbecsles = 208, + Gyogyitas = 209, + Hajozas = 210, + Hallgatozas = 211, + Hamisitas = 212, + JelekOlvasasa = 213, + Herbalizmus = 601, + Historia = 602, + Lovaglas = 215, + Maszas = 216, + Megfigyeles = 217, + Meregkeveres = 218, + Mesterseg = 219, + Nyomkereses = 220, + Okkultizmus = 666, // inside joke + Osonas = 221, + Szabadulomuveszet = 223, + Ugras = 225, + Uszas = 226, + Vadonjaras = 603, + Zarnyitas = 228, + Zsebmetszes = 229, } \ No newline at end of file diff --git a/Kemkas.Web/Db/Enums/KepzettsegExtensions.cs b/Kemkas.Web/Db/Enums/KepzettsegExtensions.cs index d9c9d4d..e29c78b 100644 --- a/Kemkas.Web/Db/Enums/KepzettsegExtensions.cs +++ b/Kemkas.Web/Db/Enums/KepzettsegExtensions.cs @@ -4,76 +4,150 @@ namespace Kemkas.Web.Db.Enums; public static class KepzettsegExtensions { - public static Kepzettseg Convert(string kepzettseg) + public static Kepzettseg1E Convert1E(string kepzettseg) { return kepzettseg switch { - "k_alkimia" => Kepzettseg.Alkimia, - "k_alcazas" => Kepzettseg.Alcazas, - "k_allatidomitas" => Kepzettseg.Allatidomitas, - "k_csapdak" => Kepzettseg.Csapdak, - "k_csillagjoslas" => Kepzettseg.Csillagjoslas, - "k_egyensulyozas" => Kepzettseg.Egyensulyozas, - "k_eloadas" => Kepzettseg.Eloadas, - "k_ertekbecsles" => Kepzettseg.Ertekbecsles, - "k_gyogyitas" => Kepzettseg.Gyogyitas, - "k_hajozas" => Kepzettseg.Hajozas, - "k_hallgatozas" => Kepzettseg.Hallgatozas, - "k_hamisitas" => Kepzettseg.Hamisitas, - "k_jelek_olvasasa" => Kepzettseg.JelekOlvasasa, - "k_koncentracio" => Kepzettseg.Koncentracio, - "k_lovaglas" => Kepzettseg.Lovaglas, - "k_maszas" => Kepzettseg.Maszas, - "k_megfigyeles" => Kepzettseg.Megfigyeles, - "k_meregkeveres" => Kepzettseg.Meregkeveres, - "k_mesterseg" => Kepzettseg.Mesterseg, - "k_nyomkereses" => Kepzettseg.Nyomkereses, - "k_osonas" => Kepzettseg.Osonas, - "k_rejtozes" => Kepzettseg.Rejtozes, - "k_szabadulomuveszet" => Kepzettseg.Szabadulomuveszet, - "k_tudas" => Kepzettseg.Tudas, - "k_ugras" => Kepzettseg.Ugras, - "k_uszas" => Kepzettseg.Uszas, - "k_varazslatismeret" => Kepzettseg.Varazslatismeret, - "k_zarnyitas" => Kepzettseg.Zarnyitas, - "k_zsebmetszes" => Kepzettseg.Zsebmetszes, + "k_alkimia" => Kepzettseg1E.Alkimia, + "k_alcazas" => Kepzettseg1E.Alcazas, + "k_allatidomitas" => Kepzettseg1E.Allatidomitas, + "k_csapdak" => Kepzettseg1E.Csapdak, + "k_csillagjoslas" => Kepzettseg1E.Csillagjoslas, + "k_egyensulyozas" => Kepzettseg1E.Egyensulyozas, + "k_eloadas" => Kepzettseg1E.Eloadas, + "k_ertekbecsles" => Kepzettseg1E.Ertekbecsles, + "k_gyogyitas" => Kepzettseg1E.Gyogyitas, + "k_hajozas" => Kepzettseg1E.Hajozas, + "k_hallgatozas" => Kepzettseg1E.Hallgatozas, + "k_hamisitas" => Kepzettseg1E.Hamisitas, + "k_jelek_olvasasa" => Kepzettseg1E.JelekOlvasasa, + "k_koncentracio" => Kepzettseg1E.Koncentracio, + "k_lovaglas" => Kepzettseg1E.Lovaglas, + "k_maszas" => Kepzettseg1E.Maszas, + "k_megfigyeles" => Kepzettseg1E.Megfigyeles, + "k_meregkeveres" => Kepzettseg1E.Meregkeveres, + "k_mesterseg" => Kepzettseg1E.Mesterseg, + "k_nyomkereses" => Kepzettseg1E.Nyomkereses, + "k_osonas" => Kepzettseg1E.Osonas, + "k_rejtozes" => Kepzettseg1E.Rejtozes, + "k_szabadulomuveszet" => Kepzettseg1E.Szabadulomuveszet, + "k_tudas" => Kepzettseg1E.Tudas, + "k_ugras" => Kepzettseg1E.Ugras, + "k_uszas" => Kepzettseg1E.Uszas, + "k_varazslatismeret" => Kepzettseg1E.Varazslatismeret, + "k_zarnyitas" => Kepzettseg1E.Zarnyitas, + "k_zsebmetszes" => Kepzettseg1E.Zsebmetszes, + _ => throw new ValidationException("invalid kepzettseg: " + kepzettseg), + }; + } + + public static Kepzettseg2E Convert2E(string kepzettseg) + { + return kepzettseg switch + { + "k_alkimia" => Kepzettseg2E.Alkimia, + "k_alcazas" => Kepzettseg2E.Alcazas, + "k_allatidomitas" => Kepzettseg2E.Allatidomitas, + "k_csapdak" => Kepzettseg2E.Csapdak, + "k_csillagjoslas" => Kepzettseg2E.Csillagjoslas, + "k_egyensulyozas" => Kepzettseg2E.Egyensulyozas, + "k_eloadas" => Kepzettseg2E.Eloadas, + "k_ertekbecsles" => Kepzettseg2E.Ertekbecsles, + "k_gyogyitas" => Kepzettseg2E.Gyogyitas, + "k_hajozas" => Kepzettseg2E.Hajozas, + "k_hallgatozas" => Kepzettseg2E.Hallgatozas, + "k_hamisitas" => Kepzettseg2E.Hamisitas, + "k_herbalizmus" => Kepzettseg2E.Herbalizmus, + "k_historia" => Kepzettseg2E.Historia, + "k_jelek_olvasasa" => Kepzettseg2E.JelekOlvasasa, + "k_lovaglas" => Kepzettseg2E.Lovaglas, + "k_maszas" => Kepzettseg2E.Maszas, + "k_megfigyeles" => Kepzettseg2E.Megfigyeles, + "k_meregkeveres" => Kepzettseg2E.Meregkeveres, + "k_mesterseg" => Kepzettseg2E.Mesterseg, + "k_nyomkereses" => Kepzettseg2E.Nyomkereses, + "k_okkultizmus" => Kepzettseg2E.Okkultizmus, + "k_osonas" => Kepzettseg2E.Osonas, + "k_szabadulomuveszet" => Kepzettseg2E.Szabadulomuveszet, + "k_ugras" => Kepzettseg2E.Ugras, + "k_uszas" => Kepzettseg2E.Uszas, + "k_vadonjaras" => Kepzettseg2E.Vadonjaras, + "k_zarnyitas" => Kepzettseg2E.Zarnyitas, + "k_zsebmetszes" => Kepzettseg2E.Zsebmetszes, _ => throw new ValidationException("invalid kepzettseg: " + kepzettseg), }; } - public static string Convert(this Kepzettseg kepzettseg) + public static string Convert(this Kepzettseg1E kepzettseg) { return kepzettseg switch { - Kepzettseg.Alkimia => "k_alkimia", - Kepzettseg.Alcazas => "k_alcazas", - Kepzettseg.Allatidomitas => "k_allatidomitas", - Kepzettseg.Csapdak => "k_csapdak", - Kepzettseg.Csillagjoslas => "k_csillagjoslas", - Kepzettseg.Egyensulyozas => "k_egyensulyozas", - Kepzettseg.Eloadas => "k_eloadas", - Kepzettseg.Ertekbecsles => "k_ertekbecsles", - Kepzettseg.Gyogyitas => "k_gyogyitas", - Kepzettseg.Hajozas => "k_hajozas", - Kepzettseg.Hallgatozas => "k_hallgatozas", - Kepzettseg.Hamisitas => "k_hamisitas", - Kepzettseg.JelekOlvasasa => "k_jelek_olvasasa", - Kepzettseg.Koncentracio => "k_koncentracio", - Kepzettseg.Lovaglas => "k_lovaglas", - Kepzettseg.Maszas => "k_maszas", - Kepzettseg.Megfigyeles => "k_megfigyeles", - Kepzettseg.Meregkeveres => "k_meregkeveres", - Kepzettseg.Mesterseg => "k_mesterseg", - Kepzettseg.Nyomkereses => "k_nyomkereses", - Kepzettseg.Osonas => "k_osonas", - Kepzettseg.Rejtozes => "k_rejtozes", - Kepzettseg.Szabadulomuveszet => "k_szabadulomuveszet", - Kepzettseg.Tudas => "k_tudas", - Kepzettseg.Ugras => "k_ugras", - Kepzettseg.Uszas => "k_uszas", - Kepzettseg.Varazslatismeret => "k_varazslatismeret", - Kepzettseg.Zarnyitas => "k_zarnyitas", - Kepzettseg.Zsebmetszes => "k_zsebmetszes", + Kepzettseg1E.Alkimia => "k_alkimia", + Kepzettseg1E.Alcazas => "k_alcazas", + Kepzettseg1E.Allatidomitas => "k_allatidomitas", + Kepzettseg1E.Csapdak => "k_csapdak", + Kepzettseg1E.Csillagjoslas => "k_csillagjoslas", + Kepzettseg1E.Egyensulyozas => "k_egyensulyozas", + Kepzettseg1E.Eloadas => "k_eloadas", + Kepzettseg1E.Ertekbecsles => "k_ertekbecsles", + Kepzettseg1E.Gyogyitas => "k_gyogyitas", + Kepzettseg1E.Hajozas => "k_hajozas", + Kepzettseg1E.Hallgatozas => "k_hallgatozas", + Kepzettseg1E.Hamisitas => "k_hamisitas", + Kepzettseg1E.JelekOlvasasa => "k_jelek_olvasasa", + Kepzettseg1E.Koncentracio => "k_koncentracio", + Kepzettseg1E.Lovaglas => "k_lovaglas", + Kepzettseg1E.Maszas => "k_maszas", + Kepzettseg1E.Megfigyeles => "k_megfigyeles", + Kepzettseg1E.Meregkeveres => "k_meregkeveres", + Kepzettseg1E.Mesterseg => "k_mesterseg", + Kepzettseg1E.Nyomkereses => "k_nyomkereses", + Kepzettseg1E.Osonas => "k_osonas", + Kepzettseg1E.Rejtozes => "k_rejtozes", + Kepzettseg1E.Szabadulomuveszet => "k_szabadulomuveszet", + Kepzettseg1E.Tudas => "k_tudas", + Kepzettseg1E.Ugras => "k_ugras", + Kepzettseg1E.Uszas => "k_uszas", + Kepzettseg1E.Varazslatismeret => "k_varazslatismeret", + Kepzettseg1E.Zarnyitas => "k_zarnyitas", + Kepzettseg1E.Zsebmetszes => "k_zsebmetszes", + _ => throw new ValidationException("invalid kepzettseg: " + kepzettseg), + }; + } + + public static string Convert(this Kepzettseg2E kepzettseg) + { + return kepzettseg switch + { + Kepzettseg2E.Alkimia => "k_alkimia", + Kepzettseg2E.Alcazas => "k_alcazas", + Kepzettseg2E.Allatidomitas => "k_allatidomitas", + Kepzettseg2E.Csapdak => "k_csapdak", + Kepzettseg2E.Csillagjoslas => "k_csillagjoslas", + Kepzettseg2E.Egyensulyozas => "k_egyensulyozas", + Kepzettseg2E.Eloadas => "k_eloadas", + Kepzettseg2E.Ertekbecsles => "k_ertekbecsles", + Kepzettseg2E.Gyogyitas => "k_gyogyitas", + Kepzettseg2E.Hajozas => "k_hajozas", + Kepzettseg2E.Hallgatozas => "k_hallgatozas", + Kepzettseg2E.Hamisitas => "k_hamisitas", + Kepzettseg2E.Herbalizmus => "k_herbalizmus", + Kepzettseg2E.Historia => "k_historia", + Kepzettseg2E.JelekOlvasasa => "k_jelek_olvasasa", + Kepzettseg2E.Lovaglas => "k_lovaglas", + Kepzettseg2E.Maszas => "k_maszas", + Kepzettseg2E.Megfigyeles => "k_megfigyeles", + Kepzettseg2E.Meregkeveres => "k_meregkeveres", + Kepzettseg2E.Mesterseg => "k_mesterseg", + Kepzettseg2E.Nyomkereses => "k_nyomkereses", + Kepzettseg2E.Okkultizmus => "k_okkultizmus", + Kepzettseg2E.Osonas => "k_osonas", + Kepzettseg2E.Szabadulomuveszet => "k_szabadulomuveszet", + Kepzettseg2E.Ugras => "k_ugras", + Kepzettseg2E.Uszas => "k_uszas", + Kepzettseg2E.Vadonjaras => "k_vadonjaras", + Kepzettseg2E.Zarnyitas => "k_zarnyitas", + Kepzettseg2E.Zsebmetszes => "k_zsebmetszes", _ => throw new ValidationException("invalid kepzettseg: " + kepzettseg), }; } diff --git a/Kemkas.Web/Db/Enums/Osztaly.cs b/Kemkas.Web/Db/Enums/Osztaly.cs index b1dfeae..3390dac 100644 --- a/Kemkas.Web/Db/Enums/Osztaly.cs +++ b/Kemkas.Web/Db/Enums/Osztaly.cs @@ -1,6 +1,6 @@ namespace Kemkas.Web.Db.Enums; -public enum Osztaly +public enum Osztaly1E { Error = 0, // for unset enum value mapping Harcos = 1, @@ -12,4 +12,21 @@ public enum Osztaly Tolvaj = 7, Varazslo = 8, Illuzionista = 9, +} + +public enum Osztaly2E +{ + Error = 0, // for unset enum value mapping + Harcos = 1, + Ijasz = 2, + Amazon = 3, + Kaloz = 4, + Barbar = 5, + Pap = 6, + Tolvaj = 7, + Varazslo = 8, + Illuzionista = 9, + Dalnok = 10, + Druida = 11, + Vandor = 12, } \ No newline at end of file diff --git a/Kemkas.Web/Db/Enums/OsztalyExtensions.cs b/Kemkas.Web/Db/Enums/OsztalyExtensions.cs index bc8af7d..c96c629 100644 --- a/Kemkas.Web/Db/Enums/OsztalyExtensions.cs +++ b/Kemkas.Web/Db/Enums/OsztalyExtensions.cs @@ -4,36 +4,76 @@ namespace Kemkas.Web.Db.Enums; public static class OsztalyExtensions { - public static Osztaly Convert(string osztaly) + public static Osztaly1E Convert1E(string osztaly) { return osztaly switch { - "o_harcos" => Osztaly.Harcos, - "o_ijasz" => Osztaly.Ijasz, - "o_amazon" => Osztaly.Amazon, - "o_kaloz" => Osztaly.Kaloz, - "o_barbar" => Osztaly.Barbar, - "o_pap" => Osztaly.Pap, - "o_tolvaj" => Osztaly.Tolvaj, - "o_varazslo" => Osztaly.Varazslo, - "o_illuzionista" => Osztaly.Illuzionista, + "o_harcos" => Osztaly1E.Harcos, + "o_ijasz" => Osztaly1E.Ijasz, + "o_amazon" => Osztaly1E.Amazon, + "o_kaloz" => Osztaly1E.Kaloz, + "o_barbar" => Osztaly1E.Barbar, + "o_pap" => Osztaly1E.Pap, + "o_tolvaj" => Osztaly1E.Tolvaj, + "o_varazslo" => Osztaly1E.Varazslo, + "o_illuzionista" => Osztaly1E.Illuzionista, _ => throw new ValidationException("unknown osztaly: " + osztaly) }; } - public static string Convert(this Osztaly osztaly) + public static Osztaly2E Convert2E(string osztaly) { return osztaly switch { - Osztaly.Harcos => "o_harcos", - Osztaly.Ijasz => "o_ijasz", - Osztaly.Amazon => "o_amazon", - Osztaly.Kaloz => "o_kaloz", - Osztaly.Barbar => "o_barbar", - Osztaly.Pap => "o_pap", - Osztaly.Tolvaj => "o_tolvaj", - Osztaly.Varazslo => "o_varazslo", - Osztaly.Illuzionista => "o_illuzionista", + "o_2e_harcos" => Osztaly2E.Harcos, + "o_2e_ijasz" => Osztaly2E.Ijasz, + "o_2e_amazon" => Osztaly2E.Amazon, + "o_2e_kaloz" => Osztaly2E.Kaloz, + "o_2e_barbar" => Osztaly2E.Barbar, + "o_2e_pap" => Osztaly2E.Pap, + "o_2e_tolvaj" => Osztaly2E.Tolvaj, + "o_2e_varazslo" => Osztaly2E.Varazslo, + "o_2e_illuzionista" => Osztaly2E.Illuzionista, + "o_2e_dalnok" => Osztaly2E.Dalnok, + "o_2e_druida" => Osztaly2E.Druida, + "o_2e_vandor" => Osztaly2E.Vandor, + _ => throw new ValidationException("unknown osztaly: " + osztaly) + }; + } + + public static string Convert(this Osztaly1E osztaly) + { + return osztaly switch + { + Osztaly1E.Harcos => "o_harcos", + Osztaly1E.Ijasz => "o_ijasz", + Osztaly1E.Amazon => "o_amazon", + Osztaly1E.Kaloz => "o_kaloz", + Osztaly1E.Barbar => "o_barbar", + Osztaly1E.Pap => "o_pap", + Osztaly1E.Tolvaj => "o_tolvaj", + Osztaly1E.Varazslo => "o_varazslo", + Osztaly1E.Illuzionista => "o_illuzionista", + _ => throw new ValidationException("invalid osztaly!") + }; + } + + public static string Convert(this Osztaly2E osztaly) + { + return osztaly switch + { + Osztaly2E.Harcos => "o_2e_harcos", + Osztaly2E.Ijasz => "o_2e_ijasz", + Osztaly2E.Amazon => "o_2e_amazon", + Osztaly2E.Kaloz => "o_2e_kaloz", + Osztaly2E.Barbar => "o_2e_barbar", + Osztaly2E.Pap => "o_2e_pap", + Osztaly2E.Tolvaj => "o_2e_tolvaj", + Osztaly2E.Varazslo => "o_2e_varazslo", + Osztaly2E.Illuzionista => "o_2e_illuzionista", + Osztaly2E.Dalnok => "o_2e_dalnok", + Osztaly2E.Druida => "o_2e_druida", + Osztaly2E.Vandor => "o_2e_vandor", _ => throw new ValidationException("invalid osztaly!") }; } diff --git a/Kemkas.Web/Db/Migrations/20240214163223_AddSecondEditionModels.Designer.cs b/Kemkas.Web/Db/Migrations/20240214163223_AddSecondEditionModels.Designer.cs new file mode 100644 index 0000000..6149286 --- /dev/null +++ b/Kemkas.Web/Db/Migrations/20240214163223_AddSecondEditionModels.Designer.cs @@ -0,0 +1,690 @@ +// +using System; +using Kemkas.Web.Db; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Kemkas.Web.Db.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20240214163223_AddSecondEditionModels")] + partial class AddSecondEditionModels + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Kemkas.Web.Db.Models.ApplicationRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.ApplicationUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1Felszereles", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("IsFegyver") + .HasColumnType("boolean"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("Felszerelesek"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1Karakter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Bolcsesseg") + .HasColumnType("smallint"); + + b.Property("Egeszseg") + .HasColumnType("smallint"); + + b.Property("Ero") + .HasColumnType("smallint"); + + b.Property("Faj") + .HasColumnType("integer"); + + b.Property("Intelligencia") + .HasColumnType("smallint"); + + b.Property("IsPublic") + .HasColumnType("boolean"); + + b.Property("Isten") + .HasColumnType("text"); + + b.Property("Jellem") + .HasColumnType("smallint"); + + b.Property("Karizma") + .HasColumnType("smallint"); + + b.Property("Kor") + .HasColumnType("double precision"); + + b.Property("Nem") + .HasColumnType("text"); + + b.Property("Nev") + .IsRequired() + .HasColumnType("text"); + + b.Property("Osztaly") + .HasColumnType("integer"); + + b.Property("OwnerUserId") + .HasColumnType("integer"); + + b.Property("Pajzs") + .HasColumnType("text"); + + b.Property("Pancel") + .HasColumnType("text"); + + b.Property("Szint") + .HasColumnType("smallint"); + + b.Property("Ugyesseg") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.HasIndex("OwnerUserId"); + + b.ToTable("Karakterek"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1KarakterKepzettseg", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("IsTolvajKepzettseg") + .HasColumnType("boolean"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("Kepzettseg") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("KarakterKepzettsegek"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1Szintlepes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("FegyverSpecializacio") + .HasColumnType("text"); + + b.Property("HpRoll") + .HasColumnType("smallint"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("KarakterSzint") + .HasColumnType("smallint"); + + b.Property("TulajdonsagNoveles") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("Szintlepesek"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Felszereles", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("IsFegyver") + .HasColumnType("boolean"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("TargyId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("Felszerelesek2E"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Karakter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Bolcsesseg") + .HasColumnType("smallint"); + + b.Property("Egeszseg") + .HasColumnType("smallint"); + + b.Property("Ero") + .HasColumnType("smallint"); + + b.Property("Faj") + .HasColumnType("integer"); + + b.Property("Intelligencia") + .HasColumnType("smallint"); + + b.Property("IsPublic") + .HasColumnType("boolean"); + + b.Property("Isten") + .HasColumnType("text"); + + b.Property("Jellem") + .HasColumnType("smallint"); + + b.Property("Karizma") + .HasColumnType("smallint"); + + b.Property("Kor") + .HasColumnType("double precision"); + + b.Property("Nem") + .HasColumnType("text"); + + b.Property("Nev") + .IsRequired() + .HasColumnType("text"); + + b.Property("OwnerUserId") + .HasColumnType("integer"); + + b.Property("Pajzs") + .HasColumnType("text"); + + b.Property("Pancel") + .HasColumnType("text"); + + b.Property("Szint") + .HasColumnType("smallint"); + + b.Property("Ugyesseg") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.HasIndex("OwnerUserId"); + + b.ToTable("Karakterek2E"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2KarakterKepzettseg", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("IsTolvajKepzettseg") + .HasColumnType("boolean"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("Kepzettseg") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("KarakterKepzettsegek2E"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Szintlepes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("FegyverSpecializacio") + .HasColumnType("text"); + + b.Property("HpRoll") + .HasColumnType("smallint"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("KarakterSzint") + .HasColumnType("smallint"); + + b.Property("Osztaly") + .HasColumnType("integer"); + + b.Property("TolvajExtraKepzettseg") + .HasColumnType("integer"); + + b.Property("TulajdonsagNoveles") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("Szintlepesek2E"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1Felszereles", b => + { + b.HasOne("Kemkas.Web.Db.Models.V1Karakter", "Karakter") + .WithMany("Felszereles") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1Karakter", b => + { + b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", "OwnerUser") + .WithMany() + .HasForeignKey("OwnerUserId"); + + b.Navigation("OwnerUser"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1KarakterKepzettseg", b => + { + b.HasOne("Kemkas.Web.Db.Models.V1Karakter", "Karakter") + .WithMany("KarakterKepzettsegek") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1Szintlepes", b => + { + b.HasOne("Kemkas.Web.Db.Models.V1Karakter", "Karakter") + .WithMany("Szintlepesek") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Felszereles", b => + { + b.HasOne("Kemkas.Web.Db.Models.V2Karakter", "Karakter") + .WithMany("Felszereles") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Karakter", b => + { + b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", "OwnerUser") + .WithMany() + .HasForeignKey("OwnerUserId"); + + b.Navigation("OwnerUser"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2KarakterKepzettseg", b => + { + b.HasOne("Kemkas.Web.Db.Models.V2Karakter", "Karakter") + .WithMany("KarakterKepzettsegek") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Szintlepes", b => + { + b.HasOne("Kemkas.Web.Db.Models.V2Karakter", "Karakter") + .WithMany("Szintlepesek") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Kemkas.Web.Db.Models.ApplicationRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Kemkas.Web.Db.Models.ApplicationRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V1Karakter", b => + { + b.Navigation("Felszereles"); + + b.Navigation("KarakterKepzettsegek"); + + b.Navigation("Szintlepesek"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Karakter", b => + { + b.Navigation("Felszereles"); + + b.Navigation("KarakterKepzettsegek"); + + b.Navigation("Szintlepesek"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Kemkas.Web/Db/Migrations/20240214163223_AddSecondEditionModels.cs b/Kemkas.Web/Db/Migrations/20240214163223_AddSecondEditionModels.cs new file mode 100644 index 0000000..0b1f079 --- /dev/null +++ b/Kemkas.Web/Db/Migrations/20240214163223_AddSecondEditionModels.cs @@ -0,0 +1,148 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Kemkas.Web.Db.Migrations +{ + /// + public partial class AddSecondEditionModels : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Karakterek2E", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + IsPublic = table.Column(type: "boolean", nullable: false), + OwnerUserId = table.Column(type: "integer", nullable: true), + Nev = table.Column(type: "text", nullable: false), + Nem = table.Column(type: "text", nullable: true), + Kor = table.Column(type: "double precision", nullable: true), + Jellem = table.Column(type: "smallint", nullable: false), + Isten = table.Column(type: "text", nullable: true), + Faj = table.Column(type: "integer", nullable: false), + Ero = table.Column(type: "smallint", nullable: false), + Ugyesseg = table.Column(type: "smallint", nullable: false), + Egeszseg = table.Column(type: "smallint", nullable: false), + Intelligencia = table.Column(type: "smallint", nullable: false), + Bolcsesseg = table.Column(type: "smallint", nullable: false), + Karizma = table.Column(type: "smallint", nullable: false), + Szint = table.Column(type: "smallint", nullable: false), + Pancel = table.Column(type: "text", nullable: true), + Pajzs = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Karakterek2E", x => x.Id); + table.ForeignKey( + name: "FK_Karakterek2E_AspNetUsers_OwnerUserId", + column: x => x.OwnerUserId, + principalTable: "AspNetUsers", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "Felszerelesek2E", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + KarakterId = table.Column(type: "uuid", nullable: false), + TargyId = table.Column(type: "text", nullable: false), + IsFegyver = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Felszerelesek2E", x => x.Id); + table.ForeignKey( + name: "FK_Felszerelesek2E_Karakterek2E_KarakterId", + column: x => x.KarakterId, + principalTable: "Karakterek2E", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "KarakterKepzettsegek2E", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + KarakterId = table.Column(type: "uuid", nullable: false), + Kepzettseg = table.Column(type: "integer", nullable: false), + IsTolvajKepzettseg = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_KarakterKepzettsegek2E", x => x.Id); + table.ForeignKey( + name: "FK_KarakterKepzettsegek2E_Karakterek2E_KarakterId", + column: x => x.KarakterId, + principalTable: "Karakterek2E", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Szintlepesek2E", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + KarakterId = table.Column(type: "uuid", nullable: false), + KarakterSzint = table.Column(type: "smallint", nullable: false), + Osztaly = table.Column(type: "integer", nullable: false), + HpRoll = table.Column(type: "smallint", nullable: false), + TulajdonsagNoveles = table.Column(type: "smallint", nullable: true), + FegyverSpecializacio = table.Column(type: "text", nullable: true), + TolvajExtraKepzettseg = table.Column(type: "integer", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Szintlepesek2E", x => x.Id); + table.ForeignKey( + name: "FK_Szintlepesek2E_Karakterek2E_KarakterId", + column: x => x.KarakterId, + principalTable: "Karakterek2E", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Felszerelesek2E_KarakterId", + table: "Felszerelesek2E", + column: "KarakterId"); + + migrationBuilder.CreateIndex( + name: "IX_Karakterek2E_OwnerUserId", + table: "Karakterek2E", + column: "OwnerUserId"); + + migrationBuilder.CreateIndex( + name: "IX_KarakterKepzettsegek2E_KarakterId", + table: "KarakterKepzettsegek2E", + column: "KarakterId"); + + migrationBuilder.CreateIndex( + name: "IX_Szintlepesek2E_KarakterId", + table: "Szintlepesek2E", + column: "KarakterId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Felszerelesek2E"); + + migrationBuilder.DropTable( + name: "KarakterKepzettsegek2E"); + + migrationBuilder.DropTable( + name: "Szintlepesek2E"); + + migrationBuilder.DropTable( + name: "Karakterek2E"); + } + } +} diff --git a/Kemkas.Web/Db/Migrations/ApplicationDbContextModelSnapshot.cs b/Kemkas.Web/Db/Migrations/ApplicationDbContextModelSnapshot.cs index 370a89d..2b5073c 100644 --- a/Kemkas.Web/Db/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Kemkas.Web/Db/Migrations/ApplicationDbContextModelSnapshot.cs @@ -259,6 +259,150 @@ namespace Kemkas.Web.Db.Migrations b.ToTable("Szintlepesek"); }); + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Felszereles", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("IsFegyver") + .HasColumnType("boolean"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("TargyId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("Felszerelesek2E"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Karakter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Bolcsesseg") + .HasColumnType("smallint"); + + b.Property("Egeszseg") + .HasColumnType("smallint"); + + b.Property("Ero") + .HasColumnType("smallint"); + + b.Property("Faj") + .HasColumnType("integer"); + + b.Property("Intelligencia") + .HasColumnType("smallint"); + + b.Property("IsPublic") + .HasColumnType("boolean"); + + b.Property("Isten") + .HasColumnType("text"); + + b.Property("Jellem") + .HasColumnType("smallint"); + + b.Property("Karizma") + .HasColumnType("smallint"); + + b.Property("Kor") + .HasColumnType("double precision"); + + b.Property("Nem") + .HasColumnType("text"); + + b.Property("Nev") + .IsRequired() + .HasColumnType("text"); + + b.Property("OwnerUserId") + .HasColumnType("integer"); + + b.Property("Pajzs") + .HasColumnType("text"); + + b.Property("Pancel") + .HasColumnType("text"); + + b.Property("Szint") + .HasColumnType("smallint"); + + b.Property("Ugyesseg") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.HasIndex("OwnerUserId"); + + b.ToTable("Karakterek2E"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2KarakterKepzettseg", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("IsTolvajKepzettseg") + .HasColumnType("boolean"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("Kepzettseg") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("KarakterKepzettsegek2E"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Szintlepes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("FegyverSpecializacio") + .HasColumnType("text"); + + b.Property("HpRoll") + .HasColumnType("smallint"); + + b.Property("KarakterId") + .HasColumnType("uuid"); + + b.Property("KarakterSzint") + .HasColumnType("smallint"); + + b.Property("Osztaly") + .HasColumnType("integer"); + + b.Property("TolvajExtraKepzettseg") + .HasColumnType("integer"); + + b.Property("TulajdonsagNoveles") + .HasColumnType("smallint"); + + b.HasKey("Id"); + + b.HasIndex("KarakterId"); + + b.ToTable("Szintlepesek2E"); + }); + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => { b.Property("Id") @@ -427,6 +571,48 @@ namespace Kemkas.Web.Db.Migrations b.Navigation("Karakter"); }); + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Felszereles", b => + { + b.HasOne("Kemkas.Web.Db.Models.V2Karakter", "Karakter") + .WithMany("Felszereles") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Karakter", b => + { + b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", "OwnerUser") + .WithMany() + .HasForeignKey("OwnerUserId"); + + b.Navigation("OwnerUser"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2KarakterKepzettseg", b => + { + b.HasOne("Kemkas.Web.Db.Models.V2Karakter", "Karakter") + .WithMany("KarakterKepzettsegek") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Szintlepes", b => + { + b.HasOne("Kemkas.Web.Db.Models.V2Karakter", "Karakter") + .WithMany("Szintlepesek") + .HasForeignKey("KarakterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Karakter"); + }); + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { b.HasOne("Kemkas.Web.Db.Models.ApplicationRole", null) @@ -486,6 +672,15 @@ namespace Kemkas.Web.Db.Migrations b.Navigation("Szintlepesek"); }); + + modelBuilder.Entity("Kemkas.Web.Db.Models.V2Karakter", b => + { + b.Navigation("Felszereles"); + + b.Navigation("KarakterKepzettsegek"); + + b.Navigation("Szintlepesek"); + }); #pragma warning restore 612, 618 } } diff --git a/Kemkas.Web/Db/Models/V1Karakter.cs b/Kemkas.Web/Db/Models/V1Karakter.cs index d961712..46d009a 100644 --- a/Kemkas.Web/Db/Models/V1Karakter.cs +++ b/Kemkas.Web/Db/Models/V1Karakter.cs @@ -4,6 +4,9 @@ using Kemkas.Web.Db.Enums; namespace Kemkas.Web.Db.Models; +/// +/// 1st edition character sheet +/// public class V1Karakter { [Key] public Guid Id { get; set; } @@ -15,8 +18,8 @@ public class V1Karakter public double? Kor { get; set; } public Jellem Jellem { get; set; } = Jellem.Semleges; public string? Isten { get; set; } - public Faj Faj { get; set; } = Faj.Ember; - public Osztaly Osztaly { get; set; } + public Faj1E Faj { get; set; } = Faj1E.Ember; + public Osztaly1E Osztaly { get; set; } public byte Ero { get; set; } public byte Ugyesseg { get; set; } public byte Egeszseg { get; set; } diff --git a/Kemkas.Web/Db/Models/V1KarakterKepzettseg.cs b/Kemkas.Web/Db/Models/V1KarakterKepzettseg.cs index 6650e37..bd23173 100644 --- a/Kemkas.Web/Db/Models/V1KarakterKepzettseg.cs +++ b/Kemkas.Web/Db/Models/V1KarakterKepzettseg.cs @@ -9,7 +9,7 @@ public class V1KarakterKepzettseg [Key] public Guid Id { get; set; } public Guid KarakterId { get; set; } - public Kepzettseg Kepzettseg { get; set; } + public Kepzettseg1E Kepzettseg { get; set; } public bool IsTolvajKepzettseg { get; set; } = false; [ForeignKey(nameof(KarakterId))] diff --git a/Kemkas.Web/Db/Models/V1Szintlepes.cs b/Kemkas.Web/Db/Models/V1Szintlepes.cs index 9145d34..6c465ea 100644 --- a/Kemkas.Web/Db/Models/V1Szintlepes.cs +++ b/Kemkas.Web/Db/Models/V1Szintlepes.cs @@ -19,6 +19,8 @@ public class V1Szintlepes public byte HpRoll { get; set; } public Tulajdonsag? TulajdonsagNoveles { get; set; } + + // used for both Kaloz/Tengeresz and Harcos public string? FegyverSpecializacio { get; set; } [ForeignKey(nameof(KarakterId))] diff --git a/Kemkas.Web/Db/Models/V2Felszereles.cs b/Kemkas.Web/Db/Models/V2Felszereles.cs new file mode 100644 index 0000000..3e05a8a --- /dev/null +++ b/Kemkas.Web/Db/Models/V2Felszereles.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Kemkas.Web.Db.Models; + +public class V2Felszereles +{ + [Key] + public Guid Id { get; set; } + public Guid KarakterId { get; set; } + + public string TargyId { get; set; } + public bool IsFegyver { get; set; } = true; + + [ForeignKey(nameof(KarakterId))] + public virtual V2Karakter Karakter { get; set; } +} \ No newline at end of file diff --git a/Kemkas.Web/Db/Models/V2Karakter.cs b/Kemkas.Web/Db/Models/V2Karakter.cs new file mode 100644 index 0000000..aed7ce2 --- /dev/null +++ b/Kemkas.Web/Db/Models/V2Karakter.cs @@ -0,0 +1,44 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Kemkas.Web.Db.Enums; + +namespace Kemkas.Web.Db.Models; + +/// +/// 2nd edition character sheet +/// +public class V2Karakter +{ + [Key] public Guid Id { get; set; } + public bool IsPublic { get; set; } = false; + public int? OwnerUserId { get; set; } + + public string Nev { get; set; } + public string? Nem { get; set; } + public double? Kor { get; set; } + public Jellem Jellem { get; set; } = Jellem.Semleges; + public string? Isten { get; set; } + public Faj2E Faj { get; set; } = Faj2E.Ember; + public byte Ero { get; set; } + public byte Ugyesseg { get; set; } + public byte Egeszseg { get; set; } + public byte Intelligencia { get; set; } + public byte Bolcsesseg { get; set; } + public byte Karizma { get; set; } + public byte Szint { get; set; } = 1; + + public string? Pancel { get; set; } + public string? Pajzs { get; set; } + + [ForeignKey(nameof(OwnerUserId))] + public ApplicationUser? OwnerUser { get; set; } + + [InverseProperty(nameof(V2KarakterKepzettseg.Karakter))] + public virtual IEnumerable KarakterKepzettsegek { get; set; } + + [InverseProperty(nameof(V2Szintlepes.Karakter))] + public virtual IEnumerable Szintlepesek { get; set; } + + [InverseProperty(nameof(V2Felszereles.Karakter))] + public virtual IEnumerable Felszereles { get; set; } +} \ No newline at end of file diff --git a/Kemkas.Web/Db/Models/V2KarakterKepzettseg.cs b/Kemkas.Web/Db/Models/V2KarakterKepzettseg.cs new file mode 100644 index 0000000..293f972 --- /dev/null +++ b/Kemkas.Web/Db/Models/V2KarakterKepzettseg.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Kemkas.Web.Db.Enums; + +namespace Kemkas.Web.Db.Models; + +public class V2KarakterKepzettseg +{ + [Key] + public Guid Id { get; set; } + public Guid KarakterId { get; set; } + public Kepzettseg2E Kepzettseg { get; set; } + public bool IsTolvajKepzettseg { get; set; } = false; + + [ForeignKey(nameof(KarakterId))] + public virtual V2Karakter Karakter { get; set; } +} \ No newline at end of file diff --git a/Kemkas.Web/Db/Models/V2Szintlepes.cs b/Kemkas.Web/Db/Models/V2Szintlepes.cs new file mode 100644 index 0000000..c7f6881 --- /dev/null +++ b/Kemkas.Web/Db/Models/V2Szintlepes.cs @@ -0,0 +1,29 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Kemkas.Web.Db.Enums; + +namespace Kemkas.Web.Db.Models; + +public class V2Szintlepes +{ + [Key] + public Guid Id { get; set; } + public Guid KarakterId { get; set; } + + // this is also used for ordering the level ups + public byte KarakterSzint { get; set; } + + public Osztaly2E Osztaly { get; set; } + + public byte HpRoll { get; set; } + public Tulajdonsag? TulajdonsagNoveles { get; set; } + + // used for both Kaloz/Tengeresz and Harcos + public string? FegyverSpecializacio { get; set; } + + // for the 9th level Tolvaj specialty + public Kepzettseg2E? TolvajExtraKepzettseg { get; set; } + + [ForeignKey(nameof(KarakterId))] + public virtual V2Karakter Karakter { get; set; } +} \ No newline at end of file diff --git a/Kemkas.Web/Kemkas.Web.csproj b/Kemkas.Web/Kemkas.Web.csproj index e95fe57..b9d83a4 100644 --- a/Kemkas.Web/Kemkas.Web.csproj +++ b/Kemkas.Web/Kemkas.Web.csproj @@ -52,6 +52,10 @@ + + + + diff --git a/Kemkas.Web/Program.cs b/Kemkas.Web/Program.cs index 603f477..21bdc84 100644 --- a/Kemkas.Web/Program.cs +++ b/Kemkas.Web/Program.cs @@ -6,14 +6,14 @@ using Kemkas.Web.Config; using Microsoft.EntityFrameworkCore; using Kemkas.Web.Db; using Kemkas.Web.Db.Models; -using Kemkas.Web.Services.Character; +using Kemkas.Web.Services.FirstEdition.Character; using Kemkas.Web.Services.Identity; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.Identity.UI.Services; -using OpenTelemetry.Metrics; -using OpenTelemetry.Resources; -using OpenTelemetry.Trace; +// using OpenTelemetry.Metrics; +// using OpenTelemetry.Resources; +// using OpenTelemetry.Trace; using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork; var builder = WebApplication.CreateBuilder(args); diff --git a/Kemkas.Web/Services/Character/CharacterPersistenceService.cs b/Kemkas.Web/Services/Character/CharacterPersistenceService.cs deleted file mode 100644 index 5f289b7..0000000 --- a/Kemkas.Web/Services/Character/CharacterPersistenceService.cs +++ /dev/null @@ -1,88 +0,0 @@ -using Kemkas.Web.Db; -using Kemkas.Web.Db.Enums; -using Kemkas.Web.Db.Models; -using Kemkas.Web.Services.Identity; -using Kemkas.Web.ViewModels; -using Microsoft.EntityFrameworkCore; - -namespace Kemkas.Web.Services.Character; - -public interface ICharacterPersistenceService -{ - public Task StoreNewCharacter(V1Karakter karakter, bool isPublic = false); - - public Task GetCharacterById(Guid id, bool tracking = false); - - public Task> GetAllCharactersOfUser(); - - public Task UpdateCharacter(V1Karakter karakter, bool isPublic = false); -} - -public class CharacterPersistenceService( - ApplicationDbContext dbContext, - ICurrentUserService currentUserService - ) : ICharacterPersistenceService -{ - - public async Task StoreNewCharacter(V1Karakter karakter, bool isPublic = false) - { - var currentUser = await currentUserService.GetCurrentUser(); - karakter.OwnerUserId = currentUser?.Id; - karakter.Id = Guid.Empty; - karakter.IsPublic = isPublic; - dbContext.Karakterek.Add(karakter); - await dbContext.SaveChangesAsync(); - return karakter.Id; - } - - public async Task GetCharacterById(Guid id, bool tracking = false) - { - IQueryable queriable = dbContext.Karakterek.Include(x => x.KarakterKepzettsegek) - .Include(x => x.Szintlepesek) - .Include(x => x.Felszereles); - - queriable = tracking ? queriable.AsTracking() : queriable.AsNoTracking(); - - var entity = await queriable - .FirstOrDefaultAsync(x => x.Id == id); - - if (entity?.OwnerUserId is null || entity.IsPublic) - { - return entity; - } - - var currentUser = await currentUserService.GetCurrentUser(); - return entity.OwnerUserId == currentUser?.Id ? entity : null; - } - - public async Task> GetAllCharactersOfUser() - { - var currentUser = await currentUserService.GetCurrentUser(); - if (currentUser is null) - { - return []; - } - - var characters = await dbContext.Karakterek - .Where(k => k.OwnerUserId == currentUser.Id) - .Select(k => new CharacterListItemDto - { - Id = k.Id, - Name = k.Nev, - Szint = k.Szint, - Faj = k.Faj.Convert(), - Osztaly = k.Osztaly.Convert(), - Edition = "1e" - }) - .ToListAsync(); - - return characters; - } - - public async Task UpdateCharacter(V1Karakter karakter, bool isPublic = false) - { - karakter.IsPublic = isPublic; - dbContext.Karakterek.Attach(karakter); - await dbContext.SaveChangesAsync(); - } -} \ No newline at end of file diff --git a/Kemkas.Web/Services/Character/CharacterDtoToDbModelService.cs b/Kemkas.Web/Services/FirstEdition/Character/Character1EDtoToDbModelService.cs similarity index 78% rename from Kemkas.Web/Services/Character/CharacterDtoToDbModelService.cs rename to Kemkas.Web/Services/FirstEdition/Character/Character1EDtoToDbModelService.cs index b5555c7..09dfe08 100644 --- a/Kemkas.Web/Services/Character/CharacterDtoToDbModelService.cs +++ b/Kemkas.Web/Services/FirstEdition/Character/Character1EDtoToDbModelService.cs @@ -3,18 +3,18 @@ using Kemkas.Web.Db.Enums; using Kemkas.Web.Db.Models; using Kemkas.Web.ViewModels; -namespace Kemkas.Web.Services.Character; +namespace Kemkas.Web.Services.FirstEdition.Character; -public interface ICharacterDtoToDbModelService +public interface ICharacter1EDtoToDbModelService { - public V1Karakter Convert(CharacterDto dto); + public V1Karakter Convert(Character1eDto dto); - public void Update(V1Karakter original, CharacterDto dto); + public void Update(V1Karakter original, Character1eDto dto); } -public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService +public class Character1EDtoToDbModelService : ICharacter1EDtoToDbModelService { - public V1Karakter Convert(CharacterDto dto) + public V1Karakter Convert(Character1eDto dto) { var karakter = new V1Karakter { @@ -23,8 +23,8 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService Kor = dto.Kor, Jellem = JellemExtensions.Convert(dto.Jellem), Isten = dto.Isten, - Faj = FajExtensions.Convert(dto.Faj), - Osztaly = OsztalyExtensions.Convert(dto.Osztaly), + Faj = FajExtensions.Convert1E(dto.Faj), + Osztaly = OsztalyExtensions.Convert1E(dto.Osztaly), Ero = dto.Tulajdonsagok.Ero, Ugyesseg = dto.Tulajdonsagok.Ugy, Egeszseg = dto.Tulajdonsagok.Egs, @@ -32,10 +32,10 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService Bolcsesseg = dto.Tulajdonsagok.Bol, Karizma = dto.Tulajdonsagok.Kar, Szint = dto.Szint, + Pajzs = dto.Felszereles.PajzsId, + Pancel = dto.Felszereles.PancelId }; karakter.KarakterKepzettsegek = ConvertKepzettsegek(dto, karakter); - karakter.Pajzs = dto.Felszereles.PajzsId; - karakter.Pancel = dto.Felszereles.PancelId; karakter.Felszereles = dto.Felszereles.FegyverIds.Select(x => new V1Felszereles { Karakter = karakter, @@ -47,15 +47,15 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService return karakter; } - public void Update(V1Karakter original, CharacterDto dto) + public void Update(V1Karakter original, Character1eDto dto) { original.Nev = dto.Name; original.Nem = dto.Nem; original.Kor = dto.Kor; original.Jellem = JellemExtensions.Convert(dto.Jellem); original.Isten = dto.Isten; - original.Faj = FajExtensions.Convert(dto.Faj); - original.Osztaly = OsztalyExtensions.Convert(dto.Osztaly); + original.Faj = FajExtensions.Convert1E(dto.Faj); + original.Osztaly = OsztalyExtensions.Convert1E(dto.Osztaly); original.Ero = dto.Tulajdonsagok.Ero; original.Ugyesseg = dto.Tulajdonsagok.Ugy; original.Egeszseg = dto.Tulajdonsagok.Egs; @@ -76,7 +76,7 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService } // TODO: this is unnecessary duplication of business logic!! - private static List ConvertSzintLepes(CharacterDto dto, V1Karakter karakter) + private static List ConvertSzintLepes(Character1eDto dto, V1Karakter karakter) { if (dto.HpRolls.Count < dto.Szint - 2) { @@ -103,15 +103,15 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService // OsztalySzint = 1, HpRoll = karakter.Osztaly switch // TODO: duplication of logic!! { - Osztaly.Barbar => 12, - Osztaly.Amazon or Osztaly.Harcos or Osztaly.Kaloz or Osztaly.Ijasz => 10, - Osztaly.Pap => 8, - Osztaly.Tolvaj => 6, - Osztaly.Varazslo or Osztaly.Illuzionista => 4, + Osztaly1E.Barbar => 12, + Osztaly1E.Amazon or Osztaly1E.Harcos or Osztaly1E.Kaloz or Osztaly1E.Ijasz => 10, + Osztaly1E.Pap => 8, + Osztaly1E.Tolvaj => 6, + Osztaly1E.Varazslo or Osztaly1E.Illuzionista => 4, _ => throw new ArgumentOutOfRangeException(nameof(karakter.Osztaly), karakter.Osztaly, "invalid osztaly!") }, - FegyverSpecializacio = karakter.Osztaly == Osztaly.Harcos ? dto.HarcosSpecializaciok[0] : null, + FegyverSpecializacio = karakter.Osztaly == Osztaly1E.Harcos ? dto.HarcosSpecializaciok[0] : null, }; return Enumerable.Range(2, count: dto.Szint - 1).Select(szint => @@ -131,13 +131,13 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService }).Prepend(level1).ToList(); } - private static List ConvertKepzettsegek(CharacterDto dto, V1Karakter karakter) + private static List ConvertKepzettsegek(Character1eDto dto, V1Karakter karakter) { var kepzettsegek = dto.Kepzettsegek.Select(x => new V1KarakterKepzettseg { Karakter = karakter, IsTolvajKepzettseg = false, - Kepzettseg = KepzettsegExtensions.Convert(x), + Kepzettseg = KepzettsegExtensions.Convert1E(x), }).ToList(); if (dto.Tolvajkepzettsegek != null) { @@ -145,7 +145,7 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService { Karakter = karakter, IsTolvajKepzettseg = true, - Kepzettseg = KepzettsegExtensions.Convert(x), + Kepzettseg = KepzettsegExtensions.Convert1E(x), })); } return kepzettsegek; diff --git a/Kemkas.Web/Services/Character/CharacterDbModelToDtoService.cs b/Kemkas.Web/Services/FirstEdition/Character/CharacterDbModelToDtoService.cs similarity index 74% rename from Kemkas.Web/Services/Character/CharacterDbModelToDtoService.cs rename to Kemkas.Web/Services/FirstEdition/Character/CharacterDbModelToDtoService.cs index 7144ec6..4c5ab97 100644 --- a/Kemkas.Web/Services/Character/CharacterDbModelToDtoService.cs +++ b/Kemkas.Web/Services/FirstEdition/Character/CharacterDbModelToDtoService.cs @@ -2,18 +2,18 @@ using Kemkas.Web.Db.Enums; using Kemkas.Web.Db.Models; using Kemkas.Web.ViewModels; -namespace Kemkas.Web.Services.Character; +namespace Kemkas.Web.Services.FirstEdition.Character; public interface ICharacterDbModelToDtoService { - public CharacterDto Convert(V1Karakter entity); + public Character1eDto Convert(V1Karakter entity); } public class CharacterDbModelToDtoService : ICharacterDbModelToDtoService { - public CharacterDto Convert(V1Karakter entity) + public Character1eDto Convert(V1Karakter entity) { - return new CharacterDto + return new Character1eDto { Name = entity.Nev, Nem = entity.Nem, @@ -36,8 +36,8 @@ public class CharacterDbModelToDtoService : ICharacterDbModelToDtoService Szint = entity.Szint, HpRolls = entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Skip(1).Select(x => x.HpRoll).ToList(), TulajdonsagNovelesek = entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.TulajdonsagNoveles).Where(x => x is not null).Cast().Select(x => x.Convert()).ToList(), - HarcosSpecializaciok = entity.Osztaly == Osztaly.Harcos ? entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.FegyverSpecializacio).Where(x => x != null).Cast().ToList() : [], - KalozKritikus = entity.Osztaly == Osztaly.Kaloz ? entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.FegyverSpecializacio).Where(x => x != null).Cast().ToList() : [], + HarcosSpecializaciok = entity.Osztaly == Osztaly1E.Harcos ? entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.FegyverSpecializacio).Where(x => x != null).Cast().ToList() : [], + KalozKritikus = entity.Osztaly == Osztaly1E.Kaloz ? entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.FegyverSpecializacio).Where(x => x != null).Cast().ToList() : [], Felszereles = new KarakterFelszerelesDto { PajzsId = entity.Pajzs, diff --git a/Kemkas.Web/Services/Character/CharacterServices.cs b/Kemkas.Web/Services/FirstEdition/Character/CharacterServices.cs similarity index 76% rename from Kemkas.Web/Services/Character/CharacterServices.cs rename to Kemkas.Web/Services/FirstEdition/Character/CharacterServices.cs index d6efc77..bd2e9d9 100644 --- a/Kemkas.Web/Services/Character/CharacterServices.cs +++ b/Kemkas.Web/Services/FirstEdition/Character/CharacterServices.cs @@ -1,6 +1,7 @@ using Kemkas.Web.Services.Identity; +using Kemkas.Web.Services.Shared; -namespace Kemkas.Web.Services.Character; +namespace Kemkas.Web.Services.FirstEdition.Character; public static class ServiceCollectionExtensions { @@ -9,7 +10,7 @@ public static class ServiceCollectionExtensions serviceCollection.AddScoped(); serviceCollection.AddTransient(); - serviceCollection.AddTransient(); + serviceCollection.AddTransient(); serviceCollection.AddTransient(); serviceCollection.AddScoped(); return serviceCollection; diff --git a/Kemkas.Web/Services/Character/CharacterValidationService.cs b/Kemkas.Web/Services/FirstEdition/Character/CharacterValidationService.cs similarity index 59% rename from Kemkas.Web/Services/Character/CharacterValidationService.cs rename to Kemkas.Web/Services/FirstEdition/Character/CharacterValidationService.cs index 9bfb5aa..9f35636 100644 --- a/Kemkas.Web/Services/Character/CharacterValidationService.cs +++ b/Kemkas.Web/Services/FirstEdition/Character/CharacterValidationService.cs @@ -1,15 +1,15 @@ using Kemkas.Web.ViewModels; -namespace Kemkas.Web.Services.Character; +namespace Kemkas.Web.Services.FirstEdition.Character; public interface ICharacterValidationService { - public string? Validate(CharacterDto dto); + public string? Validate(Character1eDto dto); } public class CharacterValidationService : ICharacterValidationService { - public string? Validate(CharacterDto dto) + public string? Validate(Character1eDto dto) { // TODO: add validation!! return null; diff --git a/Kemkas.Web/Services/SecondEdition/Character/Character2EDtoToDbModelService.cs b/Kemkas.Web/Services/SecondEdition/Character/Character2EDtoToDbModelService.cs new file mode 100644 index 0000000..1f67a8a --- /dev/null +++ b/Kemkas.Web/Services/SecondEdition/Character/Character2EDtoToDbModelService.cs @@ -0,0 +1,82 @@ +using Kemkas.Web.Db.Enums; +using Kemkas.Web.Db.Models; +using Kemkas.Web.ViewModels; + +namespace Kemkas.Web.Services.SecondEdition.Character; + +public interface ICharacter2EDtoToDbModelService +{ + public V2Karakter Convert(Character2eDto dto); + + public void Update(V2Karakter original, Character2eDto dto); +} + +public class Character1EDtoToDbModelService : ICharacter2EDtoToDbModelService +{ + public V2Karakter Convert(Character2eDto dto) + { + var karakter = new V2Karakter + { + Nev = dto.Nev, + Nem = dto.Nem, + Kor = dto.Kor, + Isten = dto.Isten, + Jellem = JellemExtensions.Convert(dto.Jellem), + Faj = FajExtensions.Convert2E(dto.Faj), + Ero = dto.Tulajdonsagok.Ero, + Ugyesseg = dto.Tulajdonsagok.Ugy, + Egeszseg = dto.Tulajdonsagok.Egs, + Intelligencia = dto.Tulajdonsagok.Int, + Bolcsesseg = dto.Tulajdonsagok.Bol, + Karizma = dto.Tulajdonsagok.Kar, + Szint = dto.Szint, + Pajzs = dto.Felszereles.PancelId, + Pancel = dto.Felszereles.PancelId + }; + + karakter.KarakterKepzettsegek = ConvertKarakterKepzettsegek(dto, karakter); + karakter.Felszereles = dto.Felszereles.FegyverIds.Select(x => new V2Felszereles + { + Karakter = karakter, + IsFegyver = true, + TargyId = x, + }).ToList(); + karakter.Szintlepesek = dto.Szintlepesek.Select((x, i) => new V2Szintlepes + { + Karakter = karakter, + Osztaly = OsztalyExtensions.Convert2E(x.Osztaly), + KarakterSzint = (byte)(i + 1), + HpRoll = x.HProll, + FegyverSpecializacio = x.HarcosFegyver ?? x.KalozKritikus, + TulajdonsagNoveles = x.TulajdonsagNoveles == null ? null : TulajdonsagExtensions.Convert(x.TulajdonsagNoveles), + TolvajExtraKepzettseg = x.TolvajExtraKepzettseg == null ? null : KepzettsegExtensions.Convert2E(x.TolvajExtraKepzettseg), + }).ToList(); + + return karakter; + } + + public void Update(V2Karakter original, Character2eDto dto) + { + throw new NotImplementedException(); + } + + private static List ConvertKarakterKepzettsegek(Character2eDto dto, V2Karakter karakter) + { + var kepzettsegek = dto.Kepzettsegek.Select(x => new V2KarakterKepzettseg + { + Karakter = karakter, + IsTolvajKepzettseg = false, + Kepzettseg = KepzettsegExtensions.Convert2E(x), + }).ToList(); + if (dto.Tolvajkepzettsegek != null) + { + kepzettsegek.AddRange(dto.Tolvajkepzettsegek.Select(x => new V2KarakterKepzettseg + { + Karakter = karakter, + IsTolvajKepzettseg = true, + Kepzettseg = KepzettsegExtensions.Convert2E(x), + })); + } + return kepzettsegek; + } +} \ No newline at end of file diff --git a/Kemkas.Web/Services/Shared/CharacterPersistenceService.cs b/Kemkas.Web/Services/Shared/CharacterPersistenceService.cs new file mode 100644 index 0000000..0d9cae2 --- /dev/null +++ b/Kemkas.Web/Services/Shared/CharacterPersistenceService.cs @@ -0,0 +1,147 @@ +using Kemkas.Web.Db; +using Kemkas.Web.Db.Enums; +using Kemkas.Web.Db.Models; +using Kemkas.Web.Services.Identity; +using Kemkas.Web.ViewModels; +using Microsoft.EntityFrameworkCore; + +namespace Kemkas.Web.Services.Shared; + +public interface ICharacterPersistenceService +{ + public Task StoreNewCharacter1E(V1Karakter karakter, bool isPublic = false); + + public Task StoreNewCharacter2E(V2Karakter karakter, bool isPublic = false); + + public Task GetCharacter1EById(Guid id, bool tracking = false); + + public Task GetCharacter2EById(Guid id, bool tracking = false); + + public Task> GetAllCharactersOfUser(); + + public Task UpdateCharacter1E(V1Karakter karakter, bool isPublic = false); + + public Task UpdateCharacter2E(V2Karakter karakter, bool isPublic = false); +} + +public class CharacterPersistenceService( + ApplicationDbContext dbContext, + ICurrentUserService currentUserService + ) : ICharacterPersistenceService +{ + + public async Task StoreNewCharacter1E(V1Karakter karakter, bool isPublic = false) + { + var currentUser = await currentUserService.GetCurrentUser(); + karakter.OwnerUserId = currentUser?.Id; + karakter.Id = Guid.Empty; + karakter.IsPublic = isPublic; + dbContext.Karakterek.Add(karakter); + await dbContext.SaveChangesAsync(); + return karakter.Id; + } + + public async Task StoreNewCharacter2E(V2Karakter karakter, bool isPublic = false) + { + var currentUser = await currentUserService.GetCurrentUser(); + karakter.OwnerUserId = currentUser?.Id; + karakter.Id = Guid.Empty; + karakter.IsPublic = isPublic; + dbContext.Karakterek2E.Add(karakter); + await dbContext.SaveChangesAsync(); + return karakter.Id; + } + + public async Task GetCharacter1EById(Guid id, bool tracking = false) + { + IQueryable queriable = dbContext.Karakterek.Include(x => x.KarakterKepzettsegek) + .Include(x => x.Szintlepesek) + .Include(x => x.Felszereles); + + queriable = tracking ? queriable.AsTracking() : queriable.AsNoTracking(); + + var entity = await queriable + .FirstOrDefaultAsync(x => x.Id == id); + + if (entity?.OwnerUserId is null || entity.IsPublic) + { + return entity; + } + + var currentUser = await currentUserService.GetCurrentUser(); + return entity.OwnerUserId == currentUser?.Id ? entity : null; + } + + public async Task GetCharacter2EById(Guid id, bool tracking = false) + { + IQueryable queriable = dbContext.Karakterek2E.Include(x => x.KarakterKepzettsegek) + .Include(x => x.Szintlepesek) + .Include(x => x.Felszereles); + + queriable = tracking ? queriable.AsTracking() : queriable.AsNoTracking(); + + var entity = await queriable + .FirstOrDefaultAsync(x => x.Id == id); + + if (entity?.OwnerUserId is null || entity.IsPublic) + { + return entity; + } + + var currentUser = await currentUserService.GetCurrentUser(); + return entity.OwnerUserId == currentUser?.Id ? entity : null; + } + + public async Task> GetAllCharactersOfUser() + { + var currentUser = await currentUserService.GetCurrentUser(); + if (currentUser is null) + { + return []; + } + + var characters = await dbContext.Karakterek + .Where(k => k.OwnerUserId == currentUser.Id) + .Select(k => new CharacterListItemDto + { + Id = k.Id, + Name = k.Nev, + Szint = k.Szint, + Faj = k.Faj.Convert(), + Osztaly = k.Osztaly.Convert(), + Edition = "1e" + }) + .ToListAsync(); + + var characters2E = await dbContext.Karakterek2E + .Where(k => k.OwnerUserId == currentUser.Id) + .Select(k => new CharacterListItemDto + { + Id = k.Id, + Name = k.Nev, + Szint = k.Szint, + Faj = k.Faj.Convert(), + Osztaly = "TODO!", // TODO: support for multiclass characters + Edition = "2e" + }) + .ToListAsync(); + + characters.AddRange(characters2E); + + return characters; + } + + public async Task UpdateCharacter1E(V1Karakter karakter, bool isPublic = false) + { + karakter.IsPublic = isPublic; + dbContext.Karakterek.Attach(karakter); + await dbContext.SaveChangesAsync(); + } + + public async Task UpdateCharacter2E(V2Karakter karakter, bool isPublic = false) + { + karakter.IsPublic = isPublic; + dbContext.Karakterek2E.Attach(karakter); + await dbContext.SaveChangesAsync(); + } +} \ No newline at end of file diff --git a/Kemkas.Web/ViewModels/CharacterDto.cs b/Kemkas.Web/ViewModels/Character1eDto.cs similarity index 98% rename from Kemkas.Web/ViewModels/CharacterDto.cs rename to Kemkas.Web/ViewModels/Character1eDto.cs index cbaa420..6e2ef60 100644 --- a/Kemkas.Web/ViewModels/CharacterDto.cs +++ b/Kemkas.Web/ViewModels/Character1eDto.cs @@ -3,7 +3,7 @@ using System.Text.Json.Serialization; namespace Kemkas.Web.ViewModels; -public struct CharacterDto +public struct Character1eDto { [Required] [JsonPropertyName("name")] diff --git a/Kemkas.Web/ViewModels/Character2eDto.cs b/Kemkas.Web/ViewModels/Character2eDto.cs new file mode 100644 index 0000000..60cd3f9 --- /dev/null +++ b/Kemkas.Web/ViewModels/Character2eDto.cs @@ -0,0 +1,46 @@ +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; + +namespace Kemkas.Web.ViewModels; + +public struct Character2eDto +{ + [Required] + [JsonPropertyName("nev")] + public string Nev { get; set; } + + [JsonPropertyName("nem")] + public string? Nem { get; set; } + + [JsonPropertyName("kor")] + public double? Kor { get; set; } + + [JsonPropertyName("jellem")] + public string Jellem { get; set; } + + [JsonPropertyName("isten")] + public string? Isten { get; set; } + + [JsonPropertyName("faj")] + public string Faj { get; set; } + + [JsonPropertyName("tulajdonsagok")] + public KarakterTulajdonsagokDto Tulajdonsagok { get; set; } + + [JsonPropertyName("kepzettsegek")] + public IList Kepzettsegek { get; set; } + + [JsonPropertyName("tolvajkepzettsegek")] + public IList? Tolvajkepzettsegek { get; set; } + + [JsonPropertyName("szint")] + public byte Szint { get; set; } + + [JsonPropertyName("szintlepesek")] + public IList Szintlepesek { get; set; } + + [JsonPropertyName("felszereles")] + public KarakterFelszerelesDto Felszereles { get; set; } + + public bool? IsPublic { get; set; } +} \ No newline at end of file diff --git a/Kemkas.Web/ViewModels/KarakterFelszerelesDto.cs b/Kemkas.Web/ViewModels/KarakterFelszerelesDto.cs index fc58b57..702534e 100644 --- a/Kemkas.Web/ViewModels/KarakterFelszerelesDto.cs +++ b/Kemkas.Web/ViewModels/KarakterFelszerelesDto.cs @@ -2,6 +2,9 @@ using System.Text.Json.Serialization; namespace Kemkas.Web.ViewModels; +/// +/// currently the same for 1st edition and 2nd edition, be cautious! +/// public struct KarakterFelszerelesDto { [JsonPropertyName("pancelID")] diff --git a/Kemkas.Web/ViewModels/KarakterTulajdonsagokDto.cs b/Kemkas.Web/ViewModels/KarakterTulajdonsagokDto.cs index ea27e44..d8c8503 100644 --- a/Kemkas.Web/ViewModels/KarakterTulajdonsagokDto.cs +++ b/Kemkas.Web/ViewModels/KarakterTulajdonsagokDto.cs @@ -2,6 +2,9 @@ using System.Text.Json.Serialization; namespace Kemkas.Web.ViewModels; +/// +/// currently the same for 1st edition and 2nd edition, be cautious! +/// public struct KarakterTulajdonsagokDto { [JsonPropertyName("t_ero")] diff --git a/Kemkas.Web/ViewModels/Szintlepes.cs b/Kemkas.Web/ViewModels/Szintlepes.cs new file mode 100644 index 0000000..2f2e451 --- /dev/null +++ b/Kemkas.Web/ViewModels/Szintlepes.cs @@ -0,0 +1,24 @@ +using System.Text.Json.Serialization; + +namespace Kemkas.Web.ViewModels; + +public struct Szintlepes +{ + [JsonPropertyName("osztaly")] + public string Osztaly { get; set; } + + [JsonPropertyName("HProll")] + public byte HProll { get; set; } + + [JsonPropertyName("tolvajExtraKepzettseg")] + public string? TolvajExtraKepzettseg { get; set; } + + [JsonPropertyName("harcosFegyver")] + public string? HarcosFegyver { get; set; } + + [JsonPropertyName("kalozKritikus")] + public string? KalozKritikus { get; set; } + + [JsonPropertyName("tulajdonsagNoveles")] + public string? TulajdonsagNoveles { get; set; } +} \ No newline at end of file diff --git a/Kemkas.Web/ViewModels/WeatherForecast.cs b/Kemkas.Web/ViewModels/WeatherForecast.cs deleted file mode 100644 index 3a7b8e2..0000000 --- a/Kemkas.Web/ViewModels/WeatherForecast.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Kemkas.Web.ViewModels; - -public class WeatherForecast -{ - public DateOnly Date { get; set; } - - public int TemperatureC { get; set; } - - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - - public string? Summary { get; set; } -} diff --git a/Kemkas.Web/frontend/src/App.tsx b/Kemkas.Web/frontend/src/App.tsx index 9816d8d..877e027 100644 --- a/Kemkas.Web/frontend/src/App.tsx +++ b/Kemkas.Web/frontend/src/App.tsx @@ -62,7 +62,7 @@ function App(props: {faro?: Faro}) { { path: "/1e/karakter/:id", element: , - loader: args => fetch(`${window.location.origin}/api/Character/${args.params.id}`), + loader: args => fetch(`${window.location.origin}/api/Character1E/${args.params.id}`), ErrorBoundary: ErrorBoundary, }, { @@ -77,7 +77,7 @@ function App(props: {faro?: Faro}) { { path: "/2e/karakter/:id", element: , - loader: args => fetch(`${window.location.origin}/api/Character/${args.params.id}`), + loader: args => fetch(`${window.location.origin}/api/Character2E/${args.params.id}`), ErrorBoundary: ErrorBoundary, }, ]); diff --git a/Kemkas.Web/frontend/src/first-edition/api/character.api.ts b/Kemkas.Web/frontend/src/first-edition/api/character.api.ts index 4c221fc..596ddbe 100644 --- a/Kemkas.Web/frontend/src/first-edition/api/character.api.ts +++ b/Kemkas.Web/frontend/src/first-edition/api/character.api.ts @@ -2,7 +2,7 @@ import {KarakterInputs} from "../domain-models/karakter"; import axios from "axios"; export async function StoreNewCharacter(karakter: KarakterInputs, isPublic: boolean = false) { - let response = await axios.post(`${window.location.origin}/api/Character/`, karakter, { + let response = await axios.post(`${window.location.origin}/api/Character1E/`, karakter, { withCredentials: true, params: { isPublic, @@ -17,7 +17,7 @@ export async function StoreNewCharacter(karakter: KarakterInputs, isPublic: bool } export async function UpdateCharacter(id: string, karakter: KarakterInputs, isPublic: boolean = false) { - let response = await axios.post(`${window.location.origin}/api/Character/${id}`, karakter, { + let response = await axios.post(`${window.location.origin}/api/Character1E/${id}`, karakter, { withCredentials: true, params: { isPublic, diff --git a/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx b/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx index 75c221e..87aa656 100644 --- a/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx +++ b/Kemkas.Web/frontend/src/second-edition/pages/CreateCharacter2E.tsx @@ -59,7 +59,7 @@ function CreateCharacter2E(props: {}) { setKarakter({...karakter, name: e.target.value})}/> + onChange={(e) => setKarakter({...karakter, nev: e.target.value})}/> {!karakter.nev && A karaktered nem mászkálhat névtelenül a világban!}