public static async Task ResponseFilterAsync(IRequest req, IResponse res, object requestDto) { if (!(requestDto is IHasResponseStatus response)) { return; } var validator = ValidatorCache.GetValidator(req, req.Dto.GetType()); if (validator == null) { return; } var validationResult = await Validate(validator, req, req.Dto); var responseStatus = response.ResponseStatus ?? DtoUtils.CreateResponseStatus(validationResult.Errors[0].ErrorCode); foreach (var error in validationResult.Errors) { var responseError = new ResponseError { ErrorCode = error.ErrorCode, FieldName = error.PropertyName, Message = error.ErrorMessage, Meta = new Dictionary <string, string> { ["Severity"] = error.Severity.ToString() } }; responseStatus.Errors.Add(responseError); } response.ResponseStatus = responseStatus; }
private static void SetupExceptionShielding(IAppHost appHost) { appHost.ServiceExceptionHandlers.Add((httpReq, request, exception) => { if (IsUnexpectedException(exception)) { var error = DtoUtils.CreateResponseStatus(exception, request, true); var recorder = appHost.Resolve <IRecorder>(); var callerId = appHost.TryResolve <ICurrentCaller>()?.Id; recorder.Crash(CrashLevel.NonCritical, exception, callerId, error.StackTrace); return(DtoUtils.CreateErrorResponse(request, WrapInUnhandledException(exception))); } return(null); }); appHost.UncaughtExceptionHandlers.Add((request, response, operationName, exception) => { var recorder = appHost.Resolve <IRecorder>(); var callerId = appHost.TryResolve <ICurrentCaller>()?.Id; recorder.Crash(CrashLevel.Critical, WrapInUnhandledException(exception), callerId); response.EndRequest(true); });