Example #1
0
        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));
        }
Example #3
0
        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));
        }
Example #4
0
        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));
        }