SES-160 shop on gm and player screen #85
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 };
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -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>
|
||||||
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user