public List <Service> Retrieve(ServicePriceRequest request)
        {
            var result = new List <Service>();

            foreach (var serviceType in request.ServiceTypes)
            {
                result.AddRange(GenerateServices(serviceType, request.Booking));
            }

            return(result);
        }
        public void SetUp()
        {
            this._sut     = new ServicePriceRequestValidator();
            _validRequest = new ServicePriceRequest {
                Booking = new BookingPricing
                {
                    Journeys = new List <Domain.Journey.Models.Journey> {
                        new Domain.Journey.Models.Journey()
                    },
                    Currency = "EUR"
                }
            };

            this._emptyRequest = new ServicePriceRequest
            {
                Booking = new BookingPricing()
            };
        }
Esempio n. 3
0
 public List <Service> Retrieve(ServicePriceRequest request)
 {
     return(GenerateServices(request.Booking));
 }
Esempio n. 4
0
        // метода се извиква при всяко запитване на конектнатия клиент
        public byte[] ProccessRequest(byte[] message)
        {
            //извличане на входните данни
            var splittedMessage = SplitByteArray(message, 0x1F).ToArray();

            if (splittedMessage.Count() == 0)
            {
                return new byte[] { 0x45, 0x52, 0x52, 0x4F, 0x52 }
            }
            ;                                                       //ERROR

            // how many tokens
            int tokensCount = splittedMessage.GetLength(0);
            // command
            string cmd = tokensCount >= 1 ? new string(
                splittedMessage[0]
                .Where(b => b != 0x1F && b != 0x1E)     // except:  0x1F - unit separator char(31), 0x1E - record separator char(30)
                .Select(b => (char)b)
                .ToArray()) : string.Empty;

            if (cmd.Equals("RG", StringComparison.InvariantCultureIgnoreCase))
            {
                CanPlayRequest request = CanPlayRequest.DeserializeASCII(splittedMessage);

                _logger.LogInformation(System.Text.Json.JsonSerializer.Serialize(request));
                Proto.CanPlayRequest proto_request = request.ToProtoCanPlayRequest();
                CanPlayResponse      response;
                try
                {
                    Proto.CanPlayResponse proto_response = _cardService.CanPlayAsync(proto_request).Result;
                    if (proto_response != null)
                    {
                        response = CanPlayResponse.FromProtoCanPlayResponse(proto_response);
                    }
                    else
                    {
                        response = new CanPlayResponse {
                            Success = false, MessageLine1 = "Err 109", MessageLine2 = "Internal server"
                        };
                        _logger.LogError("TextMessageService.ProccessRequest => Proto.CanPlayResponse is null");
                    }
                }
                catch (Exception ex)
                {
                    response = new CanPlayResponse {
                        Success = false, MessageLine1 = "Err 109", MessageLine2 = "Internal server"
                    };
                    _logger.LogError($"TextMessageService.ProccessRequest throws: {ex}");
                }
                _logger.LogInformation(System.Text.Json.JsonSerializer.Serialize(response));
                return(response.SerializeASCII());
            }
            else if (cmd.Equals("RP", StringComparison.InvariantCultureIgnoreCase))
            {
                ServicePriceRequest request = ServicePriceRequest.DeserializeASCII(splittedMessage);
                _logger.LogInformation(System.Text.Json.JsonSerializer.Serialize(request));
                Proto.ServicePriceRequest proto_request = request.ToProtoServicePriceRequest();
                ServicePriceResponse      response;
                try
                {
                    Proto.ServicePriceResponse proto_response = _cardService.ServicePriceAsync(proto_request).Result;
                    if (proto_response != null)
                    {
                        response = ServicePriceResponse.FromProtoServicePriceResponse(proto_response);
                    }
                    else
                    {
                        response = new ServicePriceResponse {
                            Success = false, MessageLine1 = "Err 109", MessageLine2 = "Internal server"
                        };
                        _logger.LogError("TextMessageService.ProccessRequest => Proto.ServicePriceRequest is null");
                    }
                }
                catch (Exception ex)
                {
                    response = new ServicePriceResponse {
                        Success = false, MessageLine1 = "Err 109", MessageLine2 = "Internal server"
                    };
                    _logger.LogError($"TextMessageService.ProccessRequest throws: {ex}");
                }
                _logger.LogInformation(System.Text.Json.JsonSerializer.Serialize(response));
                return(response.SerializeASCII());
            }
            else if (cmd.Equals("T", StringComparison.InvariantCultureIgnoreCase))
            {
                return(Encoding.ASCII.GetBytes($"{DateTime.Now:dd.MM.yyyy HH:mm}\x1E"));
            }
            else
            {
                return(Encoding.ASCII.GetBytes($"{DateTime.Now:dd.MM.yyyy HH:mm}\x1E"));
            }
        }
        public void ThrowsWhenServiceTypesNull()
        {
            var nullRequest = new ServicePriceRequest();

            Assert.Throws <InvalidServicePricingRequestException>(() => this._sut.Validate(nullRequest));
        }
