Save enemy-season relationship
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System.Linq;
|
||||
using AutoMapper;
|
||||
using EstusShots.Server.Models;
|
||||
|
||||
@@ -19,7 +20,8 @@ namespace EstusShots.Server.Mapping
|
||||
CreateMap<Drink, Shared.Dto.Drink>();
|
||||
CreateMap<Shared.Dto.Drink, Drink>();
|
||||
|
||||
CreateMap<Enemy, Shared.Dto.Enemy>();
|
||||
CreateMap<Enemy, Shared.Dto.Enemy>()
|
||||
.ForMember(x => x.Seasons, y => y.MapFrom(z => z.SeasonEnemies.Select(a => a.Season)));
|
||||
CreateMap<Shared.Dto.Enemy, Enemy>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,6 @@ namespace EstusShots.Server.Models
|
||||
|
||||
public bool Defeated { get; set; }
|
||||
|
||||
public ICollection<SeasonEnemies> SeasonEnemies { get; set; } = default!;
|
||||
public ICollection<SeasonEnemy> SeasonEnemies { get; set; } = default!;
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,6 @@ namespace EstusShots.Server.Models
|
||||
|
||||
public Season Season { get; set; } = default!;
|
||||
|
||||
public ICollection<EpisodePlayers> EpisodePlayers { get; set; } = default!;
|
||||
public ICollection<EpisodePlayer> EpisodePlayers { get; set; } = default!;
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ using System;
|
||||
|
||||
namespace EstusShots.Server.Models
|
||||
{
|
||||
public class EpisodePlayers
|
||||
public class EpisodePlayer
|
||||
{
|
||||
public Guid EpisodeId { get; set; } = default!;
|
||||
public Episode Episode { get; set; } = default!;
|
||||
@@ -18,6 +18,6 @@ namespace EstusShots.Server.Models
|
||||
|
||||
public string DisplayName => Anonymous ? Alias : Name;
|
||||
|
||||
public ICollection<EpisodePlayers> EpisodePlayers { get; set; } = default!;
|
||||
public ICollection<EpisodePlayer> EpisodePlayers { get; set; } = default!;
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,6 @@ namespace EstusShots.Server.Models
|
||||
|
||||
public List<Episode> Episodes { get; set; } = default!;
|
||||
|
||||
public ICollection<SeasonEnemies> SeasonEnemies { get; set; } = default!;
|
||||
public ICollection<SeasonEnemy> SeasonEnemies { get; set; } = default!;
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ using System;
|
||||
|
||||
namespace EstusShots.Server.Models
|
||||
{
|
||||
public class SeasonEnemies
|
||||
public class SeasonEnemy
|
||||
{
|
||||
public Guid SeasonId { get; set; } = default!;
|
||||
public Season Season { get; set; } = default!;
|
||||
@@ -30,12 +30,15 @@ namespace EstusShots.Server.Services
|
||||
List<Enemy> enemies;
|
||||
if (parameter.SeasonId.IsEmpty())
|
||||
{
|
||||
enemies = await _context.Enemies.ToListAsync();
|
||||
enemies = await _context.Enemies
|
||||
.Include("SeasonEnemies.Season")
|
||||
.ToListAsync();
|
||||
_logger.LogInformation($"Found {enemies.Count} enemies in database");
|
||||
}
|
||||
else
|
||||
{
|
||||
enemies = await _context.Enemies
|
||||
.Include("SeasonEnemies.Season")
|
||||
.Where(e => e.SeasonEnemies.Any(x => x.SeasonId == parameter.SeasonId))
|
||||
.ToListAsync();
|
||||
_logger.LogInformation($"Found {enemies.Count} enemies for season '{parameter.SeasonId}'");
|
||||
@@ -60,28 +63,8 @@ namespace EstusShots.Server.Services
|
||||
public async Task<ApiResponse<SaveEnemyResponse>> SaveEnemy(SaveEnemyParameter parameter)
|
||||
{
|
||||
if (parameter.Enemy.EnemyId.IsEmpty())
|
||||
{
|
||||
var enemy = _mapper.Map<Enemy>(parameter.Enemy);
|
||||
_context.Enemies.Add(enemy);
|
||||
var count = await _context.SaveChangesAsync();
|
||||
_logger.LogInformation($"Created enemy '{enemy.EnemyId}' ({count} rows)");
|
||||
return new ApiResponse<SaveEnemyResponse>(new SaveEnemyResponse(enemy.EnemyId));
|
||||
}
|
||||
else
|
||||
{
|
||||
var enemy = await _context.Enemies.FindAsync(parameter.Enemy.EnemyId);
|
||||
if (enemy == null)
|
||||
{
|
||||
_logger.LogError($"Enemy '{parameter.Enemy.EnemyId}' not found in database");
|
||||
return new ApiResponse<SaveEnemyResponse>(new OperationResult(false, "Object not found"));
|
||||
}
|
||||
|
||||
_context.Enemies.Update(enemy);
|
||||
_mapper.Map(parameter.Enemy, enemy);
|
||||
var count = await _context.SaveChangesAsync();
|
||||
_logger.LogInformation($"Updated enemy '{enemy.EnemyId}' ({count} rows)");
|
||||
return new ApiResponse<SaveEnemyResponse>(new SaveEnemyResponse(enemy.EnemyId));
|
||||
}
|
||||
return await CreateEnemy(parameter);
|
||||
return await UpdateEnemy(parameter);
|
||||
}
|
||||
|
||||
public async Task<ApiResponse<DeleteEnemyResponse>> DeleteEnemy(DeleteEnemyParameter parameter)
|
||||
@@ -98,5 +81,48 @@ namespace EstusShots.Server.Services
|
||||
_logger.LogInformation($"Deleted enemy '{parameter.EnemyId}' ({count} rows)");
|
||||
return new ApiResponse<DeleteEnemyResponse>(new DeleteEnemyResponse());
|
||||
}
|
||||
|
||||
// Private Methods
|
||||
|
||||
private async Task<ApiResponse<SaveEnemyResponse>> CreateEnemy(SaveEnemyParameter parameter)
|
||||
{
|
||||
var enemy = _mapper.Map<Enemy>(parameter.Enemy);
|
||||
_context.Enemies.Add(enemy);
|
||||
var count = await _context.SaveChangesAsync();
|
||||
_logger.LogInformation($"Created enemy '{enemy.EnemyId}' ({count} rows)");
|
||||
|
||||
// Relation mapping
|
||||
enemy.SeasonEnemies = new List<SeasonEnemy>();
|
||||
foreach (var season in parameter.Enemy.Seasons)
|
||||
{
|
||||
var relation = new SeasonEnemy
|
||||
{
|
||||
SeasonId = season.SeasonId,
|
||||
EnemyId = enemy.EnemyId
|
||||
};
|
||||
enemy.SeasonEnemies.Add(relation);
|
||||
}
|
||||
|
||||
count = await _context.SaveChangesAsync();
|
||||
_logger.LogInformation($"Added enemy '{enemy.EnemyId}' to {parameter.Enemy.Seasons.Count} seasons ({count} rows)");
|
||||
|
||||
return new ApiResponse<SaveEnemyResponse>(new SaveEnemyResponse(enemy.EnemyId));
|
||||
}
|
||||
|
||||
private async Task<ApiResponse<SaveEnemyResponse>> UpdateEnemy(SaveEnemyParameter parameter)
|
||||
{
|
||||
var enemy = await _context.Enemies.FindAsync(parameter.Enemy.EnemyId);
|
||||
if (enemy == null)
|
||||
{
|
||||
_logger.LogError($"Enemy '{parameter.Enemy.EnemyId}' not found in database");
|
||||
return new ApiResponse<SaveEnemyResponse>(new OperationResult(false, "Object not found"));
|
||||
}
|
||||
|
||||
_context.Enemies.Update(enemy);
|
||||
_mapper.Map(parameter.Enemy, enemy);
|
||||
var count = await _context.SaveChangesAsync();
|
||||
_logger.LogInformation($"Updated enemy '{enemy.EnemyId}' ({count} rows)");
|
||||
return new ApiResponse<SaveEnemyResponse>(new SaveEnemyResponse(enemy.EnemyId));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,29 +23,29 @@ namespace EstusShots.Server.Services
|
||||
modelBuilder.Entity<Drink>().ToTable(nameof(Drink));
|
||||
modelBuilder.Entity<Player>().ToTable(nameof(Player));
|
||||
|
||||
modelBuilder.Entity<EpisodePlayers>()
|
||||
modelBuilder.Entity<EpisodePlayer>()
|
||||
.HasKey(t => new {t.EpisodeId, t.PlayerId});
|
||||
|
||||
modelBuilder.Entity<EpisodePlayers>()
|
||||
modelBuilder.Entity<EpisodePlayer>()
|
||||
.HasOne(pt => pt.Episode)
|
||||
.WithMany(p => p.EpisodePlayers)
|
||||
.HasForeignKey(pt => pt.EpisodeId);
|
||||
|
||||
modelBuilder.Entity<EpisodePlayers>()
|
||||
modelBuilder.Entity<EpisodePlayer>()
|
||||
.HasOne(pt => pt.Player)
|
||||
.WithMany(t => t.EpisodePlayers)
|
||||
.HasForeignKey(pt => pt.PlayerId);
|
||||
|
||||
|
||||
modelBuilder.Entity<SeasonEnemies>()
|
||||
modelBuilder.Entity<SeasonEnemy>()
|
||||
.HasKey(t => new {t.SeasonId, t.EnemyId});
|
||||
|
||||
modelBuilder.Entity<SeasonEnemies>()
|
||||
modelBuilder.Entity<SeasonEnemy>()
|
||||
.HasOne(pt => pt.Season)
|
||||
.WithMany(p => p.SeasonEnemies)
|
||||
.HasForeignKey(pt => pt.SeasonId);
|
||||
|
||||
modelBuilder.Entity<SeasonEnemies>()
|
||||
modelBuilder.Entity<SeasonEnemy>()
|
||||
.HasOne(pt => pt.Enemy)
|
||||
.WithMany(t => t.SeasonEnemies)
|
||||
.HasForeignKey(pt => pt.EnemyId);
|
||||
|
||||
@@ -13,8 +13,6 @@ namespace EstusShots.Shared.Dto
|
||||
|
||||
public bool Defeated { get; set; }
|
||||
|
||||
public Guid? SeasonId { get; set; }
|
||||
|
||||
public List<Season> Seasons { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user