diff --git a/TicketAppIncrArchi.API/Controllers/TicketsController.cs b/TicketAppIncrArchi.API/Controllers/TicketsController.cs index 275704e..74c1403 100644 --- a/TicketAppIncrArchi.API/Controllers/TicketsController.cs +++ b/TicketAppIncrArchi.API/Controllers/TicketsController.cs @@ -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 Get() => _service.GetAll(); + public IEnumerable Get() + { + return _service.GetAll(); + } + + [HttpGet("{id}")] + public ActionResult 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 fail) + return BadRequest(fail.Error); + + var success = (SuccessResult) result; + + return CreatedAtAction( + nameof(Get), + new {id = success.Value.Id }, + success.Value + ); } } diff --git a/TicketAppIncrArchi.Application/Common/Result.cs b/TicketAppIncrArchi.Application/Common/Result.cs new file mode 100644 index 0000000..86b1c50 --- /dev/null +++ b/TicketAppIncrArchi.Application/Common/Result.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.SignalR; + +public abstract class Result +{ + public abstract bool Success {get;} + + public static Result Ok(T value) => new SuccessResult(value); + public static Result Fail(string error) => new FailureResult(error); +} + +public sealed class SuccessResult : Result +{ + public override bool Success => true; + public T Value {get;} + + public SuccessResult(T value) + { + Value = value ?? throw new ArgumentNullException(nameof(value)); + } + +} + +public sealed class FailureResult : Result +{ + 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 Ok(T value) + => new(true,value,null); + + public static Result Fail(string error) + => new(false, default, error); + +} +*/ \ No newline at end of file diff --git a/TicketAppIncrArchi.Application/DTOs/TicketsDTOs.cs b/TicketAppIncrArchi.Application/DTOs/TicketsDTOs.cs new file mode 100644 index 0000000..31117f3 --- /dev/null +++ b/TicketAppIncrArchi.Application/DTOs/TicketsDTOs.cs @@ -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;} = ""; +} diff --git a/TicketAppIncrArchi.Application/Interfaces/ITicketService.cs b/TicketAppIncrArchi.Application/Interfaces/ITicketService.cs index 69a7b7a..40cb7ff 100644 --- a/TicketAppIncrArchi.Application/Interfaces/ITicketService.cs +++ b/TicketAppIncrArchi.Application/Interfaces/ITicketService.cs @@ -1,11 +1,14 @@ +using TicketAppIncrArchi.Application.DTO; using TicketAppIncrArchi.Domain.Entities; namespace TicketAppIncrArchi.Application.Interfaces; public interface ITicketService -{ - IEnumerable GetAll(); +{ + + //TODO: implement Repository + IEnumerable GetAll(); Ticket? GetById(Guid id); - Ticket Create(Ticket ticket); + Result Create(CreateTicketRequest request); } diff --git a/TicketAppIncrArchi.Application/Services/TicketServices.cs b/TicketAppIncrArchi.Application/Services/TicketServices.cs index d139f3b..8da5145 100644 --- a/TicketAppIncrArchi.Application/Services/TicketServices.cs +++ b/TicketAppIncrArchi.Application/Services/TicketServices.cs @@ -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 _tickets = new(); - public IEnumerable GetAll() => _tickets; + public IEnumerable 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 Create(CreateTicketRequest request) { - ticket.Id = Guid.NewGuid(); + + if (string.IsNullOrWhiteSpace(request.Title)) + return Result.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.Ok(response); + } }