feat: DTOs, Result Type
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using TicketAppIncrArchi.Application.DTO;
|
||||||
using TicketAppIncrArchi.Application.Interfaces;
|
using TicketAppIncrArchi.Application.Interfaces;
|
||||||
using TicketAppIncrArchi.Domain.Entities;
|
|
||||||
|
|
||||||
namespace TicketAppIncrArchi.API.Controllers;
|
namespace TicketAppIncrArchi.API.Controllers;
|
||||||
|
|
||||||
@@ -9,20 +10,45 @@ namespace TicketAppIncrArchi.API.Controllers;
|
|||||||
public class TicketsController : ControllerBase
|
public class TicketsController : ControllerBase
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//TicketService contain the list of tickets and
|
||||||
|
//function to retrieve them
|
||||||
private readonly ITicketService _service;
|
private readonly ITicketService _service;
|
||||||
|
|
||||||
public TicketsController(ITicketService service)
|
public TicketsController(ITicketService service)
|
||||||
{
|
{
|
||||||
_service = service;
|
_service = service;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IEnumerable<Ticket> Get() => _service.GetAll();
|
public IEnumerable<TicketResponse> Get()
|
||||||
|
{
|
||||||
|
return _service.GetAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("{id}")]
|
||||||
|
public ActionResult<TicketResponse> Get(Guid id)
|
||||||
|
{
|
||||||
|
var ticket = _service.GetById(id);
|
||||||
|
if (ticket == null) return NotFound();
|
||||||
|
return Ok(ticket);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public IActionResult Create(Ticket ticket)
|
public IActionResult Create(CreateTicketRequest request)
|
||||||
{
|
{
|
||||||
var created = _service.Create(ticket);
|
var result = _service.Create(request);
|
||||||
return CreatedAtAction(nameof(Get), new {id=created.Id}, created);
|
|
||||||
|
if (result is FailureResult<CreateTicketResponse> fail)
|
||||||
|
return BadRequest(fail.Error);
|
||||||
|
|
||||||
|
var success = (SuccessResult<CreateTicketResponse>) result;
|
||||||
|
|
||||||
|
return CreatedAtAction(
|
||||||
|
nameof(Get),
|
||||||
|
new {id = success.Value.Id },
|
||||||
|
success.Value
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
54
TicketAppIncrArchi.Application/Common/Result.cs
Normal file
54
TicketAppIncrArchi.Application/Common/Result.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using Microsoft.AspNetCore.Authentication;
|
||||||
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
|
||||||
|
public abstract class Result<T>
|
||||||
|
{
|
||||||
|
public abstract bool Success {get;}
|
||||||
|
|
||||||
|
public static Result<T> Ok(T value) => new SuccessResult<T>(value);
|
||||||
|
public static Result<T> Fail(string error) => new FailureResult<T>(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class SuccessResult<T> : Result<T>
|
||||||
|
{
|
||||||
|
public override bool Success => true;
|
||||||
|
public T Value {get;}
|
||||||
|
|
||||||
|
public SuccessResult(T value)
|
||||||
|
{
|
||||||
|
Value = value ?? throw new ArgumentNullException(nameof(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class FailureResult<T> : Result<T>
|
||||||
|
{
|
||||||
|
public override bool Success => false;
|
||||||
|
|
||||||
|
public string Error {get;}
|
||||||
|
|
||||||
|
public FailureResult(string error)
|
||||||
|
{
|
||||||
|
Error = error ?? throw new ArgumentNullException(nameof(error));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
private Result(bool success, T? value, string? error)
|
||||||
|
{
|
||||||
|
Success = success;
|
||||||
|
Value = value;
|
||||||
|
Error = error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result<T> Ok(T value)
|
||||||
|
=> new(true,value,null);
|
||||||
|
|
||||||
|
public static Result<T> Fail(string error)
|
||||||
|
=> new(false, default, error);
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
18
TicketAppIncrArchi.Application/DTOs/TicketsDTOs.cs
Normal file
18
TicketAppIncrArchi.Application/DTOs/TicketsDTOs.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using TicketAppIncrArchi.Domain.Entities;
|
||||||
|
|
||||||
|
|
||||||
|
namespace TicketAppIncrArchi.Application.DTO;
|
||||||
|
|
||||||
|
public class CreateTicketRequest
|
||||||
|
{
|
||||||
|
public string Title {get; set;} = "";
|
||||||
|
public string Description {get; set; } = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CreateTicketResponse
|
||||||
|
{
|
||||||
|
public Guid Id {get;set;}
|
||||||
|
public string Title{get;set;} = "";
|
||||||
|
public string Description{get;set;} = "";
|
||||||
|
}
|
||||||
@@ -1,11 +1,14 @@
|
|||||||
|
using TicketAppIncrArchi.Application.DTO;
|
||||||
using TicketAppIncrArchi.Domain.Entities;
|
using TicketAppIncrArchi.Domain.Entities;
|
||||||
|
|
||||||
namespace TicketAppIncrArchi.Application.Interfaces;
|
namespace TicketAppIncrArchi.Application.Interfaces;
|
||||||
|
|
||||||
public interface ITicketService
|
public interface ITicketService
|
||||||
{
|
{
|
||||||
IEnumerable<Ticket> GetAll();
|
|
||||||
|
//TODO: implement Repository
|
||||||
|
IEnumerable<TicketResponse> GetAll();
|
||||||
|
|
||||||
Ticket? GetById(Guid id);
|
Ticket? GetById(Guid id);
|
||||||
Ticket Create(Ticket ticket);
|
Result<CreateTicketResponse> Create(CreateTicketRequest request);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using Microsoft.AspNetCore.Http.HttpResults;
|
||||||
|
using TicketAppIncrArchi.Application.DTO;
|
||||||
using TicketAppIncrArchi.Application.Interfaces;
|
using TicketAppIncrArchi.Application.Interfaces;
|
||||||
using TicketAppIncrArchi.Domain.Entities;
|
using TicketAppIncrArchi.Domain.Entities;
|
||||||
|
|
||||||
@@ -8,18 +10,49 @@ public class TicketService : ITicketService
|
|||||||
{
|
{
|
||||||
|
|
||||||
private readonly List<Ticket> _tickets = new();
|
private readonly List<Ticket> _tickets = new();
|
||||||
public IEnumerable<Ticket> GetAll() => _tickets;
|
public IEnumerable<TicketResponse> GetAll()
|
||||||
|
{
|
||||||
|
var result =_tickets.Select(t => new TicketResponse
|
||||||
|
{
|
||||||
|
Id = t.Id,
|
||||||
|
Title = t.Title,
|
||||||
|
Description =t.Description,
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public Ticket? GetById(Guid id)
|
public Ticket? GetById(Guid id)
|
||||||
{
|
{
|
||||||
return _tickets.FirstOrDefault(ticket => ticket.Id == id);
|
return _tickets.FirstOrDefault(ticket => ticket.Id == id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Ticket Create(Ticket ticket)
|
public Result<CreateTicketResponse> Create(CreateTicketRequest request)
|
||||||
{
|
{
|
||||||
ticket.Id = Guid.NewGuid();
|
|
||||||
|
if (string.IsNullOrWhiteSpace(request.Title))
|
||||||
|
return Result<CreateTicketResponse>.Fail("Title is Required");
|
||||||
|
|
||||||
|
var ticket = new Ticket
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid(),
|
||||||
|
Title = request.Title,
|
||||||
|
Description = request.Description
|
||||||
|
};
|
||||||
|
|
||||||
|
//send creation to repo
|
||||||
_tickets.Add(ticket);
|
_tickets.Add(ticket);
|
||||||
return ticket;
|
|
||||||
|
var response = new CreateTicketResponse
|
||||||
|
{
|
||||||
|
Id = ticket.Id,
|
||||||
|
Title = ticket.Title,
|
||||||
|
Description = ticket.Description
|
||||||
|
};
|
||||||
|
|
||||||
|
return Result<CreateTicketResponse>.Ok(response);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user