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() }; }
public List <Service> Retrieve(ServicePriceRequest request) { return(GenerateServices(request.Booking)); }
// метода се извиква при всяко запитване на конектнатия клиент 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)); }
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 }); }