feat: DTOs, Result Type
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using TicketAppIncrArchi.Application.DTO;
|
||||
using TicketAppIncrArchi.Application.Interfaces;
|
||||
using TicketAppIncrArchi.Domain.Entities;
|
||||
|
||||
|
||||
namespace TicketAppIncrArchi.API.Controllers;
|
||||
|
||||
@@ -9,20 +10,45 @@ namespace TicketAppIncrArchi.API.Controllers;
|
||||
public class TicketsController : ControllerBase
|
||||
{
|
||||
|
||||
//TicketService contain the list of tickets and
|
||||
//function to retrieve them
|
||||
private readonly ITicketService _service;
|
||||
|
||||
public TicketsController(ITicketService service)
|
||||
{
|
||||
_service = service;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------
|
||||
|
||||
[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]
|
||||
public IActionResult Create(Ticket ticket)
|
||||
public IActionResult Create(CreateTicketRequest request)
|
||||
{
|
||||
var created = _service.Create(ticket);
|
||||
return CreatedAtAction(nameof(Get), new {id=created.Id}, created);
|
||||
var result = _service.Create(request);
|
||||
|
||||
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;
|
||||
|
||||
namespace TicketAppIncrArchi.Application.Interfaces;
|
||||
|
||||
public interface ITicketService
|
||||
{
|
||||
IEnumerable<Ticket> GetAll();
|
||||
|
||||
//TODO: implement Repository
|
||||
IEnumerable<TicketResponse> GetAll();
|
||||
|
||||
Ticket? GetById(Guid id);
|
||||
Ticket Create(Ticket ticket);
|
||||
Result<CreateTicketResponse> Create(CreateTicketRequest request);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
using Microsoft.AspNetCore.Http.HttpResults;
|
||||
using TicketAppIncrArchi.Application.DTO;
|
||||
using TicketAppIncrArchi.Application.Interfaces;
|
||||
using TicketAppIncrArchi.Domain.Entities;
|
||||
|
||||
@@ -8,18 +10,49 @@ public class TicketService : ITicketService
|
||||
{
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
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