SES-160 shop on gm and player screen #85

Merged
s426128 merged 11 commits from SES-160 into dev 2021-01-23 21:50:04 +01:00
10 changed files with 153 additions and 8 deletions
Showing only changes of commit 3f164b7e17 - Show all commits

View File

@ -15,5 +15,6 @@ namespace SessionCompanion.Services.Interfaces
{ {
Task<Either<SuccessResponse, ErrorResponse>> CreateNewShopKeeper(ShopkeeperWithItemsViewModel shopkeeperWithItemsViewModel); Task<Either<SuccessResponse, ErrorResponse>> CreateNewShopKeeper(ShopkeeperWithItemsViewModel shopkeeperWithItemsViewModel);
Task<Either<SuccessResponse, ErrorResponse>> ChangeShopkeeperStatus(int shopkeeperId, bool availability); Task<Either<SuccessResponse, ErrorResponse>> ChangeShopkeeperStatus(int shopkeeperId, bool availability);
Task<Either<ShopkeeperWithItemsDetailsViewModel, ErrorResponse>> GetActiveShkopkeeperWithItems();
} }
} }

View File

@ -9,11 +9,17 @@ using System.Threading.Tasks;
namespace SessionCompanion.Services.Profiles namespace SessionCompanion.Services.Profiles
{ {
using SessionCompanion.ViewModels.ShopkeeperItemViewModels;
public class ShopkeeperItemsProfile : Profile public class ShopkeeperItemsProfile : Profile
{ {
public ShopkeeperItemsProfile() public ShopkeeperItemsProfile()
{ {
CreateMap<ShopkeeperItemViewModel, ShopkeeperItem>().ReverseMap(); CreateMap<ShopkeeperItemViewModel, ShopkeeperItem>().ReverseMap();
CreateMap<ShopkeeperItemDetailsViewModel, ShopkeeperItem>()
.ForMember(vm => vm.Armor, conf => conf.MapFrom(item => item.Armor))
.ForMember(vm => vm.Weapon, conf => conf.MapFrom(item => item.Weapon)).ReverseMap();
} }
} }
} }

View File

@ -16,6 +16,9 @@ namespace SessionCompanion.Services.Profiles
CreateMap<ShopkeeperViewModel, Shopkeeper>().ReverseMap(); CreateMap<ShopkeeperViewModel, Shopkeeper>().ReverseMap();
CreateMap<Shopkeeper, ShopkeeperWithItemsViewModel>() CreateMap<Shopkeeper, ShopkeeperWithItemsViewModel>()
.ForMember(vm => vm.Items, conf => conf.MapFrom(items => items.ShopkeeperItems)).ReverseMap(); .ForMember(vm => vm.Items, conf => conf.MapFrom(items => items.ShopkeeperItems)).ReverseMap();
CreateMap<Shopkeeper, ShopkeeperWithItemsDetailsViewModel>()
.ForMember(vm => vm.Items, conf => conf.MapFrom(items => items.ShopkeeperItems)).ReverseMap();
} }
} }
} }

View File

