using CleanArchitecture.Application.Common.Interfaces; using CleanArchitecture.Domain.Entities; using MediatR; using System.Threading; using System.Threading.Tasks; using CleanArchitecture.Domain.Common; using CleanArchitecture.WebUI.Controllers; using FluentValidation; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace CleanArchitecture.Application.TodoItems.Commands.CreateTodoItem { [Authorize] public class CreateTodoItemController : ApiControllerBase { [HttpPost("/todoItems")] public async Task<ActionResult<int>> Create(CreateTodoItemCommand command) { return await Mediator.Send(command); } } public class CreateTodoItemCommand : IRequest<int> { public int ListId { get; set; } public string Title { get; set; } } public class CreateTodoItemCommandValidator : AbstractValidator<CreateTodoItemCommand> { public CreateTodoItemCommandValidator() { RuleFor(v => v.Title) .MaximumLength(200) .NotEmpty(); } } public class CreateTodoItemCommandHandler : IRequestHandler<CreateTodoItemCommand, int> { private readonly IApplicationDbContext _context; public CreateTodoItemCommandHandler(IApplicationDbContext context) { _context = context; } public async Task<int> Handle(CreateTodoItemCommand request, CancellationToken cancellationToken) { var entity = new TodoItem { ListId = request.ListId, Title = request.Title, Done = false }; entity.DomainEvents.Add(new TodoItemCreatedEvent(entity)); _context.TodoItems.Add(entity); await _context.SaveChangesAsync(cancellationToken); return entity.Id; } } public class TodoItemCreatedEvent : DomainEvent { public TodoItemCreatedEvent(TodoItem item) { Item = item; } public TodoItem Item { get; } } }