Save enemy-season relationship

This commit is contained in:
2020-03-12 22:09:45 +01:00
parent 2262340754
commit 83eb680cc9
10 changed files with 65 additions and 39 deletions

View File

@@ -1,3 +1,4 @@
using System.Linq;
using AutoMapper; using AutoMapper;
using EstusShots.Server.Models; using EstusShots.Server.Models;
@@ -19,7 +20,8 @@ namespace EstusShots.Server.Mapping
CreateMap<Drink, Shared.Dto.Drink>(); CreateMap<Drink, Shared.Dto.Drink>();
CreateMap<Shared.Dto.Drink, 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>(); CreateMap<Shared.Dto.Enemy, Enemy>();
} }
} }

View File

@@ -14,6 +14,6 @@ namespace EstusShots.Server.Models
public bool Defeated { get; set; } public bool Defeated { get; set; }
public ICollection<SeasonEnemies> SeasonEnemies { get; set; } = default!; public ICollection<SeasonEnemy> SeasonEnemies { get; set; } = default!;
} }
} }

View File

@@ -23,6 +23,6 @@ namespace EstusShots.Server.Models
public Season Season { get; set; } = default!; public Season Season { get; set; } = default!;
public ICollection<EpisodePlayers> EpisodePlayers { get; set; } = default!; public ICollection<EpisodePlayer> EpisodePlayers { get; set; } = default!;
} }
} }

View File

@@ -2,7 +2,7 @@ using System;
namespace EstusShots.Server.Models namespace EstusShots.Server.Models
{ {
public class EpisodePlayers public class EpisodePlayer
{ {
public Guid EpisodeId { get; set; } = default!; public Guid EpisodeId { get; set; } = default!;
public Episode Episode { get; set; } = default!; public Episode Episode { get; set; } = default!;

View File

@@ -18,6 +18,6 @@ namespace EstusShots.Server.Models
public string DisplayName => Anonymous ? Alias : Name; public string DisplayName => Anonymous ? Alias : Name;
public ICollection<EpisodePlayers> EpisodePlayers { get; set; } = default!; public ICollection<EpisodePlayer> EpisodePlayers { get; set; } = default!;
} }
} }

View File

@@ -20,6 +20,6 @@ namespace EstusShots.Server.Models
public List<Episode> Episodes { get; set; } = default!; public List<Episode> Episodes { get; set; } = default!;
public ICollection<SeasonEnemies> SeasonEnemies { get; set; } = default!; public ICollection<SeasonEnemy> SeasonEnemies { get; set; } = default!;
} }
} }

View File

@@ -2,7 +2,7 @@ using System;
namespace EstusShots.Server.Models namespace EstusShots.Server.Models
{ {
public class SeasonEnemies public class SeasonEnemy
{ {
public Guid SeasonId { get; set; } = default!; public Guid SeasonId { get; set; } = default!;
public Season Season { get; set; } = default!; public Season Season { get; set; } = default!;

View File

@@ -30,12 +30,15 @@ namespace EstusShots.Server.Services
List<Enemy> enemies; List<Enemy> enemies;
if (parameter.SeasonId.IsEmpty()) 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"); _logger.LogInformation($"Found {enemies.Count} enemies in database");
} }
else else
{ {
enemies = await _context.Enemies enemies = await _context.Enemies
.Include("SeasonEnemies.Season")
.Where(e => e.SeasonEnemies.Any(x => x.SeasonId == parameter.SeasonId)) .Where(e => e.SeasonEnemies.Any(x => x.SeasonId == parameter.SeasonId))
.ToListAsync(); .ToListAsync();
_logger.LogInformation($"Found {enemies.Count} enemies for season '{parameter.SeasonId}'"); _logger.LogInformation($"Found {enemies.Count} enemies for season '{parameter.SeasonId}'");
@@ -59,29 +62,9 @@ namespace EstusShots.Server.Services
public async Task<ApiResponse<SaveEnemyResponse>> SaveEnemy(SaveEnemyParameter parameter) public async Task<ApiResponse<SaveEnemyResponse>> SaveEnemy(SaveEnemyParameter parameter)
{ {
if (parameter.Enemy.EnemyId.IsEmpty()) if (parameter.Enemy.EnemyId.IsEmpty())
{ return await CreateEnemy(parameter);
var enemy = _mapper.Map<Enemy>(parameter.Enemy); return await UpdateEnemy(parameter);
_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));
}
} }
public async Task<ApiResponse<DeleteEnemyResponse>> DeleteEnemy(DeleteEnemyParameter 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)"); _logger.LogInformation($"Deleted enemy '{parameter.EnemyId}' ({count} rows)");
return new ApiResponse<DeleteEnemyResponse>(new DeleteEnemyResponse()); 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));
}
} }
} }

View File

@@ -23,29 +23,29 @@ namespace EstusShots.Server.Services
modelBuilder.Entity<Drink>().ToTable(nameof(Drink)); modelBuilder.Entity<Drink>().ToTable(nameof(Drink));
modelBuilder.Entity<Player>().ToTable(nameof(Player)); modelBuilder.Entity<Player>().ToTable(nameof(Player));
modelBuilder.Entity<EpisodePlayers>() modelBuilder.Entity<EpisodePlayer>()
.HasKey(t => new {t.EpisodeId, t.PlayerId}); .HasKey(t => new {t.EpisodeId, t.PlayerId});
modelBuilder.Entity<EpisodePlayers>() modelBuilder.Entity<EpisodePlayer>()
.HasOne(pt => pt.Episode) .HasOne(pt => pt.Episode)
.WithMany(p => p.EpisodePlayers) .WithMany(p => p.EpisodePlayers)
.HasForeignKey(pt => pt.EpisodeId); .HasForeignKey(pt => pt.EpisodeId);
modelBuilder.Entity<EpisodePlayers>() modelBuilder.Entity<EpisodePlayer>()
.HasOne(pt => pt.Player) .HasOne(pt => pt.Player)
.WithMany(t => t.EpisodePlayers) .WithMany(t => t.EpisodePlayers)
.HasForeignKey(pt => pt.PlayerId); .HasForeignKey(pt => pt.PlayerId);
modelBuilder.Entity<SeasonEnemies>() modelBuilder.Entity<SeasonEnemy>()
.HasKey(t => new {t.SeasonId, t.EnemyId}); .HasKey(t => new {t.SeasonId, t.EnemyId});
modelBuilder.Entity<SeasonEnemies>() modelBuilder.Entity<SeasonEnemy>()
.HasOne(pt => pt.Season) .HasOne(pt => pt.Season)
.WithMany(p => p.SeasonEnemies) .WithMany(p => p.SeasonEnemies)
.HasForeignKey(pt => pt.SeasonId); .HasForeignKey(pt => pt.SeasonId);
modelBuilder.Entity<SeasonEnemies>() modelBuilder.Entity<SeasonEnemy>()
.HasOne(pt => pt.Enemy) .HasOne(pt => pt.Enemy)
.WithMany(t => t.SeasonEnemies) .WithMany(t => t.SeasonEnemies)
.HasForeignKey(pt => pt.EnemyId); .HasForeignKey(pt => pt.EnemyId);

View File

@@ -13,8 +13,6 @@ namespace EstusShots.Shared.Dto
public bool Defeated { get; set; } public bool Defeated { get; set; }
public Guid? SeasonId { get; set; }
public List<Season> Seasons { get; set; } public List<Season> Seasons { get; set; }
} }
} }