public async Task <ActionResult <CustomerResponse> > GetCustomerAsync(Guid id) { var customer = await _customerRepository.GetByIdAsync(id); var promocodes = await _promoCodeRepository.GetRangeByIdsAsync(customer.PromoCodesId.ToList()); var preferences = (await _preferencesGateway.GetPreferencesAsync()) .Where(item => customer.PreferencesId.Contains(item.Id)); var response = new CustomerResponse(customer, promocodes.ToList(), preferences); return(Ok(response)); }
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 <ActionResult <List <PreferenceResponse> > > GetPreferencesAsync() { var preferences = await _preferencesGateway.GetPreferencesAsync(); var response = preferences.Select(x => new PreferenceResponse() { Id = x.Id, Name = x.Name }).ToList(); return(Ok(response)); }