Esempio n. 6
0
        public async ValueTask <ServicePriceResponse> ServicePriceAsync(ServicePriceRequest value, CallContext context = default)
        {
            Guid guid = Guid.NewGuid();

            _logger.InfoLog($"[CardService.ServicePriceAsync][-IN-] [{guid}] TransactionId {value.TransactionId} | ConcentratorId {value.ConcentratorId} | ControllerId {value.ControllerId} | CardType {value.CardType} | CardId {value.CardId} | ServiceId {value.ServiceId} | EndpointRssi: {value.EndpointRssi} | ConcentratorRssi {value.ConcentratorRssi}", GetIpAddress());
            // генерира ключ
            var key = $"{value.ControllerId}-{value.CardId}-{value.TransactionId}-{value.ServiceId}";
            // извлича тюпъл от кеша за този ключ
            var cachedItem = ServicePriceCacheService.Instance.Get(key, true);

            // ако има ключ в тюпъла
            if (!string.IsNullOrWhiteSpace(cachedItem.key))
            {
                // ако има резултат за този ключ в тюпъла
                if (cachedItem.successResponse != null)
                {
                    _logger.InfoLog($"[CardService.ServicePriceAsync][-OUT-] [{guid}] TransactionId {value.TransactionId} | ConcentratorId {value.ConcentratorId} | ControllerId {value.ControllerId} | CardType {value.CardType} | CardId {value.CardId} | ServiceId {value.ServiceId} | EndpointRssi: {value.EndpointRssi} | ConcentratorRssi {value.ConcentratorRssi} | CACHED Result", GetIpAddress());
                    // връща резултата от тюпъла
                    return(cachedItem.successResponse);
                }
            }
            // резервира семафора за текущия тред и продължава, други тредове стигнали до тук чакат ...
            await semaphoreSlim.WaitAsync();

            // проверява за евнтуален тюпъл и резултат за този ключ от други тредове
            cachedItem = ServicePriceCacheService.Instance.Get(key);
            if (cachedItem.successResponse != null)
            {
                _logger.InfoLog($"[CardService.ServicePriceAsync][-OUT-] [{guid}] TransactionId {value.TransactionId} | ConcentratorId {value.ConcentratorId} | ControllerId {value.ControllerId} | CardType {value.CardType} | CardId {value.CardId} | ServiceId {value.ServiceId} | EndpointRssi: {value.EndpointRssi} | ConcentratorRssi {value.ConcentratorRssi} | CACHED Result", GetIpAddress());
                // освобождава семафора за следващи тредове, които чакат
                semaphoreSlim.Release();
                // връща резултата от тюпъла
                return(cachedItem.successResponse);
            }
            // резервира ключа в кеша, като създава тюпъл с този ключ, но без резултат
            ServicePriceCacheService.Instance.Add(key, (key, null));
            ServicePriceResponse response = null;

            try
            {
                // извлича резултата от апи-то (отнема много време)
                var tupleResult = ServicePriceInternal(guid, value.ConcentratorId, value.ControllerId, value.CardType, value.CardId, value.ServiceId, value.TransactionId, value.EndpointRssi, value.ConcentratorRssi);
                if (tupleResult.success)
                {
                    // обновява резултата в тюпъла в кеша за резервирания ключ
                    ServicePriceCacheService.Instance.Add(key, (key, tupleResult.response));
                }
                // връща резултата от апи-то
                response = tupleResult.response;
            }
            finally
            {
                // освобождава семафора за следващи тредове, които чакат
                semaphoreSlim.Release();
            }

            return(response ?? new ServicePriceResponse
            {
                TransactionId = value.TransactionId,
                Time = DateTime.UtcNow,
                ResponseCode = 109,
                ConcentratorId = value.ConcentratorId,
                ControllerId = value.ControllerId,
                CardType = value.CardType,
                CardId = value.CardId,
                CardNumber = string.Empty,
                ServiceId = string.Empty,
                ServiceName = string.Empty,
                Price = 0
            });
        }