using LiteCharms.Features.Utilities.Commands; using LiteCharms.Infrastructure.Database; namespace LiteCharms.Features.Leads.Commands.Handlers; public class CreateLeadCommandHandler(IDbContextFactory contextFactory, ISender mediator) : IRequestHandler> { public async ValueTask> Handle(CreateLeadCommand request, CancellationToken cancellationToken) { try { var hashCommand = ComputeHashCommand.Create($"{request.ClickId}{request.AppClickId}{request.WebClickId}"); var hashResult = await mediator.Send(hashCommand, cancellationToken); if(hashResult.IsFailed) return Result.Fail(new Error($"Failed to compute hash for lead -> Google ClickId: {request.ClickId}, App ClickId: {request.AppClickId}, Web ClickId: {request.WebClickId}") .CausedBy(hashResult.Errors)); using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var newLead = context.Leads.Add(new Entities.Lead { WebClickId = request.WebClickId, AppClickId = request.AppClickId, Source = request.Source, ClickId = request.ClickId, AdGroupId = request.AdGroupId, AdName = request.AdName, CampaignId = request.CampaignId, ClickLocation = request.ClickLocation, CustomerId = request.CustomerId, FeedItemId = request.FeedItemId, Status = Models.LeadStatus.New, TargetId = request.TargetId, AttributionHash = hashResult.Value }); return await context.SaveChangesAsync(cancellationToken) > 0 ? Result.Ok(newLead.Entity.Id) : Result.Fail(new Error($"Failed to create lead -> Google ClickId: {request.ClickId}, App ClickId: {request.AppClickId}, Web ClickId: {request.WebClickId}")); } catch (Exception ex) { return Result.Fail(new Error(ex.Message).CausedBy(ex)); } } }