From 3f164b7e176953e764c68df14fcae7edd0f18633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20G=C3=B3reczny?= Date: Fri, 22 Jan 2021 08:00:03 +0100 Subject: [PATCH] extra methods --- .../Interfaces/IShopkeeperService.cs | 1 + .../Profiles/ShopkeeperItemsProfile.cs | 6 +++ .../Profiles/ShopkeeperProfile.cs | 3 ++ .../Services/ShopkeeperService.cs | 22 ++++++++++- .../ShopkeeperItemDetailsViewModel.cs | 38 ++++++++++++++++++ .../ShopkeeperItemViewModel.cs | 6 +++ .../ShopkeeperWithItemsDetailsViewModel.cs | 30 ++++++++++++++ ...game-master-shopkeepers-table.component.ts | 6 +-- .../src/services/shopkeeper.service.ts | 10 ++++- .../Controllers/ShopkeeperController.cs | 39 +++++++++++++++++-- 10 files changed, 153 insertions(+), 8 deletions(-) create mode 100644 SessionCompanion/SessionCompanion.ViewModels/ShopkeeperItemViewModels/ShopkeeperItemDetailsViewModel.cs create mode 100644 SessionCompanion/SessionCompanion.ViewModels/ShopkeeperViewModels/ShopkeeperWithItemsDetailsViewModel.cs diff --git a/SessionCompanion/SessionCompanion.Services/Interfaces/IShopkeeperService.cs b/SessionCompanion/SessionCompanion.Services/Interfaces/IShopkeeperService.cs index 98f974c..9043682 100644 --- a/SessionCompanion/SessionCompanion.Services/Interfaces/IShopkeeperService.cs +++ b/SessionCompanion/SessionCompanion.Services/Interfaces/IShopkeeperService.cs @@ -15,5 +15,6 @@ namespace SessionCompanion.Services.Interfaces { Task> CreateNewShopKeeper(ShopkeeperWithItemsViewModel shopkeeperWithItemsViewModel); Task> ChangeShopkeeperStatus(int shopkeeperId, bool availability); + Task> GetActiveShkopkeeperWithItems(); } } diff --git a/SessionCompanion/SessionCompanion.Services/Profiles/ShopkeeperItemsProfile.cs b/SessionCompanion/SessionCompanion.Services/Profiles/ShopkeeperItemsProfile.cs index 5897825..ebf0f75 100644 --- a/SessionCompanion/SessionCompanion.Services/Profiles/ShopkeeperItemsProfile.cs +++ b/SessionCompanion/SessionCompanion.Services/Profiles/ShopkeeperItemsProfile.cs @@ -9,11 +9,17 @@ using System.Threading.Tasks; namespace SessionCompanion.Services.Profiles { + using SessionCompanion.ViewModels.ShopkeeperItemViewModels; + public class ShopkeeperItemsProfile : Profile { public ShopkeeperItemsProfile() { CreateMap().ReverseMap(); + + CreateMap() + .ForMember(vm => vm.Armor, conf => conf.MapFrom(item => item.Armor)) + .ForMember(vm => vm.Weapon, conf => conf.MapFrom(item => item.Weapon)).ReverseMap(); } } } diff --git a/SessionCompanion/SessionCompanion.Services/Profiles/ShopkeeperProfile.cs b/SessionCompanion/SessionCompanion.Services/Profiles/ShopkeeperProfile.cs index b09f4e0..011a41d 100644 --- a/SessionCompanion/SessionCompanion.Services/Profiles/ShopkeeperProfile.cs +++ b/SessionCompanion/SessionCompanion.Services/Profiles/ShopkeeperProfile.cs @@ -16,6 +16,9 @@ namespace SessionCompanion.Services.Profiles CreateMap().ReverseMap(); CreateMap() .ForMember(vm => vm.Items, conf => conf.MapFrom(items => items.ShopkeeperItems)).ReverseMap(); + + CreateMap() + .ForMember(vm => vm.Items, conf => conf.MapFrom(items => items.ShopkeeperItems)).ReverseMap(); } } } diff --git a/SessionCompanion/SessionCompanion.Services/Services/ShopkeeperService.cs b/SessionCompanion/SessionCompanion.Services/Services/ShopkeeperService.cs index 9fe75c5..1b2b56f 100644 --- a/SessionCompanion/SessionCompanion.Services/Services/ShopkeeperService.cs +++ b/SessionCompanion/SessionCompanion.Services/Services/ShopkeeperService.cs @@ -19,6 +19,7 @@ namespace SessionCompanion.Services.Services { public ShopkeeperService(IMapper mapper, IRepository repository) : base(mapper, repository) { } + /// /// Funkcja zmienia status sprzedawcy /// @@ -55,12 +56,13 @@ namespace SessionCompanion.Services.Services return new ErrorResponse() { StatusCode = 500, Message = e.Message }; } } + public async Task> CreateNewShopKeeper(ShopkeeperWithItemsViewModel shopkeeperWithItemsViewModel) { try { var activeShopkeeper = await Repository.Get(c => c.IsAvailable.Equals(true)).SingleAsync(); - if (activeShopkeeper is not null && shopkeeperWithItemsViewModel.IsAvailable) + if (activeShopkeeper != null && shopkeeperWithItemsViewModel.IsAvailable) { activeShopkeeper.IsAvailable = false; await Repository.Update(activeShopkeeper); @@ -75,5 +77,23 @@ namespace SessionCompanion.Services.Services return new ErrorResponse() { StatusCode = 500, Message = e.Message }; } } + + public async Task> GetActiveShkopkeeperWithItems() + { + try + { + var activeShopkeeper = await Repository.Get(c => c.IsAvailable.Equals(true)) + .Include(t => t.ShopkeeperItems) + .ThenInclude(t => t.Armor) + .Include(t => t.ShopkeeperItems) + .ThenInclude(t => t.Weapon).SingleAsync(); + var result = Mapper.Map(activeShopkeeper); + return result; + } + catch (Exception e) + { + return new ErrorResponse() { StatusCode = 500, Message = e.Message }; + } + } } } diff --git a/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperItemViewModels/ShopkeeperItemDetailsViewModel.cs b/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperItemViewModels/ShopkeeperItemDetailsViewModel.cs new file mode 100644 index 0000000..574ae8b --- /dev/null +++ b/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperItemViewModels/ShopkeeperItemDetailsViewModel.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SessionCompanion.ViewModels.ShopkeeperItemViewModels +{ + using SessionCompanion.ViewModels.ArmorViewModels; + using SessionCompanion.ViewModels.WeaponViewModels; + + public class ShopkeeperItemDetailsViewModel + { + /// + /// Id Sprzedawcy + /// + public int? ShopkeeperId { get; set; } + + /// + /// Id zbroi + /// + public int? ArmorId { get; set; } + + public ArmorViewModel Armor { get; set; } + + /// + /// Id broni + /// + public int? WeaponId { get; set; } + + public WeaponViewModel Weapon { get; set; } + + /// + /// Ilość przedmiotu + /// + public int Amount { get; set; } + } +} diff --git a/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperItemViewModels/ShopkeeperItemViewModel.cs b/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperItemViewModels/ShopkeeperItemViewModel.cs index ca6e236..3298aab 100644 --- a/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperItemViewModels/ShopkeeperItemViewModel.cs +++ b/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperItemViewModels/ShopkeeperItemViewModel.cs @@ -6,20 +6,26 @@ using System.Threading.Tasks; namespace SessionCompanion.ViewModels.ShopkeeperItemsViewModels { + using SessionCompanion.ViewModels.ArmorViewModels; + using SessionCompanion.ViewModels.WeaponViewModels; + public class ShopkeeperItemViewModel { /// /// Id Sprzedawcy /// public int? ShopkeeperId { get; set; } + /// /// Id zbroi /// public int? ArmorId { get; set; } + /// /// Id broni /// public int? WeaponId { get; set; } + /// /// Ilość przedmiotu /// diff --git a/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperViewModels/ShopkeeperWithItemsDetailsViewModel.cs b/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperViewModels/ShopkeeperWithItemsDetailsViewModel.cs new file mode 100644 index 0000000..550f00c --- /dev/null +++ b/SessionCompanion/SessionCompanion.ViewModels/ShopkeeperViewModels/ShopkeeperWithItemsDetailsViewModel.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SessionCompanion.ViewModels.ShopkeeperViewModels +{ + using SessionCompanion.ViewModels.ShopkeeperItemViewModels; + + public class ShopkeeperWithItemsDetailsViewModel + { + public int? Id { get; set; } + + /// + /// Nazwa sklepikarza + /// + public string Name { get; set; } + + /// + /// Status sklepikarza + /// + public bool IsAvailable { get; set; } + + /// + /// Lista przedmiotów danego sklepikarza + /// + public IEnumerable Items { get; set; } + } +} diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/game-master-shopkeepers-table/game-master-shopkeepers-table.component.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/game-master-shopkeepers-table/game-master-shopkeepers-table.component.ts index 7af7760..6c6a000 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/game-master-shopkeepers-table/game-master-shopkeepers-table.component.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/game-master-shopkeepers-table/game-master-shopkeepers-table.component.ts @@ -46,13 +46,13 @@ export class GameMasterShopkeepersTableComponent implements OnInit { ActivateShopkeeper(shopkeeperId: number) { if (this.dataSource.data.find((e) => e.isAvailable) != null) { this.dataSource.data.find((e) => e.id == shopkeeperId).isAvailable = true; - //TODO podpięcie pod backend zmianę + this.shopkeeperService.ChangeShopkeeperStatus(shopkeeperId, true); } } DeactivateShopkeeper(shopkeeperId: number) { - this.dataSource.data.find((e) => e.id == shopkeeperId).isAvailable = true; - //TODO podpięcie pod backend zmianę + this.dataSource.data.find((e) => e.id == shopkeeperId).isAvailable = false; + this.shopkeeperService.ChangeShopkeeperStatus(shopkeeperId, false); } applyFilter(event: Event) { diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/services/shopkeeper.service.ts b/SessionCompanion/SessionCompanion/ClientApp/src/services/shopkeeper.service.ts index d4a8451..2ac9a1e 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/services/shopkeeper.service.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/services/shopkeeper.service.ts @@ -1,10 +1,11 @@ import { Inject, Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable, of, throwError } from 'rxjs'; import { ShopkeeperViewModel } from '../types/viewmodels/shopkeeper-viewmodels/ShopkeeperViewModel'; import { Either } from '../types/Either'; import { ErrorResponse } from '../types/ErrorResponse'; import { switchMap } from 'rxjs/operators'; +import { SuccessResponse } from '../types/SuccessResponse'; Injectable({ providedIn: 'root', @@ -31,4 +32,11 @@ export class ShopkeeperService { }) ); } + + ChangeShopkeeperStatus(shopkeeperId: number, newStatus: boolean) { + const params = new HttpParams() + .set('shopkeeperId', shopkeeperId.toString()) + .set('availability', newStatus.toString()); + this.http.post(this.baseUrl + 'getShopkeepers', params); + } } diff --git a/SessionCompanion/SessionCompanion/Controllers/ShopkeeperController.cs b/SessionCompanion/SessionCompanion/Controllers/ShopkeeperController.cs index c58a98f..f277311 100644 --- a/SessionCompanion/SessionCompanion/Controllers/ShopkeeperController.cs +++ b/SessionCompanion/SessionCompanion/Controllers/ShopkeeperController.cs @@ -11,15 +11,21 @@ using System.Threading.Tasks; namespace SessionCompanion.Controllers { + using Microsoft.AspNetCore.SignalR; + + using SessionCompanion.Hubs; [ApiController] [Route("api/shopkeeper")] public class ShopkeeperController : Controller { private IShopkeeperService _service; - public ShopkeeperController(IShopkeeperService shopkeeperService) + private IHubContext _sessionHub; + + public ShopkeeperController(IShopkeeperService shopkeeperService, IHubContext sessionHub) { - _service = shopkeeperService; + this._service = shopkeeperService; + this._sessionHub = sessionHub; } /// @@ -32,6 +38,16 @@ namespace SessionCompanion.Controllers return _service.Get().ToList(); } + /// + /// Endpoint zwracający aktywnego sklepikarza + /// + /// Lista sklepikarzy + [HttpGet("getActiveShopkeeper")] + public async Task> GetActiveShopkeepers() + { + return await _service.GetActiveShkopkeeperWithItems(); + } + /// /// Endpoint służacy do zmiany statusu sklepikarza /// @@ -41,7 +57,13 @@ namespace SessionCompanion.Controllers [HttpPut("changeShopkeeperStatus")] public async Task> ChangeShopkeeperStatus([Required] int shopkeeperId, [Required] bool availability) { - return await _service.ChangeShopkeeperStatus(shopkeeperId, availability); + var result = await _service.ChangeShopkeeperStatus(shopkeeperId, availability); + if (result.IsLeft && availability) + { + await this._sessionHub.Clients.Group("Players").SendAsync("NewShopkeeperArrived"); + } + + return result; } [HttpPost("createNewShopkeeper")] @@ -51,5 +73,16 @@ namespace SessionCompanion.Controllers return new ErrorResponse() { StatusCode = 500, Message = "Model is invalid" }; return await _service.CreateNewShopKeeper(shopkeeperWithItemsViewModel); } + + [HttpPost("removeShopkeeper")] + public async Task> RemoveShopkeeper([Required] int shopkeeperId) + { + await this._service.Delete(shopkeeperId); + await this._service.SaveAsync(); + + await this._sessionHub.Clients.Group("Players").SendAsync("ShopkeeperRemoved"); + + return new SuccessResponse("Delete completed"); + } } }