From 83eb680cc9459c2b96aa398b0b3e5381b0e3ac40 Mon Sep 17 00:00:00 2001 From: luxick Date: Thu, 12 Mar 2020 22:09:45 +0100 Subject: [PATCH] Save enemy-season relationship --- EstusShots.Server/Mapping/Profiles.cs | 4 +- EstusShots.Server/Models/Enemy.cs | 2 +- EstusShots.Server/Models/Episode.cs | 2 +- .../{EpisodePlayers.cs => EpisodePlayer.cs} | 2 +- EstusShots.Server/Models/Player.cs | 2 +- EstusShots.Server/Models/Season.cs | 2 +- .../{SeasonEnemies.cs => SeasonEnemy.cs} | 2 +- EstusShots.Server/Services/EnemiesService.cs | 74 +++++++++++++------ .../Services/EstusShotsContext.cs | 12 +-- EstusShots.Shared/Dto/Enemy.cs | 2 - 10 files changed, 65 insertions(+), 39 deletions(-) rename EstusShots.Server/Models/{EpisodePlayers.cs => EpisodePlayer.cs} (90%) rename EstusShots.Server/Models/{SeasonEnemies.cs => SeasonEnemy.cs} (90%) diff --git a/EstusShots.Server/Mapping/Profiles.cs b/EstusShots.Server/Mapping/Profiles.cs index fd5f4b0..ea08470 100644 --- a/EstusShots.Server/Mapping/Profiles.cs +++ b/EstusShots.Server/Mapping/Profiles.cs @@ -1,3 +1,4 @@ +using System.Linq; using AutoMapper; using EstusShots.Server.Models; @@ -19,7 +20,8 @@ namespace EstusShots.Server.Mapping CreateMap(); CreateMap(); - CreateMap(); + CreateMap() + .ForMember(x => x.Seasons, y => y.MapFrom(z => z.SeasonEnemies.Select(a => a.Season))); CreateMap(); } } diff --git a/EstusShots.Server/Models/Enemy.cs b/EstusShots.Server/Models/Enemy.cs index 2e78950..fb2d491 100644 --- a/EstusShots.Server/Models/Enemy.cs +++ b/EstusShots.Server/Models/Enemy.cs @@ -14,6 +14,6 @@ namespace EstusShots.Server.Models public bool Defeated { get; set; } - public ICollection SeasonEnemies { get; set; } = default!; + public ICollection SeasonEnemies { get; set; } = default!; } } \ No newline at end of file diff --git a/EstusShots.Server/Models/Episode.cs b/EstusShots.Server/Models/Episode.cs index 2d5498a..b395a9b 100644 --- a/EstusShots.Server/Models/Episode.cs +++ b/EstusShots.Server/Models/Episode.cs @@ -23,6 +23,6 @@ namespace EstusShots.Server.Models public Season Season { get; set; } = default!; - public ICollection EpisodePlayers { get; set; } = default!; + public ICollection EpisodePlayers { get; set; } = default!; } } \ No newline at end of file diff --git a/EstusShots.Server/Models/EpisodePlayers.cs b/EstusShots.Server/Models/EpisodePlayer.cs similarity index 90% rename from EstusShots.Server/Models/EpisodePlayers.cs rename to EstusShots.Server/Models/EpisodePlayer.cs index 54eb411..d7f0f45 100644 --- a/EstusShots.Server/Models/EpisodePlayers.cs +++ b/EstusShots.Server/Models/EpisodePlayer.cs @@ -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!; diff --git a/EstusShots.Server/Models/Player.cs b/EstusShots.Server/Models/Player.cs index 2ded57d..fae6964 100644 --- a/EstusShots.Server/Models/Player.cs +++ b/EstusShots.Server/Models/Player.cs @@ -18,6 +18,6 @@ namespace EstusShots.Server.Models public string DisplayName => Anonymous ? Alias : Name; - public ICollection EpisodePlayers { get; set; } = default!; + public ICollection EpisodePlayers { get; set; } = default!; } } \ No newline at end of file diff --git a/EstusShots.Server/Models/Season.cs b/EstusShots.Server/Models/Season.cs index a29c82c..4fc2ab5 100644 --- a/EstusShots.Server/Models/Season.cs +++ b/EstusShots.Server/Models/Season.cs @@ -20,6 +20,6 @@ namespace EstusShots.Server.Models public List Episodes { get; set; } = default!; - public ICollection SeasonEnemies { get; set; } = default!; + public ICollection SeasonEnemies { get; set; } = default!; } } \ No newline at end of file diff --git a/EstusShots.Server/Models/SeasonEnemies.cs b/EstusShots.Server/Models/SeasonEnemy.cs similarity index 90% rename from EstusShots.Server/Models/SeasonEnemies.cs rename to EstusShots.Server/Models/SeasonEnemy.cs index c1642aa..a829214 100644 --- a/EstusShots.Server/Models/SeasonEnemies.cs +++ b/EstusShots.Server/Models/SeasonEnemy.cs @@ -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!; diff --git a/EstusShots.Server/Services/EnemiesService.cs b/EstusShots.Server/Services/EnemiesService.cs index ccbc04f..73cea37 100644 --- a/EstusShots.Server/Services/EnemiesService.cs +++ b/EstusShots.Server/Services/EnemiesService.cs @@ -30,12 +30,15 @@ namespace EstusShots.Server.Services List 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}'"); @@ -59,29 +62,9 @@ namespace EstusShots.Server.Services public async Task> SaveEnemy(SaveEnemyParameter parameter) { - if (parameter.Enemy.EnemyId.IsEmpty()) - { - var enemy = _mapper.Map(parameter.Enemy); - _context.Enemies.Add(enemy); - var count = await _context.SaveChangesAsync(); - _logger.LogInformation($"Created enemy '{enemy.EnemyId}' ({count} rows)"); - return new ApiResponse(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(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(new SaveEnemyResponse(enemy.EnemyId)); - } + if (parameter.Enemy.EnemyId.IsEmpty()) + return await CreateEnemy(parameter); + return await UpdateEnemy(parameter); } public async Task> DeleteEnemy(DeleteEnemyParameter parameter) @@ -98,5 +81,48 @@ namespace EstusShots.Server.Services _logger.LogInformation($"Deleted enemy '{parameter.EnemyId}' ({count} rows)"); return new ApiResponse(new DeleteEnemyResponse()); } + + // Private Methods + + private async Task> CreateEnemy(SaveEnemyParameter parameter) + { + var enemy = _mapper.Map(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(); + 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(new SaveEnemyResponse(enemy.EnemyId)); + } + + private async Task> 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(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(new SaveEnemyResponse(enemy.EnemyId)); + } } } \ No newline at end of file diff --git a/EstusShots.Server/Services/EstusShotsContext.cs b/EstusShots.Server/Services/EstusShotsContext.cs index 4b96f96..f5452d4 100644 --- a/EstusShots.Server/Services/EstusShotsContext.cs +++ b/EstusShots.Server/Services/EstusShotsContext.cs @@ -23,29 +23,29 @@ namespace EstusShots.Server.Services modelBuilder.Entity().ToTable(nameof(Drink)); modelBuilder.Entity().ToTable(nameof(Player)); - modelBuilder.Entity() + modelBuilder.Entity() .HasKey(t => new {t.EpisodeId, t.PlayerId}); - modelBuilder.Entity() + modelBuilder.Entity() .HasOne(pt => pt.Episode) .WithMany(p => p.EpisodePlayers) .HasForeignKey(pt => pt.EpisodeId); - modelBuilder.Entity() + modelBuilder.Entity() .HasOne(pt => pt.Player) .WithMany(t => t.EpisodePlayers) .HasForeignKey(pt => pt.PlayerId); - modelBuilder.Entity() + modelBuilder.Entity() .HasKey(t => new {t.SeasonId, t.EnemyId}); - modelBuilder.Entity() + modelBuilder.Entity() .HasOne(pt => pt.Season) .WithMany(p => p.SeasonEnemies) .HasForeignKey(pt => pt.SeasonId); - modelBuilder.Entity() + modelBuilder.Entity() .HasOne(pt => pt.Enemy) .WithMany(t => t.SeasonEnemies) .HasForeignKey(pt => pt.EnemyId); diff --git a/EstusShots.Shared/Dto/Enemy.cs b/EstusShots.Shared/Dto/Enemy.cs index 13ca89a..aefc103 100644 --- a/EstusShots.Shared/Dto/Enemy.cs +++ b/EstusShots.Shared/Dto/Enemy.cs @@ -13,8 +13,6 @@ namespace EstusShots.Shared.Dto public bool Defeated { get; set; } - public Guid? SeasonId { get; set; } - public List Seasons { get; set; } } } \ No newline at end of file