feat: DTOs, Result Type

This commit is contained in:
2026-03-16 19:37:11 +01:00
parent 4b1152614e
commit 4b99e238ca
5 changed files with 147 additions and 13 deletions

View File

@@ -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
);
}
}

View 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);
}
*/

View 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;} = "";
}

View File

@@ -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);
}

View File

@@ -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);
}
}