@ -19,6 +19,7 @@ namespace SessionCompanion.Services.Services
{ {
public ShopkeeperService(IMapper mapper, IRepository<Shopkeeper> repository) : base(mapper, repository) public ShopkeeperService(IMapper mapper, IRepository<Shopkeeper> repository) : base(mapper, repository)
{ } { }
/// <summary> /// <summary>
/// Funkcja zmienia status sprzedawcy /// Funkcja zmienia status sprzedawcy
/// </summary> /// </summary>
@ -55,12 +56,13 @@ namespace SessionCompanion.Services.Services
return new ErrorResponse() { StatusCode = 500, Message = e.Message }; return new ErrorResponse() { StatusCode = 500, Message = e.Message };
} }
} }
public async Task<Either<SuccessResponse, ErrorResponse>> CreateNewShopKeeper(ShopkeeperWithItemsViewModel shopkeeperWithItemsViewModel) public async Task<Either<SuccessResponse, ErrorResponse>> CreateNewShopKeeper(ShopkeeperWithItemsViewModel shopkeeperWithItemsViewModel)
{ {
try try
{ {
var activeShopkeeper = await Repository.Get(c => c.IsAvailable.Equals(true)).SingleAsync(); 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; activeShopkeeper.IsAvailable = false;
await Repository.Update(activeShopkeeper); await Repository.Update(activeShopkeeper);
@ -75,5 +77,23 @@ namespace SessionCompanion.Services.Services
return new ErrorResponse() { StatusCode = 500, Message = e.Message }; return new ErrorResponse() { StatusCode = 500, Message = e.Message };
} }
} }
public async Task<Either<ShopkeeperWithItemsDetailsViewModel, ErrorResponse>> 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<ShopkeeperWithItemsDetailsViewModel>(activeShopkeeper);
return result;
}
catch (Exception e)
{
return new ErrorResponse() { StatusCode = 500, Message = e.Message };
}
}
} }
} }

View File

@ -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
{
/// <summary>
/// Id Sprzedawcy
/// </summary>
public int? ShopkeeperId { get; set; }
/// <summary>
/// Id zbroi
/// </summary>
public int? ArmorId { get; set; }
public ArmorViewModel Armor { get; set; }
/// <summary>
/// Id broni
/// </summary>
public int? WeaponId { get; set; }
public WeaponViewModel Weapon { get; set; }
/// <summary>
/// Ilość przedmiotu
/// </summary>
public int Amount { get; set; }
}
}

View File

