public async Task <ActionResult <PromoCodeShortResponse> > GivePromoCodesToCustomersWithPreferenceAsync( GivePromoCodeRequest request) { if (request == null) { return(BadRequest()); } //предпочтение по имени var preference = await _preferenceRepository.GetFirstWhere( x => x.Name == request.Preference); if (preference == null) { return(BadRequest()); } //Клиенты с указанными предпочтениями var customers = await _customerRepository .GetWhere(c => c.Preferences.Any(x => x.Preference.Id == preference.Id)); var promoCode = PromoCodeMapper.MapFromModel(request, preference, customers); await _promoCodeRepository.CreateAsync(promoCode); var response = new PromoCodeShortResponse(promoCode); return(CreatedAtRoute(null, response)); }
protected override async Task ProcessMessageAsync(string message) { using var scope = _serviceProvider.CreateScope(); var promoCodesRepository = scope.ServiceProvider.GetService <IRepository <PromoCode> >(); var preferencesRepository = scope.ServiceProvider.GetService <IRepository <Preference> >(); var customersRepository = scope.ServiceProvider.GetService <IRepository <Customer> >(); var dto = JsonSerializer.Deserialize <GivePromoCodeToCustomerDto>(message); var preference = await preferencesRepository.GetByIdAsync(dto.PreferenceId); if (preference == null) { throw new InvalidOperationException($"Preference with id {dto.PreferenceId} cannot be processed"); } // Получаем клиентов с этим предпочтением: var customers = await customersRepository .GetWhere(d => d.Preferences.Any(x => x.Preference.Id == preference.Id)); var request = new GivePromoCodeRequest { PreferenceId = dto.PreferenceId, PromoCode = dto.PromoCode, BeginDate = dto.BeginDate, EndDate = dto.EndDate, PartnerId = dto.PartnerId, ServiceInfo = dto.ServiceInfo, PromoCodeId = dto.PromoCodeId }; var promoCode = PromoCodeMapper.MapFromModel(request, preference, customers); await promoCodesRepository.AddAsync(promoCode); }
public async Task <IActionResult> GivePromoCodesToCustomersWithPreferenceAsync(GivePromoCodeRequest request) { //Получаем предпочтение по имени var preference = (await _preferencesGateway.GetPreferencesAsync()).FirstOrDefault( item => item.Id == request.PreferenceId); if (preference == null) { return(BadRequest()); } // Получаем клиентов с этим предпочтением: var customers = await _customersRepository .GetWhere(d => d.PreferencesId.Any(x => x == preference.Id)); PromoCode promoCode = PromoCodeMapper.MapFromModel(request, preference); //Добавляем промокод клинетам foreach (var customer in customers) { customer.PromoCodesId.Add(promoCode.Id); await _customersRepository.UpdateAsync(customer); } await _promoCodesRepository.AddAsync(promoCode); return(CreatedAtAction(nameof(GetPromocodesAsync), new { }, null)); }
public async Task <IActionResult> ReceivePromoCodeFromPartnerWithPreferenceAsync(Guid id, ReceivingPromoCodeRequest request) { var partner = await _partnersRepository.GetByIdAsync(id); if (partner == null) { return(BadRequest("Партнер не найден")); } var activeLimit = partner.PartnerLimits.FirstOrDefault(x => !x.CancelDate.HasValue && x.EndDate > DateTime.Now); if (activeLimit == null) { return(BadRequest("Нет доступного лимита на предоставление промокодов")); } if (partner.NumberIssuedPromoCodes + 1 > activeLimit.Limit) { return(BadRequest("Лимит на выдачу промокодов превышен")); } if (partner.PromoCodes.Any(x => x.Code == request.PromoCode)) { return(BadRequest("Данный промокод уже был выдан ранее")); } //Получаем предпочтение по имени var preference = (await _preferencesGateway.GetPreferencesAsync()) .FirstOrDefault(item => item.Id == request.PreferenceId); if (preference == null) { return(BadRequest("Предпочтение не найдено")); } PromoCode promoCode = PromoCodeMapper.MapFromModel(request, preference, partner); partner.PromoCodes.Add(promoCode); partner.NumberIssuedPromoCodes++; await _partnersRepository.UpdateAsync(partner); //TODO: Чтобы информация о том, что промокод был выдан парнером была отправлена //в микросервис рассылки клиентам нужно либо вызвать его API, либо отправить событие в очередь await _givingPromoCodeToCustomerGateway.GivePromoCodeToCustomer(promoCode); //TODO: Чтобы информация о том, что промокод был выдан парнером была отправлена //в микросервис администрирования нужно либо вызвать его API, либо отправить событие в очередь if (request.PartnerManagerId.HasValue) { await _administrationGateway.NotifyAdminAboutPartnerManagerPromoCode(request.PartnerManagerId.Value); } return(CreatedAtAction(nameof(GetPartnerPromoCodeAsync), new { id = partner.Id, promoCodeId = promoCode.Id }, null)); }
public async Task <IActionResult> GivePromoCodesToCustomersWithPreferenceAsync(GivePromoCodeRequest request) { //Получаем предпочтение по имени var preference = await _preferencesRepository.GetByIdAsync(request.PreferenceId); if (preference == null) { return(BadRequest()); } // Получаем клиентов с этим предпочтением: var customers = await _customersRepository .GetWhere(d => d.Preferences.Any(x => x.Preference.Id == preference.Id)); PromoCode promoCode = PromoCodeMapper.MapFromModel(request, preference, customers); await _promoCodesRepository.AddAsync(promoCode); return(CreatedAtAction(nameof(GetPromocodesAsync), new { }, null)); }