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));
        }
Esempio n. 2
0
        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));
        }
Esempio n. 4
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));
        }
Esempio n. 5
0
        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));
        }