using Microsoft.EntityFrameworkCore; namespace Netina.Repository.Handlers.Discounts; public class CreateSaleCooperationDiscountHandler : IRequestHandler { private readonly UserManager _userManager; private readonly IRepositoryWrapper _repositoryWrapper; private readonly ICurrentUserService _currentUserService; public CreateSaleCooperationDiscountHandler(UserManager userManager,IRepositoryWrapper repositoryWrapper,ICurrentUserService currentUserService) { _userManager = userManager; _repositoryWrapper = repositoryWrapper; _currentUserService = currentUserService; } public async Task Handle(CreateSaleCooperationDiscount request, CancellationToken cancellationToken) { var userId = request.CorporateUserId; if (userId == default) { if (_currentUserService.UserId == null) throw new AppException("User id is null"); if (!Guid.TryParse(_currentUserService.UserId, out userId)) throw new AppException("User id is wrong"); } var user = await _userManager.FindByIdAsync(userId.ToString()); if (user == null) throw new AppException("User not found", ApiResultStatusCode.NotFound); var marketer = await _repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(m => m.UserId == user.Id, cancellationToken); if (marketer == null) throw new AppException("Marketer not found", ApiResultStatusCode.NotFound); var foundedDiscount = await _repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(d => d.IsForSaleCooperation && d.MarketerId == marketer.Id, cancellationToken); if (foundedDiscount == null) { var code = StringExtensions.GetId(); foundedDiscount = Discount.Create(code,$"کد مخصوص همکاری در فروش برای کاربر - {user.FirstName} {user.LastName}", 10, 0, true, DiscountAmountType.Percent, DiscountType.All, 0, true, DateTime.Today, DateTime.Today.AddYears(10), 0, false, 0, false, true, 0, false, false,false); foundedDiscount.SetCorporate(marketer.Id); _repositoryWrapper.SetRepository().Add(foundedDiscount); await _repositoryWrapper.SaveChangesAsync(cancellationToken); return foundedDiscount.Code; } else return foundedDiscount.Code; } }