From b9e7ae45f620402987fc1fca2af2597144428cad Mon Sep 17 00:00:00 2001 From: luxick Date: Sat, 7 Mar 2020 11:29:00 +0100 Subject: [PATCH] Implement EnemiesService.cs --- EstusShots.Server/Models/Enemy.cs | 5 +- EstusShots.Server/Models/Season.cs | 2 +- EstusShots.Server/Models/SeasonEnemies.cs | 13 ++++ EstusShots.Server/Services/EnemiesService.cs | 75 +++++++++++++++++-- .../Services/EstusShotsContext.cs | 18 +++++ EstusShots.Shared/Dto/Enemy.cs | 4 +- 6 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 EstusShots.Server/Models/SeasonEnemies.cs diff --git a/EstusShots.Server/Models/Enemy.cs b/EstusShots.Server/Models/Enemy.cs index 98c1429..2e78950 100644 --- a/EstusShots.Server/Models/Enemy.cs +++ b/EstusShots.Server/Models/Enemy.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace EstusShots.Server.Models @@ -13,8 +14,6 @@ namespace EstusShots.Server.Models public bool Defeated { get; set; } - public Guid? SeasonId { get; set; } - - public Season? Season { get; set; } + public ICollection SeasonEnemies { get; set; } = default!; } } \ No newline at end of file diff --git a/EstusShots.Server/Models/Season.cs b/EstusShots.Server/Models/Season.cs index 6965b0b..a29c82c 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 List Enemies { 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/SeasonEnemies.cs new file mode 100644 index 0000000..c1642aa --- /dev/null +++ b/EstusShots.Server/Models/SeasonEnemies.cs @@ -0,0 +1,13 @@ +using System; + +namespace EstusShots.Server.Models +{ + public class SeasonEnemies + { + public Guid SeasonId { get; set; } = default!; + public Season Season { get; set; } = default!; + + public Guid EnemyId { get; set; } = default!; + public Enemy Enemy { get; set; } = default!; + } +} \ No newline at end of file diff --git a/EstusShots.Server/Services/EnemiesService.cs b/EstusShots.Server/Services/EnemiesService.cs index 4f0620a..ccbc04f 100644 --- a/EstusShots.Server/Services/EnemiesService.cs +++ b/EstusShots.Server/Services/EnemiesService.cs @@ -1,9 +1,14 @@ +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using AutoMapper; +using EstusShots.Server.Models; using EstusShots.Shared.Interfaces; using EstusShots.Shared.Models; using EstusShots.Shared.Models.Parameters; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using Dto = EstusShots.Shared.Dto; namespace EstusShots.Server.Services { @@ -20,24 +25,78 @@ namespace EstusShots.Server.Services _context = context; } - public Task> GetEnemies(GetEnemiesParameter parameter) + public async Task> GetEnemies(GetEnemiesParameter parameter) { - throw new System.NotImplementedException(); + List enemies; + if (parameter.SeasonId.IsEmpty()) + { + enemies = await _context.Enemies.ToListAsync(); + _logger.LogInformation($"Found {enemies.Count} enemies in database"); + } + else + { + enemies = await _context.Enemies + .Where(e => e.SeasonEnemies.Any(x => x.SeasonId == parameter.SeasonId)) + .ToListAsync(); + _logger.LogInformation($"Found {enemies.Count} enemies for season '{parameter.SeasonId}'"); + } + var dtos = _mapper.Map>(enemies); + return new ApiResponse(new GetEnemiesResponse(dtos)); } - public Task> GetEnemy(GetEnemyParameter parameter) + public async Task> GetEnemy(GetEnemyParameter parameter) { - throw new System.NotImplementedException(); + var enemy = await _context.Enemies.FindAsync(parameter.EnemyId); + if (enemy == null) + { + _logger.LogWarning($"Enemy {parameter.EnemyId} not found in database"); + return new ApiResponse(new OperationResult(false, "Object not found")); + } + + var dto = _mapper.Map(enemy); + return new ApiResponse(new GetEnemyResponse(dto)); } - public Task> SaveEnemy(SaveEnemyParameter parameter) + public async Task> SaveEnemy(SaveEnemyParameter parameter) { - throw new System.NotImplementedException(); + 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)); + } } - public Task> DeleteEnemy(DeleteEnemyParameter parameter) + public async Task> DeleteEnemy(DeleteEnemyParameter parameter) { - throw new System.NotImplementedException(); + var enemy = await _context.Enemies.FindAsync(parameter.EnemyId); + if (enemy == null) + { + _logger.LogError($"Enemy '{parameter.EnemyId}' not found in database"); + return new ApiResponse(new OperationResult(false, "Object not found")); + } + + _context.Enemies.Remove(enemy); + var count = _context.SaveChangesAsync(); + _logger.LogInformation($"Deleted enemy '{parameter.EnemyId}' ({count} rows)"); + return new ApiResponse(new DeleteEnemyResponse()); } } } \ No newline at end of file diff --git a/EstusShots.Server/Services/EstusShotsContext.cs b/EstusShots.Server/Services/EstusShotsContext.cs index 181e324..4b96f96 100644 --- a/EstusShots.Server/Services/EstusShotsContext.cs +++ b/EstusShots.Server/Services/EstusShotsContext.cs @@ -13,11 +13,15 @@ namespace EstusShots.Server.Services public DbSet Episodes { get; set; } = default!; public DbSet Players { get; set; } = default!; public DbSet Drinks { get; set; } = default!; + public DbSet Enemies { get; set; } = default!; protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().ToTable(nameof(Season)); modelBuilder.Entity().ToTable(nameof(Episode)); + modelBuilder.Entity().ToTable(nameof(Enemy)); + modelBuilder.Entity().ToTable(nameof(Drink)); + modelBuilder.Entity().ToTable(nameof(Player)); modelBuilder.Entity() .HasKey(t => new {t.EpisodeId, t.PlayerId}); @@ -31,6 +35,20 @@ namespace EstusShots.Server.Services .HasOne(pt => pt.Player) .WithMany(t => t.EpisodePlayers) .HasForeignKey(pt => pt.PlayerId); + + + modelBuilder.Entity() + .HasKey(t => new {t.SeasonId, t.EnemyId}); + + modelBuilder.Entity() + .HasOne(pt => pt.Season) + .WithMany(p => p.SeasonEnemies) + .HasForeignKey(pt => pt.SeasonId); + + modelBuilder.Entity() + .HasOne(pt => pt.Enemy) + .WithMany(t => t.SeasonEnemies) + .HasForeignKey(pt => pt.EnemyId); } } } \ No newline at end of file diff --git a/EstusShots.Shared/Dto/Enemy.cs b/EstusShots.Shared/Dto/Enemy.cs index 5448b0a..13ca89a 100644 --- a/EstusShots.Shared/Dto/Enemy.cs +++ b/EstusShots.Shared/Dto/Enemy.cs @@ -1,5 +1,5 @@ using System; -using System.ComponentModel.DataAnnotations; +using System.Collections.Generic; namespace EstusShots.Shared.Dto { @@ -15,6 +15,6 @@ namespace EstusShots.Shared.Dto public Guid? SeasonId { get; set; } - public Season Season { get; set; } + public List Seasons { get; set; } } } \ No newline at end of file