Compare commits

...

3 Commits

Author SHA1 Message Date
morbalint 636dcb92b3 feat 2e save to DB
not fully tested, but seems to work overall
2024-02-20 14:55:08 +01:00
morbalint 41e894cd42 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!
2024-02-14 17:34:20 +01:00
morbalint 8b3fa2fefa rename name to nev 2024-02-14 12:03:53 +01:00
44 changed files with 2340 additions and 393 deletions
@@ -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;
/// <summary>
/// First edition character endpoints
/// </summary>
/// <param name="validationService"></param>
/// <param name="dtoToDbModelService"></param>
/// <param name="dbModelToDto1EService"></param>
/// <param name="persistenceService"></param>
[ApiController]
[Route("[controller]")]
public class Character1EController(
ICharacterValidationService validationService,
ICharacter1EDtoToDbModelService dtoToDbModelService,
ICharacterDbModelToDto1EService dbModelToDto1EService,
ICharacterPersistenceService persistenceService)
: ControllerBase
{
[HttpPost]
public async Task<ActionResult<Guid>> 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<ActionResult<Character1eDto>> GetCharacterById([FromRoute] Guid id)
{
var entity = await persistenceService.GetCharacter1EById(id);
if (entity is null)
{
return NotFound();
}
return dbModelToDto1EService.Convert(entity);
}
[HttpPost("{id:guid}")]
public async Task<ActionResult<Guid>> 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;
}
}
@@ -0,0 +1,89 @@
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,
ICharacterDbModelToDto2EService dbModelToDtoService
) : ControllerBase
{
[HttpPost]
public async Task<ActionResult<Guid>> 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;
}
[HttpGet("{id:guid}")]
public async Task<ActionResult<Character2eDto>> GetCharacterById([FromRoute] Guid id)
{
var entity = await persistenceService.GetCharacter2EById(id);
if (entity is null)
{
return NotFound();
}
return dbModelToDtoService.Convert(entity);
}
[HttpPost("{id:guid}")]
public async Task<ActionResult<Guid>> UpdateCharacter([FromRoute] Guid id, [FromBody] Character2eDto 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.GetCharacter2EById(id, tracking: true);
if (original is null)
{
return NotFound();
}
try
{
dtoToDbModelService.Update(original, dto);
}
catch (ValidationException ex)
{
return BadRequest(ex.Message);
}
await persistenceService.UpdateCharacter2E(original, isPublic);
return id;
}
}
+7 -73
View File
@@ -1,85 +1,19 @@
using System.ComponentModel.DataAnnotations; using Kemkas.Web.Services.FirstEdition.Character;
using Kemkas.Web.Db.Models; using Kemkas.Web.Services.Shared;
using Kemkas.Web.Services.Character;
using Kemkas.Web.ViewModels; using Kemkas.Web.ViewModels;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace Kemkas.Web.Controllers; namespace Kemkas.Web.Controllers;
/// <summary>
/// Shared first and second edition character endpoints
/// </summary>
/// <param name="persistenceService"></param>
[ApiController] [ApiController]
[Route("[controller]")] [Route("[controller]")]
public class CharacterController( public class CharacterController(ICharacterPersistenceService persistenceService) : ControllerBase
ICharacterValidationService validationService,
ICharacterDtoToDbModelService dtoToDbModelService,
ICharacterDbModelToDtoService dbModelToDtoService,
ICharacterPersistenceService persistenceService)
: ControllerBase
{ {
[HttpPost]
public async Task<ActionResult<Guid>> 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<ActionResult<CharacterDto>> 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<ActionResult<Guid>> 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] [HttpGet]
[Authorize] [Authorize]
public async Task<List<CharacterListItemDto>> GetAllCharacters() public async Task<List<CharacterListItemDto>> GetAllCharacters()
@@ -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<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> 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();
}
}
+11
View File
@@ -13,6 +13,8 @@ public class ApplicationDbContext : IdentityDbContext<ApplicationUser, Applicati
public DbSet<DataProtectionKey> DataProtectionKeys { get; set; } public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }
// 1st edition character
public DbSet<V1Karakter> Karakterek { get; set; } public DbSet<V1Karakter> Karakterek { get; set; }
public DbSet<V1KarakterKepzettseg> KarakterKepzettsegek { get; set; } public DbSet<V1KarakterKepzettseg> KarakterKepzettsegek { get; set; }
@@ -21,4 +23,13 @@ public class ApplicationDbContext : IdentityDbContext<ApplicationUser, Applicati
public DbSet<V1Felszereles> Felszerelesek { get; set; } public DbSet<V1Felszereles> Felszerelesek { get; set; }
// 2nd edition character
public DbSet<V2Karakter> Karakterek2E { get; set; }
public DbSet<V2KarakterKepzettseg> KarakterKepzettsegek2E { get; set; }
public DbSet<V2Szintlepes> Szintlepesek2E { get; set; }
public DbSet<V2Felszereles> Felszerelesek2E { get; set; }
} }
+18 -1
View File
@@ -1,6 +1,6 @@
namespace Kemkas.Web.Db.Enums; namespace Kemkas.Web.Db.Enums;
public enum Faj public enum Faj1E
{ {
Ember = 0, Ember = 0,
Amazon = 1, Amazon = 1,
@@ -15,3 +15,20 @@ public enum Faj
Gnom = 10, Gnom = 10,
Torpe = 11, Torpe = 11,
} }
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,
}
+66 -26
View File
@@ -2,42 +2,82 @@ namespace Kemkas.Web.Db.Enums;
public static class FajExtensions public static class FajExtensions
{ {
public static Faj Convert(string faj) public static Faj1E Convert1E(string faj)
{ {
return faj switch return faj switch
{ {
"f_ember" => Faj.Ember, "f_ember" => Faj1E.Ember,
"f_amazon" => Faj.Amazon, "f_amazon" => Faj1E.Amazon,
"f_birodalmi" => Faj.Birodalmi, "f_birodalmi" => Faj1E.Birodalmi,
"f_etuniai" => Faj.Etuniai, "f_etuniai" => Faj1E.Etuniai,
"f_eszaki" => Faj.Eszaki, "f_eszaki" => Faj1E.Eszaki,
"f_osember" => Faj.Osember, "f_osember" => Faj1E.Osember,
"f_elf" => Faj.Elf, "f_elf" => Faj1E.Elf,
"f_felelf" => Faj.Felelf, "f_felelf" => Faj1E.Felelf,
"f_felork" => Faj.Felork, "f_felork" => Faj1E.Felork,
"f_felszerzet" => Faj.Felszerzet, "f_felszerzet" => Faj1E.Felszerzet,
"f_gnom" => Faj.Gnom, "f_gnom" => Faj1E.Gnom,
"f_torpe" => Faj.Torpe, "f_torpe" => Faj1E.Torpe,
_ => throw new Exception("invalid faj: " + faj) _ => throw new Exception("invalid faj: " + faj)
}; };
} }
public static string Convert(this Faj faj) public static Faj2E Convert2E(string faj)
{ {
return faj switch return faj switch
{ {
Faj.Ember => "f_ember", "f_2e_ember" => Faj2E.Ember,
Faj.Amazon => "f_amazon", "f_2e_amazon" => Faj2E.Amazon,
Faj.Birodalmi => "f_birodalmi", "f_2e_birodalmi" => Faj2E.Birodalmi,
Faj.Etuniai => "f_etuniai", "f_2e_nomad" => Faj2E.Nomad,
Faj.Eszaki => "f_eszaki", "f_2e_eszaki" => Faj2E.Eszaki,
Faj.Osember => "f_osember", "f_2e_osember" => Faj2E.Osember,
Faj.Elf => "f_elf", "f_2e_elf" => Faj2E.Elf,
Faj.Felelf => "f_felelf", "f_2e_felelf" => Faj2E.Felelf,
Faj.Felork => "f_felork", "f_2e_felork" => Faj2E.Felork,
Faj.Felszerzet => "f_felszerzet", "f_2e_felszerzet" => Faj2E.Felszerzet,
Faj.Gnom => "f_gnom", "f_2e_gnom" => Faj2E.Gnom,
Faj.Torpe => "f_torpe", "f_2e_torpe" => Faj2E.Torpe,
_ => throw new Exception("invalid faj: " + faj)
};
}
public static string Convert(this Faj1E faj)
{
return faj switch
{
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) _ => throw new Exception("invalid faj: " + faj)
}; };
} }
+37 -1
View File
@@ -1,6 +1,6 @@
namespace Kemkas.Web.Db.Enums; namespace Kemkas.Web.Db.Enums;
public enum Kepzettseg public enum Kepzettseg1E
{ {
Alkimia = 1, Alkimia = 1,
Alcazas = 2, Alcazas = 2,
@@ -32,3 +32,39 @@ public enum Kepzettseg
Zarnyitas = 28, Zarnyitas = 28,
Zsebmetszes = 29, 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,
}
+134 -60
View File
@@ -4,76 +4,150 @@ namespace Kemkas.Web.Db.Enums;
public static class KepzettsegExtensions public static class KepzettsegExtensions
{ {
public static Kepzettseg Convert(string kepzettseg) public static Kepzettseg1E Convert1E(string kepzettseg)
{ {
return kepzettseg switch return kepzettseg switch
{ {
"k_alkimia" => Kepzettseg.Alkimia, "k_alkimia" => Kepzettseg1E.Alkimia,
"k_alcazas" => Kepzettseg.Alcazas, "k_alcazas" => Kepzettseg1E.Alcazas,
"k_allatidomitas" => Kepzettseg.Allatidomitas, "k_allatidomitas" => Kepzettseg1E.Allatidomitas,
"k_csapdak" => Kepzettseg.Csapdak, "k_csapdak" => Kepzettseg1E.Csapdak,
"k_csillagjoslas" => Kepzettseg.Csillagjoslas, "k_csillagjoslas" => Kepzettseg1E.Csillagjoslas,
"k_egyensulyozas" => Kepzettseg.Egyensulyozas, "k_egyensulyozas" => Kepzettseg1E.Egyensulyozas,
"k_eloadas" => Kepzettseg.Eloadas, "k_eloadas" => Kepzettseg1E.Eloadas,
"k_ertekbecsles" => Kepzettseg.Ertekbecsles, "k_ertekbecsles" => Kepzettseg1E.Ertekbecsles,
"k_gyogyitas" => Kepzettseg.Gyogyitas, "k_gyogyitas" => Kepzettseg1E.Gyogyitas,
"k_hajozas" => Kepzettseg.Hajozas, "k_hajozas" => Kepzettseg1E.Hajozas,
"k_hallgatozas" => Kepzettseg.Hallgatozas, "k_hallgatozas" => Kepzettseg1E.Hallgatozas,
"k_hamisitas" => Kepzettseg.Hamisitas, "k_hamisitas" => Kepzettseg1E.Hamisitas,
"k_jelek_olvasasa" => Kepzettseg.JelekOlvasasa, "k_jelek_olvasasa" => Kepzettseg1E.JelekOlvasasa,
"k_koncentracio" => Kepzettseg.Koncentracio, "k_koncentracio" => Kepzettseg1E.Koncentracio,
"k_lovaglas" => Kepzettseg.Lovaglas, "k_lovaglas" => Kepzettseg1E.Lovaglas,
"k_maszas" => Kepzettseg.Maszas, "k_maszas" => Kepzettseg1E.Maszas,
"k_megfigyeles" => Kepzettseg.Megfigyeles, "k_megfigyeles" => Kepzettseg1E.Megfigyeles,
"k_meregkeveres" => Kepzettseg.Meregkeveres, "k_meregkeveres" => Kepzettseg1E.Meregkeveres,
"k_mesterseg" => Kepzettseg.Mesterseg, "k_mesterseg" => Kepzettseg1E.Mesterseg,
"k_nyomkereses" => Kepzettseg.Nyomkereses, "k_nyomkereses" => Kepzettseg1E.Nyomkereses,
"k_osonas" => Kepzettseg.Osonas, "k_osonas" => Kepzettseg1E.Osonas,
"k_rejtozes" => Kepzettseg.Rejtozes, "k_rejtozes" => Kepzettseg1E.Rejtozes,
"k_szabadulomuveszet" => Kepzettseg.Szabadulomuveszet, "k_szabadulomuveszet" => Kepzettseg1E.Szabadulomuveszet,
"k_tudas" => Kepzettseg.Tudas, "k_tudas" => Kepzettseg1E.Tudas,
"k_ugras" => Kepzettseg.Ugras, "k_ugras" => Kepzettseg1E.Ugras,
"k_uszas" => Kepzettseg.Uszas, "k_uszas" => Kepzettseg1E.Uszas,
"k_varazslatismeret" => Kepzettseg.Varazslatismeret, "k_varazslatismeret" => Kepzettseg1E.Varazslatismeret,
"k_zarnyitas" => Kepzettseg.Zarnyitas, "k_zarnyitas" => Kepzettseg1E.Zarnyitas,
"k_zsebmetszes" => Kepzettseg.Zsebmetszes, "k_zsebmetszes" => Kepzettseg1E.Zsebmetszes,
_ => throw new ValidationException("invalid kepzettseg: " + kepzettseg), _ => throw new ValidationException("invalid kepzettseg: " + kepzettseg),
}; };
} }
public static string Convert(this Kepzettseg kepzettseg) public static Kepzettseg2E Convert2E(string kepzettseg)
{ {
return kepzettseg switch return kepzettseg switch
{ {
Kepzettseg.Alkimia => "k_alkimia", "k_alkimia" => Kepzettseg2E.Alkimia,
Kepzettseg.Alcazas => "k_alcazas", "k_alcazas" => Kepzettseg2E.Alcazas,
Kepzettseg.Allatidomitas => "k_allatidomitas", "k_allatidomitas" => Kepzettseg2E.Allatidomitas,
Kepzettseg.Csapdak => "k_csapdak", "k_csapdak" => Kepzettseg2E.Csapdak,
Kepzettseg.Csillagjoslas => "k_csillagjoslas", "k_csillagjoslas" => Kepzettseg2E.Csillagjoslas,
Kepzettseg.Egyensulyozas => "k_egyensulyozas", "k_egyensulyozas" => Kepzettseg2E.Egyensulyozas,
Kepzettseg.Eloadas => "k_eloadas", "k_eloadas" => Kepzettseg2E.Eloadas,
Kepzettseg.Ertekbecsles => "k_ertekbecsles", "k_ertekbecsles" => Kepzettseg2E.Ertekbecsles,
Kepzettseg.Gyogyitas => "k_gyogyitas", "k_gyogyitas" => Kepzettseg2E.Gyogyitas,
Kepzettseg.Hajozas => "k_hajozas", "k_hajozas" => Kepzettseg2E.Hajozas,
Kepzettseg.Hallgatozas => "k_hallgatozas", "k_hallgatozas" => Kepzettseg2E.Hallgatozas,
Kepzettseg.Hamisitas => "k_hamisitas", "k_hamisitas" => Kepzettseg2E.Hamisitas,
Kepzettseg.JelekOlvasasa => "k_jelek_olvasasa", "k_herbalizmus" => Kepzettseg2E.Herbalizmus,
Kepzettseg.Koncentracio => "k_koncentracio", "k_historia" => Kepzettseg2E.Historia,
Kepzettseg.Lovaglas => "k_lovaglas", "k_jelek_olvasasa" => Kepzettseg2E.JelekOlvasasa,
Kepzettseg.Maszas => "k_maszas", "k_lovaglas" => Kepzettseg2E.Lovaglas,
Kepzettseg.Megfigyeles => "k_megfigyeles", "k_maszas" => Kepzettseg2E.Maszas,
Kepzettseg.Meregkeveres => "k_meregkeveres", "k_megfigyeles" => Kepzettseg2E.Megfigyeles,
Kepzettseg.Mesterseg => "k_mesterseg", "k_meregkeveres" => Kepzettseg2E.Meregkeveres,
Kepzettseg.Nyomkereses => "k_nyomkereses", "k_mesterseg" => Kepzettseg2E.Mesterseg,
Kepzettseg.Osonas => "k_osonas", "k_nyomkereses" => Kepzettseg2E.Nyomkereses,
Kepzettseg.Rejtozes => "k_rejtozes", "k_okkultizmus" => Kepzettseg2E.Okkultizmus,
Kepzettseg.Szabadulomuveszet => "k_szabadulomuveszet", "k_osonas" => Kepzettseg2E.Osonas,
Kepzettseg.Tudas => "k_tudas", "k_szabadulomuveszet" => Kepzettseg2E.Szabadulomuveszet,
Kepzettseg.Ugras => "k_ugras", "k_ugras" => Kepzettseg2E.Ugras,
Kepzettseg.Uszas => "k_uszas", "k_uszas" => Kepzettseg2E.Uszas,
Kepzettseg.Varazslatismeret => "k_varazslatismeret", "k_vadonjaras" => Kepzettseg2E.Vadonjaras,
Kepzettseg.Zarnyitas => "k_zarnyitas", "k_zarnyitas" => Kepzettseg2E.Zarnyitas,
Kepzettseg.Zsebmetszes => "k_zsebmetszes", "k_zsebmetszes" => Kepzettseg2E.Zsebmetszes,
_ => throw new ValidationException("invalid kepzettseg: " + kepzettseg),
};
}
public static string Convert(this Kepzettseg1E kepzettseg)
{
return kepzettseg switch
{
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), _ => throw new ValidationException("invalid kepzettseg: " + kepzettseg),
}; };
} }
+18 -1
View File
@@ -1,6 +1,6 @@
namespace Kemkas.Web.Db.Enums; namespace Kemkas.Web.Db.Enums;
public enum Osztaly public enum Osztaly1E
{ {
Error = 0, // for unset enum value mapping Error = 0, // for unset enum value mapping
Harcos = 1, Harcos = 1,
@@ -13,3 +13,20 @@ public enum Osztaly
Varazslo = 8, Varazslo = 8,
Illuzionista = 9, Illuzionista = 9,
} }
public enum Osztaly2E
{
Error = 0, // for unset enum value mapping
Harcos = 1,
Ijasz = 2,
Amazon = 3,
Tengeresz = 4,
Barbar = 5,
Pap = 6,
Tolvaj = 7,
Varazslo = 8,
Illuzionista = 9,
Dalnok = 10,
Druida = 11,
Vandor = 12,
}
+60 -20
View File
@@ -4,36 +4,76 @@ namespace Kemkas.Web.Db.Enums;
public static class OsztalyExtensions public static class OsztalyExtensions
{ {
public static Osztaly Convert(string osztaly) public static Osztaly1E Convert1E(string osztaly)
{ {
return osztaly switch return osztaly switch
{ {
"o_harcos" => Osztaly.Harcos, "o_harcos" => Osztaly1E.Harcos,
"o_ijasz" => Osztaly.Ijasz, "o_ijasz" => Osztaly1E.Ijasz,
"o_amazon" => Osztaly.Amazon, "o_amazon" => Osztaly1E.Amazon,
"o_kaloz" => Osztaly.Kaloz, "o_kaloz" => Osztaly1E.Kaloz,
"o_barbar" => Osztaly.Barbar, "o_barbar" => Osztaly1E.Barbar,
"o_pap" => Osztaly.Pap, "o_pap" => Osztaly1E.Pap,
"o_tolvaj" => Osztaly.Tolvaj, "o_tolvaj" => Osztaly1E.Tolvaj,
"o_varazslo" => Osztaly.Varazslo, "o_varazslo" => Osztaly1E.Varazslo,
"o_illuzionista" => Osztaly.Illuzionista, "o_illuzionista" => Osztaly1E.Illuzionista,
_ => throw new ValidationException("unknown osztaly: " + osztaly) _ => throw new ValidationException("unknown osztaly: " + osztaly)
}; };
} }
public static string Convert(this Osztaly osztaly) public static Osztaly2E Convert2E(string osztaly)
{ {
return osztaly switch return osztaly switch
{ {
Osztaly.Harcos => "o_harcos", "o_2e_harcos" => Osztaly2E.Harcos,
Osztaly.Ijasz => "o_ijasz", "o_2e_ijasz" => Osztaly2E.Ijasz,
Osztaly.Amazon => "o_amazon", "o_2e_amazon" => Osztaly2E.Amazon,
Osztaly.Kaloz => "o_kaloz", "o_2e_tengeresz" => Osztaly2E.Tengeresz,
Osztaly.Barbar => "o_barbar", "o_2e_barbar" => Osztaly2E.Barbar,
Osztaly.Pap => "o_pap", "o_2e_pap" => Osztaly2E.Pap,
Osztaly.Tolvaj => "o_tolvaj", "o_2e_tolvaj" => Osztaly2E.Tolvaj,
Osztaly.Varazslo => "o_varazslo", "o_2e_varazslo" => Osztaly2E.Varazslo,
Osztaly.Illuzionista => "o_illuzionista", "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.Tengeresz => "o_2e_tengeresz",
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!") _ => throw new ValidationException("invalid osztaly!")
}; };
} }
@@ -0,0 +1,690 @@
// <auto-generated />
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
{
/// <inheritdoc />
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<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Name")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("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<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("AccessFailedCount")
.HasColumnType("integer");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("text");
b.Property<string>("Email")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("EmailConfirmed")
.HasColumnType("boolean");
b.Property<bool>("LockoutEnabled")
.HasColumnType("boolean");
b.Property<DateTimeOffset?>("LockoutEnd")
.HasColumnType("timestamp with time zone");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("NormalizedUserName")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("PasswordHash")
.HasColumnType("text");
b.Property<string>("PhoneNumber")
.HasColumnType("text");
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("boolean");
b.Property<string>("SecurityStamp")
.HasColumnType("text");
b.Property<bool>("TwoFactorEnabled")
.HasColumnType("boolean");
b.Property<string>("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<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<bool>("IsFegyver")
.HasColumnType("boolean");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("Felszerelesek");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V1Karakter", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<byte>("Bolcsesseg")
.HasColumnType("smallint");
b.Property<byte>("Egeszseg")
.HasColumnType("smallint");
b.Property<byte>("Ero")
.HasColumnType("smallint");
b.Property<int>("Faj")
.HasColumnType("integer");
b.Property<byte>("Intelligencia")
.HasColumnType("smallint");
b.Property<bool>("IsPublic")
.HasColumnType("boolean");
b.Property<string>("Isten")
.HasColumnType("text");
b.Property<byte>("Jellem")
.HasColumnType("smallint");
b.Property<byte>("Karizma")
.HasColumnType("smallint");
b.Property<double?>("Kor")
.HasColumnType("double precision");
b.Property<string>("Nem")
.HasColumnType("text");
b.Property<string>("Nev")
.IsRequired()
.HasColumnType("text");
b.Property<int>("Osztaly")
.HasColumnType("integer");
b.Property<int?>("OwnerUserId")
.HasColumnType("integer");
b.Property<string>("Pajzs")
.HasColumnType("text");
b.Property<string>("Pancel")
.HasColumnType("text");
b.Property<byte>("Szint")
.HasColumnType("smallint");
b.Property<byte>("Ugyesseg")
.HasColumnType("smallint");
b.HasKey("Id");
b.HasIndex("OwnerUserId");
b.ToTable("Karakterek");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V1KarakterKepzettseg", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<bool>("IsTolvajKepzettseg")
.HasColumnType("boolean");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<int>("Kepzettseg")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("KarakterKepzettsegek");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V1Szintlepes", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("FegyverSpecializacio")
.HasColumnType("text");
b.Property<byte>("HpRoll")
.HasColumnType("smallint");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<byte>("KarakterSzint")
.HasColumnType("smallint");
b.Property<byte?>("TulajdonsagNoveles")
.HasColumnType("smallint");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("Szintlepesek");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V2Felszereles", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<bool>("IsFegyver")
.HasColumnType("boolean");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<string>("TargyId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("Felszerelesek2E");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V2Karakter", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<byte>("Bolcsesseg")
.HasColumnType("smallint");
b.Property<byte>("Egeszseg")
.HasColumnType("smallint");
b.Property<byte>("Ero")
.HasColumnType("smallint");
b.Property<int>("Faj")
.HasColumnType("integer");
b.Property<byte>("Intelligencia")
.HasColumnType("smallint");
b.Property<bool>("IsPublic")
.HasColumnType("boolean");
b.Property<string>("Isten")
.HasColumnType("text");
b.Property<byte>("Jellem")
.HasColumnType("smallint");
b.Property<byte>("Karizma")
.HasColumnType("smallint");
b.Property<double?>("Kor")
.HasColumnType("double precision");
b.Property<string>("Nem")
.HasColumnType("text");
b.Property<string>("Nev")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("OwnerUserId")
.HasColumnType("integer");
b.Property<string>("Pajzs")
.HasColumnType("text");
b.Property<string>("Pancel")
.HasColumnType("text");
b.Property<byte>("Szint")
.HasColumnType("smallint");
b.Property<byte>("Ugyesseg")
.HasColumnType("smallint");
b.HasKey("Id");
b.HasIndex("OwnerUserId");
b.ToTable("Karakterek2E");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V2KarakterKepzettseg", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<bool>("IsTolvajKepzettseg")
.HasColumnType("boolean");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<int>("Kepzettseg")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("KarakterKepzettsegek2E");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V2Szintlepes", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("FegyverSpecializacio")
.HasColumnType("text");
b.Property<byte>("HpRoll")
.HasColumnType("smallint");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<byte>("KarakterSzint")
.HasColumnType("smallint");
b.Property<int>("Osztaly")
.HasColumnType("integer");
b.Property<int?>("TolvajExtraKepzettseg")
.HasColumnType("integer");
b.Property<byte?>("TulajdonsagNoveles")
.HasColumnType("smallint");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("Szintlepesek2E");
});
modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FriendlyName")
.HasColumnType("text");
b.Property<string>("Xml")
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("DataProtectionKeys");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<int>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<int>("RoleId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<int>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("ClaimType")
.HasColumnType("text");
b.Property<string>("ClaimValue")
.HasColumnType("text");
b.Property<int>("UserId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<int>", b =>
{
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("ProviderDisplayName")
.HasColumnType("text");
b.Property<int>("UserId")
.HasColumnType("integer");
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<int>", b =>
{
b.Property<int>("UserId")
.HasColumnType("integer");
b.Property<int>("RoleId")
.HasColumnType("integer");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles", (string)null);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<int>", b =>
{
b.Property<int>("UserId")
.HasColumnType("integer");
b.Property<string>("LoginProvider")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("Name")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("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<int>", b =>
{
b.HasOne("Kemkas.Web.Db.Models.ApplicationRole", null)
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<int>", b =>
{
b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<int>", b =>
{
b.HasOne("Kemkas.Web.Db.Models.ApplicationUser", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<int>", 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<int>", 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
}
}
}
@@ -0,0 +1,148 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Kemkas.Web.Db.Migrations
{
/// <inheritdoc />
public partial class AddSecondEditionModels : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Karakterek2E",
columns: table => new
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
IsPublic = table.Column<bool>(type: "boolean", nullable: false),
OwnerUserId = table.Column<int>(type: "integer", nullable: true),
Nev = table.Column<string>(type: "text", nullable: false),
Nem = table.Column<string>(type: "text", nullable: true),
Kor = table.Column<double>(type: "double precision", nullable: true),
Jellem = table.Column<byte>(type: "smallint", nullable: false),
Isten = table.Column<string>(type: "text", nullable: true),
Faj = table.Column<int>(type: "integer", nullable: false),
Ero = table.Column<byte>(type: "smallint", nullable: false),
Ugyesseg = table.Column<byte>(type: "smallint", nullable: false),
Egeszseg = table.Column<byte>(type: "smallint", nullable: false),
Intelligencia = table.Column<byte>(type: "smallint", nullable: false),
Bolcsesseg = table.Column<byte>(type: "smallint", nullable: false),
Karizma = table.Column<byte>(type: "smallint", nullable: false),
Szint = table.Column<byte>(type: "smallint", nullable: false),
Pancel = table.Column<string>(type: "text", nullable: true),
Pajzs = table.Column<string>(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<Guid>(type: "uuid", nullable: false),
KarakterId = table.Column<Guid>(type: "uuid", nullable: false),
TargyId = table.Column<string>(type: "text", nullable: false),
IsFegyver = table.Column<bool>(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<Guid>(type: "uuid", nullable: false),
KarakterId = table.Column<Guid>(type: "uuid", nullable: false),
Kepzettseg = table.Column<int>(type: "integer", nullable: false),
IsTolvajKepzettseg = table.Column<bool>(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<Guid>(type: "uuid", nullable: false),
KarakterId = table.Column<Guid>(type: "uuid", nullable: false),
KarakterSzint = table.Column<byte>(type: "smallint", nullable: false),
Osztaly = table.Column<int>(type: "integer", nullable: false),
HpRoll = table.Column<byte>(type: "smallint", nullable: false),
TulajdonsagNoveles = table.Column<byte>(type: "smallint", nullable: true),
FegyverSpecializacio = table.Column<string>(type: "text", nullable: true),
TolvajExtraKepzettseg = table.Column<int>(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");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Felszerelesek2E");
migrationBuilder.DropTable(
name: "KarakterKepzettsegek2E");
migrationBuilder.DropTable(
name: "Szintlepesek2E");
migrationBuilder.DropTable(
name: "Karakterek2E");
}
}
}
@@ -259,6 +259,150 @@ namespace Kemkas.Web.Db.Migrations
b.ToTable("Szintlepesek"); b.ToTable("Szintlepesek");
}); });
modelBuilder.Entity("Kemkas.Web.Db.Models.V2Felszereles", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<bool>("IsFegyver")
.HasColumnType("boolean");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<string>("TargyId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("Felszerelesek2E");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V2Karakter", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<byte>("Bolcsesseg")
.HasColumnType("smallint");
b.Property<byte>("Egeszseg")
.HasColumnType("smallint");
b.Property<byte>("Ero")
.HasColumnType("smallint");
b.Property<int>("Faj")
.HasColumnType("integer");
b.Property<byte>("Intelligencia")
.HasColumnType("smallint");
b.Property<bool>("IsPublic")
.HasColumnType("boolean");
b.Property<string>("Isten")
.HasColumnType("text");
b.Property<byte>("Jellem")
.HasColumnType("smallint");
b.Property<byte>("Karizma")
.HasColumnType("smallint");
b.Property<double?>("Kor")
.HasColumnType("double precision");
b.Property<string>("Nem")
.HasColumnType("text");
b.Property<string>("Nev")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("OwnerUserId")
.HasColumnType("integer");
b.Property<string>("Pajzs")
.HasColumnType("text");
b.Property<string>("Pancel")
.HasColumnType("text");
b.Property<byte>("Szint")
.HasColumnType("smallint");
b.Property<byte>("Ugyesseg")
.HasColumnType("smallint");
b.HasKey("Id");
b.HasIndex("OwnerUserId");
b.ToTable("Karakterek2E");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V2KarakterKepzettseg", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<bool>("IsTolvajKepzettseg")
.HasColumnType("boolean");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<int>("Kepzettseg")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("KarakterKepzettsegek2E");
});
modelBuilder.Entity("Kemkas.Web.Db.Models.V2Szintlepes", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("FegyverSpecializacio")
.HasColumnType("text");
b.Property<byte>("HpRoll")
.HasColumnType("smallint");
b.Property<Guid>("KarakterId")
.HasColumnType("uuid");
b.Property<byte>("KarakterSzint")
.HasColumnType("smallint");
b.Property<int>("Osztaly")
.HasColumnType("integer");
b.Property<int?>("TolvajExtraKepzettseg")
.HasColumnType("integer");
b.Property<byte?>("TulajdonsagNoveles")
.HasColumnType("smallint");
b.HasKey("Id");
b.HasIndex("KarakterId");
b.ToTable("Szintlepesek2E");
});
modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@@ -427,6 +571,48 @@ namespace Kemkas.Web.Db.Migrations
b.Navigation("Karakter"); 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<int>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<int>", b =>
{ {
b.HasOne("Kemkas.Web.Db.Models.ApplicationRole", null) b.HasOne("Kemkas.Web.Db.Models.ApplicationRole", null)
@@ -486,6 +672,15 @@ namespace Kemkas.Web.Db.Migrations
b.Navigation("Szintlepesek"); 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 #pragma warning restore 612, 618
} }
} }
+5 -2
View File
@@ -4,6 +4,9 @@ using Kemkas.Web.Db.Enums;
namespace Kemkas.Web.Db.Models; namespace Kemkas.Web.Db.Models;
/// <summary>
/// 1st edition character sheet
/// </summary>
public class V1Karakter public class V1Karakter
{ {
[Key] public Guid Id { get; set; } [Key] public Guid Id { get; set; }
@@ -15,8 +18,8 @@ public class V1Karakter
public double? Kor { get; set; } public double? Kor { get; set; }
public Jellem Jellem { get; set; } = Jellem.Semleges; public Jellem Jellem { get; set; } = Jellem.Semleges;
public string? Isten { get; set; } public string? Isten { get; set; }
public Faj Faj { get; set; } = Faj.Ember; public Faj1E Faj { get; set; } = Faj1E.Ember;
public Osztaly Osztaly { get; set; } public Osztaly1E Osztaly { get; set; }
public byte Ero { get; set; } public byte Ero { get; set; }
public byte Ugyesseg { get; set; } public byte Ugyesseg { get; set; }
public byte Egeszseg { get; set; } public byte Egeszseg { get; set; }
+1 -1
View File
@@ -9,7 +9,7 @@ public class V1KarakterKepzettseg
[Key] [Key]
public Guid Id { get; set; } public Guid Id { get; set; }
public Guid KarakterId { get; set; } public Guid KarakterId { get; set; }
public Kepzettseg Kepzettseg { get; set; } public Kepzettseg1E Kepzettseg { get; set; }
public bool IsTolvajKepzettseg { get; set; } = false; public bool IsTolvajKepzettseg { get; set; } = false;
[ForeignKey(nameof(KarakterId))] [ForeignKey(nameof(KarakterId))]
+2
View File
@@ -19,6 +19,8 @@ public class V1Szintlepes
public byte HpRoll { get; set; } public byte HpRoll { get; set; }
public Tulajdonsag? TulajdonsagNoveles { get; set; } public Tulajdonsag? TulajdonsagNoveles { get; set; }
// used for both Kaloz/Tengeresz and Harcos
public string? FegyverSpecializacio { get; set; } public string? FegyverSpecializacio { get; set; }
[ForeignKey(nameof(KarakterId))] [ForeignKey(nameof(KarakterId))]
+17
View File
@@ -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; }
}
+44
View File
@@ -0,0 +1,44 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Kemkas.Web.Db.Enums;
namespace Kemkas.Web.Db.Models;
/// <summary>
/// 2nd edition character sheet
/// </summary>
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<V2KarakterKepzettseg> KarakterKepzettsegek { get; set; }
[InverseProperty(nameof(V2Szintlepes.Karakter))]
public virtual IEnumerable<V2Szintlepes> Szintlepesek { get; set; }
[InverseProperty(nameof(V2Felszereles.Karakter))]
public virtual IEnumerable<V2Felszereles> Felszereles { get; set; }
}
@@ -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; }
}
+29
View File
@@ -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; }
}
+4
View File
@@ -53,6 +53,10 @@
<None Include="$(SpaRoot)**" Exclude="$(SpaRoot)node_modules\**" /> <None Include="$(SpaRoot)**" Exclude="$(SpaRoot)node_modules\**" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Services\FirstEdition\" />
</ItemGroup>
<Target Name="DebugEnsureNodeEnv" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('$(SpaRoot)node_modules') "> <Target Name="DebugEnsureNodeEnv" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('$(SpaRoot)node_modules') ">
<!-- Ensure Node.js is installed --> <!-- Ensure Node.js is installed -->
<Exec Command="node --version" ContinueOnError="true"> <Exec Command="node --version" ContinueOnError="true">
+7 -5
View File
@@ -6,14 +6,15 @@ using Kemkas.Web.Config;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Kemkas.Web.Db; using Kemkas.Web.Db;
using Kemkas.Web.Db.Models; using Kemkas.Web.Db.Models;
using Kemkas.Web.Services.Character; using Kemkas.Web.Services.FirstEdition.Character;
using Kemkas.Web.Services.Identity; using Kemkas.Web.Services.Identity;
using Kemkas.Web.Services.SecondEdition.Character;
using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.AspNetCore.Identity.UI.Services;
using OpenTelemetry.Metrics; // using OpenTelemetry.Metrics;
using OpenTelemetry.Resources; // using OpenTelemetry.Resources;
using OpenTelemetry.Trace; // using OpenTelemetry.Trace;
using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork; using IPNetwork = Microsoft.AspNetCore.HttpOverrides.IPNetwork;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -51,7 +52,8 @@ builder.AddOpenTelemetry();
builder.Services.AddHealthChecks(); builder.Services.AddHealthChecks();
builder.Services.AddCharacterServices(); builder.Services.AddCharacter1EServices();
builder.Services.AddCharacter2EServices();
var app = builder.Build(); var app = builder.Build();
app.UsePathBase("/api"); app.UsePathBase("/api");
@@ -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<Guid> StoreNewCharacter(V1Karakter karakter, bool isPublic = false);
public Task<V1Karakter?> GetCharacterById(Guid id, bool tracking = false);
public Task<List<CharacterListItemDto>> GetAllCharactersOfUser();
public Task UpdateCharacter(V1Karakter karakter, bool isPublic = false);
}
public class CharacterPersistenceService(
ApplicationDbContext dbContext,
ICurrentUserService currentUserService
) : ICharacterPersistenceService
{
public async Task<Guid> 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<V1Karakter?> GetCharacterById(Guid id, bool tracking = false)
{
IQueryable<V1Karakter> 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<List<CharacterListItemDto>> 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();
}
}
@@ -3,18 +3,18 @@ using Kemkas.Web.Db.Enums;
using Kemkas.Web.Db.Models; using Kemkas.Web.Db.Models;
using Kemkas.Web.ViewModels; 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 var karakter = new V1Karakter
{ {
@@ -23,8 +23,8 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService
Kor = dto.Kor, Kor = dto.Kor,
Jellem = JellemExtensions.Convert(dto.Jellem), Jellem = JellemExtensions.Convert(dto.Jellem),
Isten = dto.Isten, Isten = dto.Isten,
Faj = FajExtensions.Convert(dto.Faj), Faj = FajExtensions.Convert1E(dto.Faj),
Osztaly = OsztalyExtensions.Convert(dto.Osztaly), Osztaly = OsztalyExtensions.Convert1E(dto.Osztaly),
Ero = dto.Tulajdonsagok.Ero, Ero = dto.Tulajdonsagok.Ero,
Ugyesseg = dto.Tulajdonsagok.Ugy, Ugyesseg = dto.Tulajdonsagok.Ugy,
Egeszseg = dto.Tulajdonsagok.Egs, Egeszseg = dto.Tulajdonsagok.Egs,
@@ -32,10 +32,10 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService
Bolcsesseg = dto.Tulajdonsagok.Bol, Bolcsesseg = dto.Tulajdonsagok.Bol,
Karizma = dto.Tulajdonsagok.Kar, Karizma = dto.Tulajdonsagok.Kar,
Szint = dto.Szint, Szint = dto.Szint,
Pajzs = dto.Felszereles.PajzsId,
Pancel = dto.Felszereles.PancelId
}; };
karakter.KarakterKepzettsegek = ConvertKepzettsegek(dto, karakter); 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.Felszereles = dto.Felszereles.FegyverIds.Select(x => new V1Felszereles
{ {
Karakter = karakter, Karakter = karakter,
@@ -47,15 +47,15 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService
return karakter; return karakter;
} }
public void Update(V1Karakter original, CharacterDto dto) public void Update(V1Karakter original, Character1eDto dto)
{ {
original.Nev = dto.Name; original.Nev = dto.Name;
original.Nem = dto.Nem; original.Nem = dto.Nem;
original.Kor = dto.Kor; original.Kor = dto.Kor;
original.Jellem = JellemExtensions.Convert(dto.Jellem); original.Jellem = JellemExtensions.Convert(dto.Jellem);
original.Isten = dto.Isten; original.Isten = dto.Isten;
original.Faj = FajExtensions.Convert(dto.Faj); original.Faj = FajExtensions.Convert1E(dto.Faj);
original.Osztaly = OsztalyExtensions.Convert(dto.Osztaly); original.Osztaly = OsztalyExtensions.Convert1E(dto.Osztaly);
original.Ero = dto.Tulajdonsagok.Ero; original.Ero = dto.Tulajdonsagok.Ero;
original.Ugyesseg = dto.Tulajdonsagok.Ugy; original.Ugyesseg = dto.Tulajdonsagok.Ugy;
original.Egeszseg = dto.Tulajdonsagok.Egs; original.Egeszseg = dto.Tulajdonsagok.Egs;
@@ -76,7 +76,7 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService
} }
// TODO: this is unnecessary duplication of business logic!! // TODO: this is unnecessary duplication of business logic!!
private static List<V1Szintlepes> ConvertSzintLepes(CharacterDto dto, V1Karakter karakter) private static List<V1Szintlepes> ConvertSzintLepes(Character1eDto dto, V1Karakter karakter)
{ {
if (dto.HpRolls.Count < dto.Szint - 2) if (dto.HpRolls.Count < dto.Szint - 2)
{ {
@@ -103,15 +103,15 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService
// OsztalySzint = 1, // OsztalySzint = 1,
HpRoll = karakter.Osztaly switch // TODO: duplication of logic!! HpRoll = karakter.Osztaly switch // TODO: duplication of logic!!
{ {
Osztaly.Barbar => 12, Osztaly1E.Barbar => 12,
Osztaly.Amazon or Osztaly.Harcos or Osztaly.Kaloz or Osztaly.Ijasz => 10, Osztaly1E.Amazon or Osztaly1E.Harcos or Osztaly1E.Kaloz or Osztaly1E.Ijasz => 10,
Osztaly.Pap => 8, Osztaly1E.Pap => 8,
Osztaly.Tolvaj => 6, Osztaly1E.Tolvaj => 6,
Osztaly.Varazslo or Osztaly.Illuzionista => 4, Osztaly1E.Varazslo or Osztaly1E.Illuzionista => 4,
_ => throw new ArgumentOutOfRangeException(nameof(karakter.Osztaly), karakter.Osztaly, _ => throw new ArgumentOutOfRangeException(nameof(karakter.Osztaly), karakter.Osztaly,
"invalid 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 => return Enumerable.Range(2, count: dto.Szint - 1).Select(szint =>
@@ -131,13 +131,13 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService
}).Prepend(level1).ToList(); }).Prepend(level1).ToList();
} }
private static List<V1KarakterKepzettseg> ConvertKepzettsegek(CharacterDto dto, V1Karakter karakter) private static List<V1KarakterKepzettseg> ConvertKepzettsegek(Character1eDto dto, V1Karakter karakter)
{ {
var kepzettsegek = dto.Kepzettsegek.Select(x => new V1KarakterKepzettseg var kepzettsegek = dto.Kepzettsegek.Select(x => new V1KarakterKepzettseg
{ {
Karakter = karakter, Karakter = karakter,
IsTolvajKepzettseg = false, IsTolvajKepzettseg = false,
Kepzettseg = KepzettsegExtensions.Convert(x), Kepzettseg = KepzettsegExtensions.Convert1E(x),
}).ToList(); }).ToList();
if (dto.Tolvajkepzettsegek != null) if (dto.Tolvajkepzettsegek != null)
{ {
@@ -145,7 +145,7 @@ public class CharacterDtoToDbModelService : ICharacterDtoToDbModelService
{ {
Karakter = karakter, Karakter = karakter,
IsTolvajKepzettseg = true, IsTolvajKepzettseg = true,
Kepzettseg = KepzettsegExtensions.Convert(x), Kepzettseg = KepzettsegExtensions.Convert1E(x),
})); }));
} }
return kepzettsegek; return kepzettsegek;
@@ -2,18 +2,18 @@ using Kemkas.Web.Db.Enums;
using Kemkas.Web.Db.Models; using Kemkas.Web.Db.Models;
using Kemkas.Web.ViewModels; using Kemkas.Web.ViewModels;
namespace Kemkas.Web.Services.Character; namespace Kemkas.Web.Services.FirstEdition.Character;
public interface ICharacterDbModelToDtoService public interface ICharacterDbModelToDto1EService
{ {
public CharacterDto Convert(V1Karakter entity); public Character1eDto Convert(V1Karakter entity);
} }
public class CharacterDbModelToDtoService : ICharacterDbModelToDtoService public class CharacterDbModelToDto1EService : ICharacterDbModelToDto1EService
{ {
public CharacterDto Convert(V1Karakter entity) public Character1eDto Convert(V1Karakter entity)
{ {
return new CharacterDto return new Character1eDto
{ {
Name = entity.Nev, Name = entity.Nev,
Nem = entity.Nem, Nem = entity.Nem,
@@ -36,8 +36,8 @@ public class CharacterDbModelToDtoService : ICharacterDbModelToDtoService
Szint = entity.Szint, Szint = entity.Szint,
HpRolls = entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Skip(1).Select(x => x.HpRoll).ToList(), 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<Tulajdonsag>().Select(x => x.Convert()).ToList(), TulajdonsagNovelesek = entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.TulajdonsagNoveles).Where(x => x is not null).Cast<Tulajdonsag>().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<string>().ToList() : [], HarcosSpecializaciok = entity.Osztaly == Osztaly1E.Harcos ? entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.FegyverSpecializacio).Where(x => x != null).Cast<string>().ToList() : [],
KalozKritikus = entity.Osztaly == Osztaly.Kaloz ? entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.FegyverSpecializacio).Where(x => x != null).Cast<string>().ToList() : [], KalozKritikus = entity.Osztaly == Osztaly1E.Kaloz ? entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(x => x.FegyverSpecializacio).Where(x => x != null).Cast<string>().ToList() : [],
Felszereles = new KarakterFelszerelesDto Felszereles = new KarakterFelszerelesDto
{ {
PajzsId = entity.Pajzs, PajzsId = entity.Pajzs,
@@ -1,16 +1,17 @@
using Kemkas.Web.Services.Identity; 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 public static class ServiceCollectionExtensions
{ {
public static IServiceCollection AddCharacterServices(this IServiceCollection serviceCollection) public static IServiceCollection AddCharacter1EServices(this IServiceCollection serviceCollection)
{ {
serviceCollection.AddScoped<ICurrentUserService, CurrentUserService>(); serviceCollection.AddScoped<ICurrentUserService, CurrentUserService>();
serviceCollection.AddTransient<ICharacterValidationService, CharacterValidationService>(); serviceCollection.AddTransient<ICharacterValidationService, CharacterValidationService>();
serviceCollection.AddTransient<ICharacterDtoToDbModelService, CharacterDtoToDbModelService>(); serviceCollection.AddTransient<ICharacter1EDtoToDbModelService, Character1EDtoToDbModelService>();
serviceCollection.AddTransient<ICharacterDbModelToDtoService, CharacterDbModelToDtoService>(); serviceCollection.AddTransient<ICharacterDbModelToDto1EService, CharacterDbModelToDto1EService>();
serviceCollection.AddScoped<ICharacterPersistenceService, CharacterPersistenceService>(); serviceCollection.AddScoped<ICharacterPersistenceService, CharacterPersistenceService>();
return serviceCollection; return serviceCollection;
} }
@@ -1,15 +1,15 @@
using Kemkas.Web.ViewModels; using Kemkas.Web.ViewModels;
namespace Kemkas.Web.Services.Character; namespace Kemkas.Web.Services.FirstEdition.Character;
public interface ICharacterValidationService public interface ICharacterValidationService
{ {
public string? Validate(CharacterDto dto); public string? Validate(Character1eDto dto);
} }
public class CharacterValidationService : ICharacterValidationService public class CharacterValidationService : ICharacterValidationService
{ {
public string? Validate(CharacterDto dto) public string? Validate(Character1eDto dto)
{ {
// TODO: add validation!! // TODO: add validation!!
return null; return null;
@@ -0,0 +1,113 @@
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 Character2EDtoToDbModelService : 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)
{
original.Nev = dto.Nev;
original.Nem = dto.Nem;
original.Kor = dto.Kor;
original.Isten = dto.Isten;
original.Jellem = JellemExtensions.Convert(dto.Jellem);
original.Faj = FajExtensions.Convert2E(dto.Faj);
original.Ero = dto.Tulajdonsagok.Ero;
original.Ugyesseg = dto.Tulajdonsagok.Ugy;
original.Egeszseg = dto.Tulajdonsagok.Egs;
original.Intelligencia = dto.Tulajdonsagok.Int;
original.Bolcsesseg = dto.Tulajdonsagok.Bol;
original.Karizma = dto.Tulajdonsagok.Kar;
original.Szint = dto.Szint;
original.Pajzs = dto.Felszereles.PajzsId;
original.Pancel = dto.Felszereles.PancelId;
original.KarakterKepzettsegek = ConvertKarakterKepzettsegek(dto, original);
original.Felszereles = dto.Felszereles.FegyverIds.Select(x => new V2Felszereles
{
Karakter = original,
IsFegyver = true,
TargyId = x,
}).ToList();
original.Szintlepesek = dto.Szintlepesek.Select((x, i) => new V2Szintlepes
{
Karakter = original,
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();
}
private static List<V2KarakterKepzettseg> 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;
}
}
@@ -0,0 +1,54 @@
using Kemkas.Web.Db.Enums;
using Kemkas.Web.Db.Models;
using Kemkas.Web.ViewModels;
namespace Kemkas.Web.Services.SecondEdition.Character;
public interface ICharacterDbModelToDto2EService
{
public Character2eDto Convert(V2Karakter entity);
}
public class CharacterDbModelToDto2EService : ICharacterDbModelToDto2EService
{
public Character2eDto Convert(V2Karakter entity)
{
return new Character2eDto
{
Nev = entity.Nev,
Nem = entity.Nem,
Kor = entity.Kor,
Jellem = entity.Jellem.Convert(),
Isten = entity.Isten,
Faj = entity.Faj.Convert(),
Tulajdonsagok = new KarakterTulajdonsagokDto
{
Ero = entity.Ero,
Ugy = entity.Ugyesseg,
Egs = entity.Egeszseg,
Int = entity.Intelligencia,
Bol = entity.Bolcsesseg,
Kar = entity.Karizma,
},
Kepzettsegek = entity.KarakterKepzettsegek.Where(x => !x.IsTolvajKepzettseg).Select(x => x.Kepzettseg.Convert()).ToList(),
Tolvajkepzettsegek = entity.KarakterKepzettsegek.Where(x => x.IsTolvajKepzettseg).Select(x => x.Kepzettseg.Convert()).ToList(),
Szint = entity.Szint,
Felszereles = new KarakterFelszerelesDto
{
PajzsId = entity.Pajzs,
PancelId = entity.Pancel,
FegyverIds = entity.Felszereles.Where(x => x.IsFegyver).Select(x => x.TargyId).ToList(),
},
IsPublic = entity.IsPublic,
Szintlepesek = entity.Szintlepesek.OrderBy(x => x.KarakterSzint).Select(sz => new Szintlepes
{
Osztaly = sz.Osztaly.Convert(),
KalozKritikus = sz.Osztaly == Osztaly2E.Tengeresz ? sz.FegyverSpecializacio : null,
HarcosFegyver = sz.Osztaly == Osztaly2E.Harcos ? sz.FegyverSpecializacio : null,
TulajdonsagNoveles = sz.TulajdonsagNoveles?.Convert(),
HProll = sz.HpRoll,
TolvajExtraKepzettseg = sz.TolvajExtraKepzettseg?.Convert()
}).ToList()
};
}
}
@@ -0,0 +1,11 @@
namespace Kemkas.Web.Services.SecondEdition.Character;
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddCharacter2EServices(this IServiceCollection serviceCollection)
{
serviceCollection.AddTransient<ICharacter2EDtoToDbModelService, Character2EDtoToDbModelService>();
serviceCollection.AddTransient<ICharacterDbModelToDto2EService, CharacterDbModelToDto2EService>();
return serviceCollection;
}
}
@@ -0,0 +1,156 @@
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<Guid> StoreNewCharacter1E(V1Karakter karakter, bool isPublic = false);
public Task<Guid> StoreNewCharacter2E(V2Karakter karakter, bool isPublic = false);
public Task<V1Karakter?> GetCharacter1EById(Guid id, bool tracking = false);
public Task<V2Karakter?> GetCharacter2EById(Guid id, bool tracking = false);
public Task<List<CharacterListItemDto>> 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<Guid> 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<Guid> 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<V1Karakter?> GetCharacter1EById(Guid id, bool tracking = false)
{
IQueryable<V1Karakter> queryable = dbContext.Karakterek.Include(x => x.KarakterKepzettsegek)
.Include(x => x.Szintlepesek)
.Include(x => x.Felszereles);
queryable = tracking ? queryable.AsTracking() : queryable.AsNoTracking();
var entity = await queryable
.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<V2Karakter?> GetCharacter2EById(Guid id, bool tracking = false)
{
IQueryable<V2Karakter> queryable = dbContext.Karakterek2E.Include(x => x.KarakterKepzettsegek)
.Include(x => x.Szintlepesek)
.Include(x => x.Felszereles);
queryable = tracking ? queryable.AsTracking() : queryable.AsNoTracking();
var entity = await queryable
.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<List<CharacterListItemDto>> 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 characters2ERaw = await dbContext.Karakterek2E.Include(k => k.Szintlepesek)
.Where(k => k.OwnerUserId == currentUser.Id)
.Select(k => new
{
k.Id,
k.Nev,
k.Szint,
k.Faj,
Osztalyok = k.Szintlepesek.Select(x => x.Osztaly).ToList(),
})
.ToListAsync();
var characters2E = characters2ERaw.Select(k => new CharacterListItemDto
{
Id = k.Id,
Name = k.Nev,
Szint = k.Szint,
Faj = k.Faj.Convert(),
Osztaly = string.Join('/', k.Osztalyok.Select(o => o.Convert())),
Edition = "2e"
});
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();
}
}
@@ -3,7 +3,7 @@ using System.Text.Json.Serialization;
namespace Kemkas.Web.ViewModels; namespace Kemkas.Web.ViewModels;
public struct CharacterDto public struct Character1eDto
{ {
[Required] [Required]
[JsonPropertyName("name")] [JsonPropertyName("name")]
+46
View File
@@ -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<string> Kepzettsegek { get; set; }
[JsonPropertyName("tolvajkepzettsegek")]
public IList<string>? Tolvajkepzettsegek { get; set; }
[JsonPropertyName("szint")]
public byte Szint { get; set; }
[JsonPropertyName("szintlepesek")]
public IList<Szintlepes> Szintlepesek { get; set; }
[JsonPropertyName("felszereles")]
public KarakterFelszerelesDto Felszereles { get; set; }
public bool? IsPublic { get; set; }
}
@@ -2,6 +2,9 @@ using System.Text.Json.Serialization;
namespace Kemkas.Web.ViewModels; namespace Kemkas.Web.ViewModels;
/// <summary>
/// currently the same for 1st edition and 2nd edition, be cautious!
/// </summary>
public struct KarakterFelszerelesDto public struct KarakterFelszerelesDto
{ {
[JsonPropertyName("pancelID")] [JsonPropertyName("pancelID")]
@@ -2,6 +2,9 @@ using System.Text.Json.Serialization;
namespace Kemkas.Web.ViewModels; namespace Kemkas.Web.ViewModels;
/// <summary>
/// currently the same for 1st edition and 2nd edition, be cautious!
/// </summary>
public struct KarakterTulajdonsagokDto public struct KarakterTulajdonsagokDto
{ {
[JsonPropertyName("t_ero")] [JsonPropertyName("t_ero")]
+24
View File
@@ -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; }
}
-12
View File
@@ -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; }
}
+4 -4
View File
@@ -62,7 +62,7 @@ function App(props: {faro?: Faro}) {
{ {
path: "/1e/karakter/:id", path: "/1e/karakter/:id",
element: <CreateCharacter faro={props.faro}/>, element: <CreateCharacter faro={props.faro}/>,
loader: args => fetch(`${window.location.origin}/api/Character/${args.params.id}`), loader: args => fetch(`${window.location.origin}/api/Character1E/${args.params.id}`),
ErrorBoundary: ErrorBoundary, ErrorBoundary: ErrorBoundary,
}, },
{ {
@@ -71,13 +71,13 @@ function App(props: {faro?: Faro}) {
}, },
{ {
path: "/2e/karakter", path: "/2e/karakter",
element: <CreateCharacter2E />, element: <CreateCharacter2E faro={props.faro}/>,
ErrorBoundary: ErrorBoundary, ErrorBoundary: ErrorBoundary,
}, },
{ {
path: "/2e/karakter/:id", path: "/2e/karakter/:id",
element: <CreateCharacter faro={props.faro}/>, element: <CreateCharacter2E faro={props.faro}/>,
loader: args => fetch(`${window.location.origin}/api/Character/${args.params.id}`), loader: args => fetch(`${window.location.origin}/api/Character2E/${args.params.id}`),
ErrorBoundary: ErrorBoundary, ErrorBoundary: ErrorBoundary,
}, },
]); ]);
@@ -2,7 +2,7 @@ import {KarakterInputs} from "../domain-models/karakter";
import axios from "axios"; import axios from "axios";
export async function StoreNewCharacter(karakter: KarakterInputs, isPublic: boolean = false) { 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, withCredentials: true,
params: { params: {
isPublic, isPublic,
@@ -17,7 +17,7 @@ export async function StoreNewCharacter(karakter: KarakterInputs, isPublic: bool
} }
export async function UpdateCharacter(id: string, karakter: KarakterInputs, isPublic: boolean = false) { 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, withCredentials: true,
params: { params: {
isPublic, isPublic,
@@ -30,4 +30,3 @@ export async function UpdateCharacter(id: string, karakter: KarakterInputs, isPu
throw Error(response.statusText) throw Error(response.statusText)
} }
} }
@@ -0,0 +1,32 @@
import axios from "axios";
import {Karakter2E} from "../domain-models/karakter2E";
export async function StoreNewCharacter2E(karakter: Karakter2E, isPublic: boolean = false) {
let response = await axios.post(`${window.location.origin}/api/Character2E/`, karakter, {
withCredentials: true,
params: {
isPublic,
}
})
if (response.status < 300){
return response.data as string
}
else {
throw Error(response.statusText)
}
}
export async function UpdateCharacter2E(id: string, karakter: Karakter2E, isPublic: boolean = false) {
let response = await axios.post(`${window.location.origin}/api/Character2E/${id}`, karakter, {
withCredentials: true,
params: {
isPublic,
}
})
if (response.status < 300){
return response.data as string
}
else {
throw Error(response.statusText)
}
}
@@ -10,7 +10,7 @@ import {BaseHP} from "./masodlagos_ertekek";
import {dAny} from "../../shared/domain-models/kockak"; import {dAny} from "../../shared/domain-models/kockak";
export interface Karakter2E { export interface Karakter2E {
name: string, nev: string,
nem?: string, nem?: string,
kor: number, kor: number,
isten?: string, isten?: string,
@@ -25,7 +25,7 @@ export interface Karakter2E {
} }
export const DefaultKarakter: Karakter2E = { export const DefaultKarakter: Karakter2E = {
name: 'Névtelen Kalandozó', nev: 'Névtelen Kalandozó',
kor: 20, kor: 20,
jellem: 'S', jellem: 'S',
tulajdonsagok: TulajdonsagDefaults, tulajdonsagok: TulajdonsagDefaults,
@@ -1,7 +1,7 @@
import React, {useState} from 'react' import React, {useContext, useState} from 'react'
import {useParams} from "react-router-dom"; import {useLoaderData, useNavigate, useParams} from "react-router-dom";
import {Toast, ToastContainer} from "react-bootstrap"; import {Button, InputGroup, Modal, OverlayTrigger, Toast, ToastContainer, Tooltip} from "react-bootstrap";
import {ChangeLvl1Osztaly, DefaultKarakter} from "../domain-models/karakter2E"; import {ChangeLvl1Osztaly, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E";
import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag2E"; import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag2E";
import FajSelector2E from "../components/FajSelector2E"; import FajSelector2E from "../components/FajSelector2E";
import Tulajdonsagok2E from "../components/Tulajdonsagok2E"; import Tulajdonsagok2E from "../components/Tulajdonsagok2E";
@@ -24,12 +24,31 @@ import LevelUps from "../components/LevelUps";
import {LevelDown, LevelUp} from "../domain-models/szintlepes"; import {LevelDown, LevelUp} from "../domain-models/szintlepes";
import HarcosFegyverSpecializacio from "../components/HarcosFegyverSpec"; import HarcosFegyverSpecializacio from "../components/HarcosFegyverSpec";
import {arraySetN} from "../../util"; import {arraySetN} from "../../util";
import saveOverlayTooltip from "../../first-edition/components/SaveOverlayTooltip";
import {UserContext} from "../../shared/contexts/UserContext";
import {
StoreNewCharacter2E,
UpdateCharacter2E
} from "../api/character.api";
import {Faro} from "@grafana/faro-web-sdk";
import Form from "react-bootstrap/Form";
function CreateCharacter2E(props: {}) { function CreateCharacter2E(props: {
faro?: Faro
}) {
const {faro} = props
const { id } = useParams(); const { id } = useParams();
const fetchedUser = useContext(UserContext);
const loaderData = useLoaderData() as Karakter2E & { isPublic: boolean } | undefined;
let initialKarakterInputs = DefaultKarakter;
if (loaderData != null) {
const { isPublic: t1, ...t2 } = loaderData;
initialKarakterInputs = t2
}
const initialIsPublic = loaderData?.isPublic ?? fetchedUser?.data == null;
const navigate = useNavigate();
const [karakter, setKarakter] = useState(DefaultKarakter) const [karakter, setKarakter] = useState(initialKarakterInputs)
const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj) const tulajdonsagokFajjal = TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj)
const changeKepzettseg = (k: KepzettsegId[]) => setKarakter({...karakter, kepzettsegek: k}) const changeKepzettseg = (k: KepzettsegId[]) => setKarakter({...karakter, kepzettsegek: k})
const changeTolvajKepzettseg = (tk?: KepzettsegId[]) => setKarakter({...karakter, tolvajKepzettsegek: tk}) const changeTolvajKepzettseg = (tk?: KepzettsegId[]) => setKarakter({...karakter, tolvajKepzettsegek: tk})
@@ -38,8 +57,43 @@ function CreateCharacter2E(props: {}) {
const changeFelszereles = (f: KarakterFelszereles) => setKarakter({...karakter, felszereles: f}) const changeFelszereles = (f: KarakterFelszereles) => setKarakter({...karakter, felszereles: f})
let [showSaveModal, setShowSaveModal] = useState(false);
let [newId, setNewId] = useState(null as string | null)
let [showSaved, setShowSaved] = useState(false); let [showSaved, setShowSaved] = useState(false);
let [isPublic, setIsPublic] = useState(initialIsPublic);
const newCharacterUrl = () => `${window.location.origin}/2e/karakter/${newId}`
const handleSaveModalCopyAndClose = async () => {
await navigator.clipboard.writeText(newCharacterUrl());
handleSaveModalClose()
}
const handleSaveModalClose = () => {
setShowSaveModal(false);
navigate(`/2e/karakter/${newId}`)
}
const hideSaved = () => setShowSaved(false); const hideSaved = () => setShowSaved(false);
const onSaveClicked = async () => {
faro?.api.pushEvent('character_stored', {
osztaly: karakter.szintlepesek[0].osztaly.toString(),
szint: karakter.szint.toString(),
faj: karakter.faj.toString(),
is_public: isPublic.toString(),
edition: "2e",
})
if (id == null) {
let recievedId = await StoreNewCharacter2E(karakter, isPublic);
setNewId(recievedId)
setShowSaveModal(true);
} else {
await UpdateCharacter2E(id, karakter, isPublic);
setShowSaved(true);
setTimeout(() => {
hideSaved();
}, 5000)
}
}
return <div> return <div>
<div className='container-fluid p-5 bg-black text-white text-center'> <div className='container-fluid p-5 bg-black text-white text-center'>
@@ -50,6 +104,28 @@ function CreateCharacter2E(props: {}) {
<Toast.Header><strong>Karakter mentve!</strong></Toast.Header> <Toast.Header><strong>Karakter mentve!</strong></Toast.Header>
</Toast> </Toast>
</ToastContainer> </ToastContainer>
<Modal show={showSaveModal} onHide={handleSaveModalClose}>
<Modal.Header closeButton>
<Modal.Title>Karakter mentve!</Modal.Title>
</Modal.Header>
<Modal.Body>
<p>Karaktered az alábbi {isPublic ? 'publikus' : 'privát'} URLen érhető el.</p>
<p><a href={newCharacterUrl()}>{newCharacterUrl()}</a></p>
<InputGroup className="mb-3">
<Form.Control id="input" value={newCharacterUrl()} />
<Button variant={"outline-dark"} onClick={() => {
let copyText = document.querySelector("#input") as any;
copyText?.select()
document.execCommand("copy");
}}>Másolás</Button>
</InputGroup>
</Modal.Body>
<Modal.Footer>
<Button variant="danger" onClick={handleSaveModalCopyAndClose}>
Másolás és bezárás
</Button>
</Modal.Footer>
</Modal>
<div className='p-3'> <div className='p-3'>
<form onSubmit={async (event) => event.preventDefault()}> <form onSubmit={async (event) => event.preventDefault()}>
<div className='row'> <div className='row'>
@@ -58,9 +134,9 @@ function CreateCharacter2E(props: {}) {
<div className='row m-2'> <div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Név</label> <label className='col-md-2 col-sm-3 col-form-label'>Név</label>
<input className='col form-control' <input className='col form-control'
value={karakter.name} value={karakter.nev}
onChange={(e) => setKarakter({...karakter, name: e.target.value})}/> onChange={(e) => setKarakter({...karakter, nev: e.target.value})}/>
{!karakter.name && {!karakter.nev &&
<span className='form-field-error'>A karaktered nem mászkálhat névtelenül a világban!</span>} <span className='form-field-error'>A karaktered nem mászkálhat névtelenül a világban!</span>}
</div> </div>
<div className='row m-2'> <div className='row m-2'>
@@ -110,7 +186,12 @@ function CreateCharacter2E(props: {}) {
<HarcosFegyverSpecializacio <HarcosFegyverSpecializacio
specialization={karakter.szintlepesek[0].harcosFegyver || 'kard_hosszu'} specialization={karakter.szintlepesek[0].harcosFegyver || 'kard_hosszu'}
szint={1} szint={1}
changeSpecialization={(spec) => setKarakter({...karakter, szintlepesek: arraySetN(karakter.szintlepesek, 0, {...karakter.szintlepesek[0], harcosFegyver: spec})})} changeSpecialization={(spec) => setKarakter({...karakter,
szintlepesek: arraySetN(karakter.szintlepesek, 0, {
...karakter.szintlepesek[0],
harcosFegyver: spec
})
})}
existingSpecializations={karakter.szintlepesek.map(x => x.harcosFegyver)} existingSpecializations={karakter.szintlepesek.map(x => x.harcosFegyver)}
/>} />}
<KarakterKepzettsegek <KarakterKepzettsegek
@@ -121,23 +202,25 @@ function CreateCharacter2E(props: {}) {
tolvajKepzettsegek={karakter.tolvajKepzettsegek || []} tolvajKepzettsegek={karakter.tolvajKepzettsegek || []}
changeTolvajKepzettsegek={changeTolvajKepzettseg} changeTolvajKepzettsegek={changeTolvajKepzettseg}
/> />
<hr /> <hr/>
{/* 1. szinten */} {/* 1. szinten */}
<MasodlagosErtekek {...CalculateMasodlagosErtekek({ <MasodlagosErtekek {...CalculateMasodlagosErtekek({
...karakter, ...karakter,
tulajdonsagok: tulajdonsagokFajjal, tulajdonsagok: tulajdonsagokFajjal,
szint: 1, szint: 1,
szintlepesek: karakter.szintlepesek.slice(0,1) szintlepesek: karakter.szintlepesek.slice(0, 1)
})} /> })} />
<hr /> <hr/>
<LevelUps karakter={karakter} changeKarakter={setKarakter}/> <LevelUps karakter={karakter} changeKarakter={setKarakter}/>
{karakter.szint > 1 && <hr/>} {karakter.szint > 1 && <hr/>}
<div className='d-grid gap-2 m-5'> <div className='d-grid gap-2 m-5'>
{karakter.szint < 12 && {karakter.szint < 12 &&
<button className='btn btn-dark btn-lg' type='button' onClick={() => LevelUp(karakter, setKarakter)}>Szintlépés! <button className='btn btn-dark btn-lg' type='button'
onClick={() => LevelUp(karakter, setKarakter)}>Szintlépés!
</button>} </button>}
{karakter.szint > 1 && {karakter.szint > 1 &&
<button className='btn btn-dark btn-lg' type='button' onClick={() => LevelDown(karakter, setKarakter)}>Visszalépés! <button className='btn btn-dark btn-lg' type='button'
onClick={() => LevelDown(karakter, setKarakter)}>Visszalépés!
</button>} </button>}
</div> </div>
<hr/> <hr/>
@@ -145,9 +228,66 @@ function CreateCharacter2E(props: {}) {
changeFelszereles={changeFelszereles}/> changeFelszereles={changeFelszereles}/>
<hr/> <hr/>
<div className='row'>
<h5 className='col align-self-center'>Véglegesítés</h5>
</div>
{fetchedUser.data != null &&
<div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Publikus karakterlap?</label>
<select className="col form-select" value={isPublic.toString()}
onChange={(event) => setIsPublic(event.target.value === "true")}>
<option value="true">Igen</option>
<option value="false">Nem</option>
</select>
</div>
}
<div className="row">
<div className="col-6">
<div className='d-grid gap-2 m-5'>
{fetchedUser.data == null
? <OverlayTrigger
placement='top'
overlay={saveOverlayTooltip}
delay={0}
defaultShow={false}
flip={false}
>
<button
className='btn btn-danger btn-lg'
type='button'
onClick={onSaveClicked}
>
Mentés
</button>
</OverlayTrigger>
: <button
className='btn btn-danger btn-lg'
type='button'
onClick={onSaveClicked}
>
Mentés
</button>
}
</div>
</div>
<div className="col-6">
<OverlayTrigger
placement='top'
overlay={<Tooltip id="pdf-btn-tooltip">Hamarosan!</Tooltip>}
delay={0}
defaultShow={false}
flip={false}
trigger={"hover"}
>
<div className='d-grid gap-2 m-5'>
<button className='btn btn-secondary btn-lg' disabled={true} type='button'>PDF</button>
</div>
</OverlayTrigger>
</div>
</div>
</form> </form>
</div> </div>
<hr/>
</div> </div>
} }
+1
View File
@@ -1,2 +1,3 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=karakter/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Kemkas/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary> <s:Boolean x:Key="/Default/UserDictionary/Words/=Kemkas/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>