private void onResponse(Response response) { switch (response.ResponseCase) { case Response.ResponseOneofCase.OrderReports: OrderReports orderReports = response.OrderReports; foreach (var orderReport in orderReports.OrderReport) { Debug.WriteLine("recieve the order/exeuction report message:{0}", orderReport); } break; case Response.ResponseOneofCase.MarketDatas: MarketDatas marketDatas = response.MarketDatas; foreach (var marketData in marketDatas.MarketData) { Debug.WriteLine("recieve the market data update message:{0}", marketData); } break; case Response.ResponseOneofCase.Ping: Ping pingMsg = response.Ping; Debug.WriteLine("recieve the ping message:{0}", pingMsg); break; case Response.ResponseOneofCase.Notice: NoticeMessages noticeMsgs = response.Notice; foreach (var noticeMsg in noticeMsgs.Notice) { Debug.WriteLine("recieve the notice message:{0}", noticeMsg); } break; case Response.ResponseOneofCase.ServiceStatus: ServiceStatuses serviceStatuses = response.ServiceStatus; foreach (var status in serviceStatuses.Status) { Debug.WriteLine("recieve the service status message:{0}", status); } break; case Response.ResponseOneofCase.Instruments: Instruments instruments = response.Instruments; foreach (var instrument in instruments.Instrument) { Debug.WriteLine("recieve the new instrument message:{0}", instrument); } break; case Response.ResponseOneofCase.InstrumentStatus: InstrumentStatuses instrumentStatuses = response.InstrumentStatus; foreach (var instrumentStatus in instrumentStatuses.Status) { Debug.WriteLine("recieve the instrument status change message:{0}", instrumentStatus); } break; case Response.ResponseOneofCase.Position: AccountPosition acctPostion = response.Position; foreach (var postioin in acctPostion.Positions) { Debug.WriteLine("recieve the position message:{0}", postioin); } break; case Response.ResponseOneofCase.SpreaderID: case Response.ResponseOneofCase.LogonResult: case Response.ResponseOneofCase.QueryResult: case Response.ResponseOneofCase.None: case Response.ResponseOneofCase.Extension: default: Assert.Fail("this should not in broadcast message from server"); break; } }
// success means called Thrid Party, saved raw request and raw response, (and saved warrantyProof), and returns a converted response // --- // anything here after SaveExternalPartyResponse in BudgetDatabase should be pure (non-deterministic and no side-effect) // so that the saved ExternalPartyResponse can be a source of truth internal async Task <Result <WarrantyCaseResponse, IFailure> > PerformVerifyAction( VerifyWarrantyCaseRequest request, WarrantyCaseOperation operation, Guid requestId) { var validateRequestResult = RequestValidator.Validate(request, operation, requestId); if (!validateRequestResult.IsSuccess) { return(new Result <WarrantyCaseResponse, IFailure>(validateRequestResult.Failure !)); } var build = RequestBuilder.Build(request, operation, requestId); if (!build.IsSuccess) { return(new Result <WarrantyCaseResponse, IFailure>(build.Failure !)); } var warrantyRequest = build.Success !; var saveWarrantyRequest = await BudgetDataWrapper.SaveExternalPartyRequest( new ExternalPartyRequest( orderId : request.OrderId, request : JsonConvert.SerializeObject(warrantyRequest)) { Operation = operation, RequestId = requestId, }); if (!saveWarrantyRequest.IsSuccess) { return(new Result <WarrantyCaseResponse, IFailure>(saveWarrantyRequest.Failure !)); } var call = await ExternalPartyWrapper.Call(warrantyRequest); if (!call.IsSuccess) { return(new Result <WarrantyCaseResponse, IFailure>(call.Failure !)); } var rawResponse = call.Success !; var saveWarrantyResponse = await BudgetDataWrapper.SaveExternalPartyResponse( new ExternalPartyResponse( orderId : request.OrderId, response : JsonConvert.SerializeObject(rawResponse)) { Operation = operation, RequestId = requestId, }); if (!saveWarrantyResponse.IsSuccess) { return(new Result <WarrantyCaseResponse, IFailure>(saveWarrantyRequest.Failure !)); } var validateResponse = ResponseValidator.Validate(request, operation, requestId, rawResponse); if (!validateResponse.IsSuccess) { return(new Result <WarrantyCaseResponse, IFailure>(validateResponse.Failure !)); } var convertResponse = ResponseConverter.Convert(request, operation, requestId, rawResponse); if (!convertResponse.IsSuccess) { return(new Result <WarrantyCaseResponse, IFailure>(convertResponse.Failure !)); } var convertedResponse = convertResponse.Success !; if (operation == WarrantyCaseOperation.Commit && convertedResponse.WarrantyCaseStatus == WarrantyCaseStatus.Committed) { var saveWarrantyProof = await ComprehensiveDataWrapper.SaveWarrantyProof( new WarrantyProof( orderId : request.OrderId, warrantyCaseId : convertedResponse.WarrantyCaseId, proof : rawResponse.Body !.OrderReports.Single().WarrantyProof !) { RequestId = requestId, });
public ValidatableResponseValidator() { RuleFor(y => y.WarrantyResponse.Header).NotNull(); When(y => y.WarrantyResponse.Header != null, () => { RuleFor(y => y.WarrantyResponse.Header.RequestId).Equal(y => y.RequestId); RuleFor(y => y.WarrantyResponse.Header.RequestType).Equal(y => OperationRequestTypeMap[y.Operation]); RuleFor(y => y.WarrantyResponse.Header.Action).Equal(y => OperationActionMap[y.Operation]); RuleFor(y => y.WarrantyResponse.Header.WarrantyCaseId).NotEmpty(); When(y => y.Operation != WarrantyCaseOperation.Create, () => { RuleFor(y => y.WarrantyResponse.Header.WarrantyCaseId).Equal(y => y.Request.WarrantyCaseId); }); RuleFor(y => y.WarrantyResponse.Header.WarrantyResponseErrors).Empty(); }); RuleFor(y => y.WarrantyResponse.Body).NotNull(); When(y => y.WarrantyResponse.Body != null, () => { RuleFor(y => y.WarrantyResponse.Body !.CaseStatus).IsInEnum(); RuleFor(y => y.WarrantyResponse.Body !.ConformanceIndicator) .Must(c => c.Equals("YES") || c.Equals("NO")); When(y => y.WarrantyResponse.Body !.CaseStatus != CaseStatus.Cancelled, () => { RuleFor(y => y.WarrantyResponse.Body !.OrderReports) .Cascade(CascadeMode.Stop) .NotEmpty() .Must(rs => rs.Count() == 1) .WithMessage("Must have one element in {PropertyName}.") .Must((y, rs) => rs.Single().OrderId == y.Request.OrderId) .WithMessage("OrderReport's OrderId must be the same as the request's."); When(y => y.WarrantyResponse.Body !.OrderReports.Count() == 1, () => { RuleForEach(y => y.WarrantyResponse.Body !.OrderReports).ChildRules(orderReportRule => { orderReportRule.RuleFor(r => r.ConformanceIndicator) .Must(c => c.Equals("YES") || c.Equals("NO")); orderReportRule.RuleForEach(r => r.ConformanceMessages).ChildRules(conformanceMessageRule => { conformanceMessageRule.RuleFor(m => m.Level).IsInEnum(); conformanceMessageRule.RuleFor(m => m.Message).NotEmpty(); }); }); }); When(y => y.WarrantyResponse.Body !.CaseStatus == CaseStatus.Certified, () => { RuleForEach(y => y.WarrantyResponse.Body !.OrderReports).ChildRules(orderReportRule => { orderReportRule.RuleFor(r => r.ConformanceIndicator).Equal("YES"); orderReportRule.RuleFor(r => r.WarrantyAmount).Must(a => a.HasValue); }); }); When(y => y.WarrantyResponse.Body !.CaseStatus == CaseStatus.Committed || y.WarrantyResponse.Body !.CaseStatus == CaseStatus.Completed, () => { RuleForEach(y => y.WarrantyResponse.Body !.OrderReports).ChildRules(orderReportRule => { orderReportRule.RuleFor(r => r.ConformanceIndicator).Equal("YES"); orderReportRule.RuleFor(r => r.WarrantyAmount).Must(a => a.HasValue); orderReportRule.RuleFor(r => r.WarrantyProof).NotEmpty(); }); }); }); });