forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathResponseStatusTranslator.cs
More file actions
134 lines (120 loc) · 5.16 KB
/
ResponseStatusTranslator.cs
File metadata and controls
134 lines (120 loc) · 5.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
// $Id: ResponseStatusTranslator.cs 12245 2010-02-23 14:55:31Z Demis Bellot $
//
// Revision : $Revision: 12245 $
// Modified Date : $LastChangedDate: 2010-02-23 14:55:31 +0000 (Tue, 23 Feb 2010) $
// Modified By : $LastChangedBy: Demis Bellot $
//
// (c) Copyright 2010 Liquidbit Ltd
*/
using System;
using System.Collections.Generic;
using ServiceStack.Common.Extensions;
using ServiceStack.DesignPatterns.Translator;
using ServiceStack.FluentValidation;
using ServiceStack.ServiceHost;
using ServiceStack.Validation;
namespace ServiceStack.ServiceInterface.ServiceModel
{
/// <summary>
/// Translates a ValidationResult into a ResponseStatus DTO fragment.
/// </summary>
public class ResponseStatusTranslator
: ITranslator<ResponseStatus, ValidationErrorResult>
{
public static readonly ResponseStatusTranslator Instance
= new ResponseStatusTranslator();
public ResponseStatus Parse(Exception exception)
{
var validationError = exception as ValidationError;
if (validationError != null)
{
return this.Parse(validationError);
}
var validationException = exception as ValidationException;
if (validationException != null)
{
return this.Parse(validationException);
}
var httpError = exception as IHttpError;
return httpError != null
? CreateErrorResponse(httpError.ErrorCode, httpError.Message)
: CreateErrorResponse(exception.GetType().Name, exception.Message);
}
public ResponseStatus Parse(ValidationError validationException)
{
return CreateErrorResponse(validationException.ErrorCode, validationException.Message, validationException.Violations);
}
public ResponseStatus Parse(ValidationException validationException)
{
var errors = validationException.Errors.ConvertAll(x =>
new ValidationErrorField(x.ErrorCode, x.PropertyName, x.ErrorMessage));
return CreateErrorResponse(typeof(ValidationException).Name, validationException.Message, errors);
}
public ResponseStatus Parse(ValidationErrorResult validationResult)
{
return validationResult.IsValid
? CreateSuccessResponse(validationResult.SuccessMessage)
: CreateErrorResponse(validationResult.ErrorCode, validationResult.ErrorMessage, validationResult.Errors);
}
public static ResponseStatus CreateSuccessResponse(string message)
{
return new ResponseStatus { Message = message };
}
public static ResponseStatus CreateErrorResponse(string errorCode)
{
var errorMessage = errorCode.SplitCamelCase();
return CreateErrorResponse(errorCode, errorMessage, null);
}
public static ResponseStatus CreateErrorResponse(string errorCode, string errorMessage)
{
return CreateErrorResponse(errorCode, errorMessage, null);
}
/// <summary>
/// Creates the error response from the values provided.
///
/// If the errorCode is empty it will use the first validation error code,
/// if there is none it will throw an error.
/// </summary>
/// <param name="errorCode">The error code.</param>
/// <param name="errorMessage">The error message.</param>
/// <param name="validationErrors">The validation errors.</param>
/// <returns></returns>
public static ResponseStatus CreateErrorResponse(string errorCode, string errorMessage, IEnumerable<ValidationErrorField> validationErrors)
{
var to = new ResponseStatus {
ErrorCode = errorCode,
Message = errorMessage,
Errors = new List<ResponseError>(),
};
if (validationErrors != null)
{
foreach (var validationError in validationErrors)
{
var error = new ResponseError {
ErrorCode = validationError.ErrorCode,
FieldName = validationError.FieldName,
Message = validationError.ErrorMessage,
};
to.Errors.Add(error);
if (string.IsNullOrEmpty(to.ErrorCode))
{
to.ErrorCode = validationError.ErrorCode;
}
if (string.IsNullOrEmpty(to.Message))
{
to.Message = validationError.ErrorMessage;
}
}
}
if (string.IsNullOrEmpty(errorCode))
{
if (string.IsNullOrEmpty(to.ErrorCode))
{
throw new ArgumentException("Cannot create a valid error response with a en empty errorCode and an empty validationError list");
}
}
return to;
}
}
}