using AutoMapper; using FluentValidation; using MediatR; using Sufi.Demo.PeopleDirectory.Application.Contracts.Repositories; using Sufi.Demo.PeopleDirectory.Application.Contracts.Services; using Sufi.Demo.PeopleDirectory.Domain.Entities.Misc; using Sufi.Demo.PeopleDirectory.Shared.Wrapper; namespace Sufi.Demo.PeopleDirectory.Application.Features.Contacts.Queries.GetById { public class GetContactByIdQuery : IRequest> { public int Id { get; set; } } public sealed class GetContactByIdQueryValidator : AbstractValidator { public GetContactByIdQueryValidator() { RuleFor(v => v.Id) .GreaterThan(0) .WithMessage("A valid Id is required."); } } public class GetContactByIdQueryHandler( IUnitOfWork unitOfWork, IMapper mapper, IAppCache appCache ) : IRequestHandler> { public async Task> Handle(GetContactByIdQuery request, CancellationToken cancellationToken) { Task getContactByIdFunc() => unitOfWork.Repository().GetByIdAsync(request.Id); var contact = await appCache.GetOrAddAsync( $"contact_{request.Id}", async token => await getContactByIdFunc(), absoluteExpireTime: TimeSpan.FromMinutes(2), tags: ["contacts"] ); var mappedContact = mapper.Map(contact); return await Result.SuccessAsync(mappedContact); } } }