diff --git a/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterWeaponService.cs b/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterWeaponService.cs index 8206eb9..ff02169 100644 --- a/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterWeaponService.cs +++ b/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterWeaponService.cs @@ -4,11 +4,14 @@ using SessionCompanion.ViewModels.CharacterWeaponViewModels; namespace SessionCompanion.Services.Interfaces { + using SessionCompanion.Extensions.EitherType; + using SessionCompanion.ViewModels.ApiResponses; using System.Collections.Generic; using System.Threading.Tasks; public interface ICharacterWeaponService : IServiceBase { Task> GetCharacterWeaponsList(int characterId); + Task> ChangeCharacterWeapon(CharacterWeaponViewModel model); } } diff --git a/SessionCompanion/SessionCompanion.Services/Services/CharacterWeaponService.cs b/SessionCompanion/SessionCompanion.Services/Services/CharacterWeaponService.cs index 2e54b32..cc840e0 100644 --- a/SessionCompanion/SessionCompanion.Services/Services/CharacterWeaponService.cs +++ b/SessionCompanion/SessionCompanion.Services/Services/CharacterWeaponService.cs @@ -12,6 +12,8 @@ namespace SessionCompanion.Services.Services using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; + using SessionCompanion.Extensions.EitherType; + using SessionCompanion.ViewModels.ApiResponses; public class CharacterWeaponService : ServiceBase, ICharacterWeaponService { @@ -30,5 +32,61 @@ namespace SessionCompanion.Services.Services var result = Mapper.Map>(characterWeapons); return result; } + + public async Task> ChangeCharacterWeapon(CharacterWeaponViewModel model) + { + // Dodaj optional rozbro postac + var weaponsInUse = await Repository.Get(c => c.CharacterId.Equals(model.CharacterId)).Where(w => w.InUse.Equals(true)).ToListAsync(); + + var weapon = Mapper.Map(model); + + if (weaponsInUse.Count() == 0) + { + // no weapon in use + // just use new one + await Repository.Update(weapon); + await Repository.Save(); + return new SuccessResponse("Weapon changed") { SuccessCode = 200 }; + } + + var weaponInBothHands = weaponsInUse.Where(w => w.HoldInLeftHand.Equals(true) && w.HoldInRightHand.Equals(true)); + + if ((model.HoldInLeftHand && model.HoldInRightHand) || (weaponInBothHands.Count() > 0)) + { + // our model weapon uses both hands + // or there is weapon already in both hands + foreach (var w in weaponsInUse) + { + w.InUse = false; + w.HoldInLeftHand = false; + w.HoldInRightHand = false; + await Repository.Update(w); + } + + await Repository.Update(weapon); + await Repository.Save(); + return new SuccessResponse("Weapon changed") { SuccessCode = 200 }; + } + + var weaponsToChange = weaponsInUse.Where(w => w.HoldInLeftHand.Equals(model.HoldInLeftHand) && w.HoldInRightHand.Equals(model.HoldInRightHand)); + if (weaponsToChange.Count() == 1) + { + // there is weapon in the same hand set as our + // we update it + var weaponToChange = weaponsToChange.Single(); + weaponToChange.InUse = false; + weaponToChange.HoldInLeftHand = false; + weaponToChange.HoldInRightHand = false; + await Repository.Update(weaponToChange); + await Repository.Update(weapon); + await Repository.Save(); + return new SuccessResponse("Weapon changed") { SuccessCode = 200 }; + } + + // weapon is armed in empty hand + await Repository.Update(weapon); + await Repository.Save(); + return new SuccessResponse("Weapon changed") { SuccessCode = 200 }; + } } } diff --git a/SessionCompanion/SessionCompanion/Controllers/EquipmentController.cs b/SessionCompanion/SessionCompanion/Controllers/EquipmentController.cs index 7793804..ac6fee8 100644 --- a/SessionCompanion/SessionCompanion/Controllers/EquipmentController.cs +++ b/SessionCompanion/SessionCompanion/Controllers/EquipmentController.cs @@ -86,6 +86,8 @@ namespace SessionCompanion.Controllers [HttpPut("addArmor")] public async Task> AddCharacterArmor(CharacterArmorViewModel characterArmorViewModel) { + if (!ModelState.IsValid) + return new ErrorResponse() { StatusCode = 500, Message = "Invalid model!" }; try { await _characterArmorService.Create(characterArmorViewModel); @@ -97,6 +99,7 @@ namespace SessionCompanion.Controllers return new ErrorResponse() { StatusCode = 500, Message = e.Message }; } } + /// /// Metoda dodaje Weapon do danej postaci /// @@ -118,5 +121,21 @@ namespace SessionCompanion.Controllers return new ErrorResponse() { StatusCode = 500, Message = e.Message }; } } + + [HttpPut("changeWeapon")] + public async Task> ChangeCharacterWeapon(CharacterWeaponViewModel characterWeaponViewModel) + { + if (!ModelState.IsValid) + return new ErrorResponse() { StatusCode = 500, Message = "Invalid model!" }; + try + { + var response = await _characterWeaponService.ChangeCharacterWeapon(characterWeaponViewModel); + return response; + } + catch (Exception e) + { + return new ErrorResponse() { StatusCode = 500, Message = e.Message }; + } + } } }