using Domain.AggregateModel.AppAggregate; using Domain.AggregateModel.LinkAggregate; using Domain.Exceptions; using MediatR; using Microsoft.Extensions.Logging; using QRCodeService.Services; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace QRCodeService.Application.Commands { public class CreateLinkCommandHandler : IRequestHandler { readonly ILogger logger; readonly IAppRepository appRepository; private readonly IShortCodeService shortCodeService; readonly ILinkRepository linkRepository; public CreateLinkCommandHandler(IShortCodeService shortCodeService,ILinkRepository linkRepository, IAppRepository appRepository, ILogger logger) { this.shortCodeService = shortCodeService; this.linkRepository = linkRepository; this.appRepository = appRepository; this.logger = logger; } async Task IRequestHandler.Handle(CreateLinkCommand request, CancellationToken cancellationToken) { var app = await appRepository.GetAsync(request.AppId); if (app == null) { throw new DomainException("app not found"); } var fullUrl = new Uri(new Uri(app.BaseUrl), request.SuffixUrl).ToString(); var shortCode = await shortCodeService.GenShortCode(fullUrl); var dbLink = await linkRepository.GetAsync(shortCode); if (dbLink != null) { logger.LogDebug("use exist link"); return dbLink; } var link = new Link(app.BaseUrl, request.SuffixUrl,fullUrl, request.AppId, shortCode); link = linkRepository.Add(link); await linkRepository.UnitOfWork.SaveEntitiesAsync(); return link; } } }