SES-91 Utworzenie modelu zwrotek AP oraz zajmowanie się domyślnymi exceptionami #22

Merged
s426135 merged 10 commits from SES-91 into master 2020-12-11 17:08:08 +01:00
4 changed files with 56 additions and 58 deletions
Showing only changes of commit db2de42824 - Show all commits

View File

@ -1,26 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
namespace SessionCompanion.Extensions.ApiErrors
{
public class ErrorDetails
{
/// <summary>
/// Kod błędu
/// </summary>
public int StatusCode { get; set; }
/// <summary>
/// Wiadomość błędu do pokazania
/// </summary>
public string Message { get; set; }
public override string ToString()
{
return JsonSerializer.Serialize(this);
}
}
}

View File

@ -4,29 +4,58 @@ namespace SessionCompanion.Extensions.EitherType
{ {
public class Either<TL, TR> public class Either<TL, TR>
{ {
private readonly TL left; /// <summary>
/// Kontruktor dla lewej zmiennej
private readonly TR right; /// </summary>
/// <param name="left">Wartość lewej zmiennej</param>
private readonly bool isLeft;
public Either(TL left) public Either(TL left)
{ {
this.left = left; this.Left = left;
this.isLeft = true; this.IsLeft = true;
} }
/// <summary>
/// Konstruktor dla prawej zmiennej
/// </summary>
/// <param name="right">Wartość prawej zmiennej</param>
public Either(TR right) public Either(TR right)
{ {
this.right = right; this.Right = right;
this.isLeft = false; this.IsLeft = false;
} }
/// <summary>
/// Lewa zmienna
/// </summary>
public TL Left { get; }
/// <summary>
/// Prawa zmienna
/// </summary>
public TR Right { get; }
/// <summary>
/// Zmienna informujaca czy wykorzystana zostąła zmienna lewa czy prawa
/// </summary>
public bool IsLeft { get; }
/// <summary>
/// Tworzy obiekt typu Either wykorzystując zmienną lewą
/// </summary>
/// <param name="left">Wartość lewej zmiennej</param>
public static implicit operator Either<TL, TR>(TL left) => new Either<TL, TR>(left);
/// <summary>
/// Tworzy obiekt typu Either wykorzystując zmienną prawą
/// </summary>
/// <param name="right">Wartosć prawej zmiennej</param>
public static implicit operator Either<TL, TR>(TR right) => new Either<TL, TR>(right);
/// <summary> /// <summary>
/// Bazowa metoda dopasowania wzorów. /// Bazowa metoda dopasowania wzorów.
/// Jeśli podana jest wartość lewa, to Match zwróci wynik lewej funkcji, w przeciwnym razie wynik prawej funkcji. /// Jeśli podana jest wartość lewa, to Match zwróci wynik lewej funkcji, w przeciwnym razie wynik prawej funkcji.
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T">Typ zwracanej wartości</typeparam>
/// <param name="leftFunc">Lewa funkcja </param> /// <param name="leftFunc">Lewa funkcja </param>
/// <param name="rightFunc">Prawa funkcja</param> /// <param name="rightFunc">Prawa funkcja</param>
/// <returns>Wynik prawej/lewej funkcji</returns> /// <returns>Wynik prawej/lewej funkcji</returns>
@ -42,28 +71,21 @@ namespace SessionCompanion.Extensions.EitherType
throw new ArgumentNullException(nameof(rightFunc)); throw new ArgumentNullException(nameof(rightFunc));
} }
return this.isLeft ? leftFunc(this.left) : rightFunc(this.right); return this.IsLeft ? leftFunc(this.Left) : rightFunc(this.Right);
}
public void DoRight(Action<TR> rightAction)
{
if (rightAction == null)
{
throw new ArgumentNullException(nameof(rightAction));
}
if (!this.isLeft)
{
rightAction(this.right);
}
} }
/// <summary>
/// Funkcja ustala czy uzyta została lewa zmienna, jesli tak to zwraca jej wartość inaczej zwraca defaultowy obiekt
/// o typie takim jak lewa zmienna
/// </summary>
/// <returns> Wartosć lewej zmiennej lub defaultową wartość o typie lewej zmiennej</returns>
public TL LeftOrDefault() => this.Match(l => l, r => default(TL)); public TL LeftOrDefault() => this.Match(l => l, r => default(TL));
/// <summary>
/// Funkcja ustala czy uzyta została prawa zmienna, jesli tak to zwraca jej wartość inaczej zwraca defaultowy obiekt
/// o typie takim jak lewa zmienna
/// </summary>
/// <returns> Wartosć lewej zmiennej lub defaultową wartość o typie prawej zmiennej</returns>
public TR RightOrDefault() => this.Match(l => default(TR), r => r); public TR RightOrDefault() => this.Match(l => default(TR), r => r);
public static implicit operator Either<TL, TR>(TL left) => new Either<TL, TR>(left);
public static implicit operator Either<TL, TR>(TR right) => new Either<TL, TR>(right);
} }
} }

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using SessionCompanion.ViewModels.ApiResponses;
namespace SessionCompanion.Configurations namespace SessionCompanion.Configurations
{ {
@ -33,7 +34,7 @@ namespace SessionCompanion.Configurations
{ {
context.Response.ContentType = "application/json"; context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
return context.Response.WriteAsync(new ErrorDetails() return context.Response.WriteAsync(new ErrorResponse()
{ {
StatusCode = context.Response.StatusCode, StatusCode = context.Response.StatusCode,
Message = exception.Message Message = exception.Message

View File

@ -2,10 +2,11 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using SessionCompanion.Services.Interfaces; using SessionCompanion.Services.Interfaces;
using SessionCompanion.ViewModels.CharacterViewModels; using SessionCompanion.ViewModels.CharacterViewModels;
using SessionCompanion.ApiReturn;
namespace SessionCompanion.Controllers namespace SessionCompanion.Controllers
{ {
using SessionCompanion.Extensions.EitherType;
[Route("api/character")] [Route("api/character")]
[ApiController] [ApiController]
public class CharacterController : Controller public class CharacterController : Controller
@ -23,7 +24,7 @@ namespace SessionCompanion.Controllers
/// <param name="id">Identyfikator postaci</param> /// <param name="id">Identyfikator postaci</param>
/// <returns>ViewModel Postaci</returns> /// <returns>ViewModel Postaci</returns>
[HttpGet("{id}")] [HttpGet("{id}")]
public async Task<Either<string,CharacterViewModel>> Get(int id) public async Task<CharacterViewModel> Get(int id)
{ {
return await _service.Get(id); return await _service.Get(id);
} }