using System; using System.Collections.Generic; using System.Text; namespace SessionCompanion.Services.Services { using System.Linq; using System.Threading.Tasks; using AutoMapper; using Microsoft.EntityFrameworkCore; using SessionCompanion.Database.Repositories.Base; using SessionCompanion.Database.Tables; using SessionCompanion.Services.Base; using SessionCompanion.Services.Interfaces; using SessionCompanion.ViewModels.ApiResponses; using SessionCompanion.ViewModels.CharacterArmorViewModels; using SessionCompanion.Extensions.EitherType; using SessionCompanion.ViewModels.CharacterOtherEquipmentViewModels; public class CharacterArmorService : ServiceBase, ICharacterArmorService { public CharacterArmorService(IMapper mapper, IRepository repository) : base(mapper, repository) { } public async Task> ChangeCharacterArmor(int characterId, int newArmorId) { CharacterArmor armorInUse = new CharacterArmor(); CharacterArmor armorToUse = new CharacterArmor(); try { armorInUse = await Repository.Get(c => c.CharacterId.Equals(characterId)) .Include(a => a.Armor).Where(x => x.InUse == true).SingleAsync(); armorToUse = await Repository.Get(c => c.ArmorId.Equals(newArmorId) && c.CharacterId.Equals(characterId)).SingleAsync(); } catch (Exception e) { return new ErrorResponse() { StatusCode = 500, Message = e.Message }; } if (armorToUse is null) return new ErrorResponse() { StatusCode = 204, Message = "No armor to change to" }; if (armorInUse is null) { armorToUse.InUse = true; try { await Repository.Update(armorToUse); await Repository.Save(); return new SuccessResponse("Character armor updated") { StatusCode = 200 }; } catch (Exception e) { return new ErrorResponse() { StatusCode = 500, Message = e.Message }; } } armorInUse.InUse = false; armorToUse.InUse = true; try { await Repository.Update(armorInUse); await Repository.Update(armorToUse); await Repository.Save(); return new SuccessResponse("Character armor updated") { StatusCode = 204 }; } catch (Exception e) { return new ErrorResponse() { StatusCode = 500, Message = e.Message }; } } /// /// Metoda pobiera listę pancerzy konkretnej postaci /// /// Id postaci /// Lista pancerzy posiadanych przez postać public async Task> GetCharacterArmorsTaskList(int characterId) { var characterWeapons = await Repository.Get().Where(a => a.CharacterId.Equals(characterId)).Include(a => a.Armor).ToListAsync(); var result = Mapper.Map>(characterWeapons); return result; } } }