@ -6,20 +6,26 @@ using System.Threading.Tasks;
namespace SessionCompanion.ViewModels.ShopkeeperItemsViewModels namespace SessionCompanion.ViewModels.ShopkeeperItemsViewModels
{ {
using SessionCompanion.ViewModels.ArmorViewModels;
using SessionCompanion.ViewModels.WeaponViewModels;
public class ShopkeeperItemViewModel public class ShopkeeperItemViewModel
{ {
/// <summary> /// <summary>
/// Id Sprzedawcy /// Id Sprzedawcy
/// </summary> /// </summary>
public int? ShopkeeperId { get; set; } public int? ShopkeeperId { get; set; }
/// <summary> /// <summary>
/// Id zbroi /// Id zbroi
/// </summary> /// </summary>
public int? ArmorId { get; set; } public int? ArmorId { get; set; }
/// <summary> /// <summary>
/// Id broni /// Id broni
/// </summary> /// </summary>
public int? WeaponId { get; set; } public int? WeaponId { get; set; }
/// <summary> /// <summary>
/// Ilość przedmiotu /// Ilość przedmiotu
/// </summary> /// </summary>

View File

@ -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; }
/// <summary>
/// Nazwa sklepikarza
/// </summary>
public string Name { get; set; }
/// <summary>
/// Status sklepikarza
/// </summary>
public bool IsAvailable { get; set; }
/// <summary>
/// Lista przedmiotów danego sklepikarza
/// </summary>
public IEnumerable<ShopkeeperItemDetailsViewModel> Items { get; set; }
}
}

View File

@ -46,13 +46,13 @@ export class GameMasterShopkeepersTableComponent implements OnInit {
ActivateShopkeeper(shopkeeperId: number) { ActivateShopkeeper(shopkeeperId: number) {
if (this.dataSource.data.find((e) => e.isAvailable) != null) { if (this.dataSource.data.find((e) => e.isAvailable) != null) {
this.dataSource.data.find((e) => e.id == shopkeeperId).isAvailable = true; this.dataSource.data.find((e) => e.id == shopkeeperId).isAvailable = true;
//TODO podpięcie pod backend zmianę this.shopkeeperService.ChangeShopkeeperStatus(shopkeeperId, true);
} }
} }
DeactivateShopkeeper(shopkeeperId: number) { DeactivateShopkeeper(shopkeeperId: number) {
this.dataSource.data.find((e) => e.id == shopkeeperId).isAvailable = true; this.dataSource.data.find((e) => e.id == shopkeeperId).isAvailable = false;
//TODO podpięcie pod backend zmianę this.shopkeeperService.ChangeShopkeeperStatus(shopkeeperId, false);
} }
applyFilter(event: Event) { applyFilter(event: Event) {

View File

@ -1,10 +1,11 @@
import { Inject, Injectable } from '@angular/core'; 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 { Observable, of, throwError } from 'rxjs';
import { ShopkeeperViewModel } from '../types/viewmodels/shopkeeper-viewmodels/ShopkeeperViewModel'; import { ShopkeeperViewModel } from '../types/viewmodels/shopkeeper-viewmodels/ShopkeeperViewModel';
import { Either } from '../types/Either'; import { Either } from '../types/Either';
import { ErrorResponse } from '../types/ErrorResponse'; import { ErrorResponse } from '../types/ErrorResponse';
import { switchMap } from 'rxjs/operators'; import { switchMap } from 'rxjs/operators';
import { SuccessResponse } from '../types/SuccessResponse';
Injectable({ Injectable({
providedIn: 'root', 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);
}
} }

View File

@ -11,15 +11,21 @@ using System.Threading.Tasks;
namespace SessionCompanion.Controllers namespace SessionCompanion.Controllers
{ {
using Microsoft.AspNetCore.SignalR;
using SessionCompanion.Hubs;
[ApiController] [ApiController]
[Route("api/shopkeeper")] [Route("api/shopkeeper")]
public class ShopkeeperController : Controller public class ShopkeeperController : Controller
{ {
private IShopkeeperService _service; private IShopkeeperService _service;
public ShopkeeperController(IShopkeeperService shopkeeperService) private IHubContext<SessionHub> _sessionHub;
public ShopkeeperController(IShopkeeperService shopkeeperService, IHubContext<SessionHub> sessionHub)
{ {
_service = shopkeeperService; this._service = shopkeeperService;
this._sessionHub = sessionHub;
} }
/// <summary> /// <summary>
@ -32,6 +38,16 @@ namespace SessionCompanion.Controllers
return _service.Get().ToList(); return _service.Get().ToList();
} }
/// <summary>
/// Endpoint zwracający aktywnego sklepikarza
/// </summary>
/// <returns>Lista sklepikarzy</returns>
[HttpGet("getActiveShopkeeper")]
public async Task<Either<ShopkeeperWithItemsDetailsViewModel, ErrorResponse>> GetActiveShopkeepers()
{
return await _service.GetActiveShkopkeeperWithItems();
}
/// <summary> /// <summary>
/// Endpoint służacy do zmiany statusu sklepikarza /// Endpoint służacy do zmiany statusu sklepikarza
/// </summary> /// </summary>
@ -41,7 +57,13 @@ namespace SessionCompanion.Controllers
[HttpPut("changeShopkeeperStatus")] [HttpPut("changeShopkeeperStatus")]
public async Task<Either<SuccessResponse, ErrorResponse>> ChangeShopkeeperStatus([Required] int shopkeeperId, [Required] bool availability) public async Task<Either<SuccessResponse, ErrorResponse>> 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")] [HttpPost("createNewShopkeeper")]
@ -51,5 +73,16 @@ namespace SessionCompanion.Controllers
return new ErrorResponse() { StatusCode = 500, Message = "Model is invalid" }; return new ErrorResponse() { StatusCode = 500, Message = "Model is invalid" };
return await _service.CreateNewShopKeeper(shopkeeperWithItemsViewModel); return await _service.CreateNewShopKeeper(shopkeeperWithItemsViewModel);
} }
[HttpPost("removeShopkeeper")]
public async Task<Either<SuccessResponse, ErrorResponse>> 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");
}
} }
} }