-
Notifications
You must be signed in to change notification settings - Fork 113
Expand file tree
/
Copy pathServiceExceptions.cs
More file actions
202 lines (178 loc) · 8.08 KB
/
ServiceExceptions.cs
File metadata and controls
202 lines (178 loc) · 8.08 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
//-----------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// The MIT License (MIT)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
// ---------------------------------------------------------------------------------
using System.Web.Http;
namespace PhotoSharingApp.AppService.ServiceCore
{
/// <summary>
/// Provides exceptions for the App Service.
/// </summary>
public static class ServiceExceptions
{
/// <summary>
/// Fault source for the App Service.
/// </summary>
public const string Source = "PhotoSharingAppService";
/// <summary>
/// Returns exception when there is an exception calling data layer.
/// </summary>
/// <param name="details">Fault inner message.</param>
/// <returns>Exception wrapping the fault.</returns>
public static HttpResponseException DataLayerException(string details)
{
return ServiceFault.InternalServerError(
Source,
DataLayerError,
"An unknown error occurred while communicating with data layer.",
details);
}
/// <summary>
/// Returns exception when a duplicate category is found during category
/// creation.
/// </summary>
/// <param name="details">Fault inner message.</param>
/// <returns>Exception wrapping the fault.</returns>
public static HttpResponseException DuplicateCategoryException(string details)
{
return ServiceFault.Forbidden(
Source,
DuplicateCategory,
"Category of the same name exists.",
details);
}
/// <summary>
/// Returns exception when the Iap validation fails.
/// </summary>
/// <param name="details">Fault message.</param>
/// <returns>Exception wrapping the fault.</returns>
public static HttpResponseException IapValidationException(string details)
{
return ServiceFault.BadRequest(
Source,
IapValidationError,
"Iap could not be validated.",
details);
}
/// <summary>
/// Returns an exception wrapping a fault response indicating that the Uri Id and the request body Id differ.
/// </summary>
/// <param name="pathArgumentId">Id from the Uri path argument.</param>
/// <param name="requestId">Id from the request body.</param>
/// <returns>Exception wrapping the fault response.</returns>
public static HttpResponseException IdMismatchException(string pathArgumentId, string requestId)
{
return ServiceFault.BadRequest(
Source,
IdMismatch,
"The ID value present in the URI differs from the one present in the request body.",
pathArgumentId,
requestId);
}
/// <summary>
/// Returns exception when the current user isn't allowed to perform this operation.
/// </summary>
/// <returns>Exception wrapping the fault.</returns>
public static HttpResponseException NotAllowed()
{
return ServiceFault.Forbidden(
Source,
IncorrectUser,
"The logged in user does not have access to perform this operation.",
null);
}
/// <summary>
/// Returns an exception wrapping a fault response indicating that an unknown internal failure occurred.
/// </summary>
/// <param name="faultSource">Source to use when creating ServiceFaults.</param>
/// <returns>Exception wrapping the fault response.</returns>
public static HttpResponseException UnknownInternalFailureException(string faultSource)
{
return ServiceFault.InternalServerError(
faultSource,
UnknownInternalFailure,
"The service has encountered an unknown internal server error.");
}
/// <summary>
/// Returns exception when the current operation will overdraw user balance.
/// </summary>
/// <returns>Exception wrapping the fault.</returns>
public static HttpResponseException UserBalanceTooLow()
{
return ServiceFault.Forbidden(
Source,
UserBalanceTooLowForOperation,
"User's balance is too low for this operation.",
null);
}
/// <summary>
/// Returns exception when the current authenticated user fetched from Azure Mobile Service is null.
/// </summary>
/// <returns>Exception wrapping the fault.</returns>
public static HttpResponseException UserNullException()
{
return ServiceFault.Forbidden(
Source,
UserNullError,
"This can only be performed by signed in clients.",
null);
}
#region 2000-2999: Bad Request
/// <summary errorCategory="2000-2999: Bad Request">
/// The ID value present in the URI differs from the one present in the request body.
/// </summary>
public const ushort IdMismatch = 2000;
/// <summary errorCategory="2000-2999: Iap validation Error" httpStatusCode="400">
/// Something is wrong with the Iap purchase receipt.
/// </summary>
public const ushort IapValidationError = 2500;
#endregion
#region 3000-3999: Forbidden Request
/// <summary errorCategory="3000-3999: Forbidden" httpStatusCode="403">
/// Authentication failed.
/// </summary>
public const ushort UserNullError = 3000;
/// <summary errorCategory="3000-3999: Invalid action. Photo not owned by user." httpStatusCode="403">
/// Photo not owned by user.
/// </summary>
public const ushort IncorrectUser = 3500;
/// <summary errorCategory="3000-3999: Category of same name exists." httpStatusCode="403">
/// User balance too low to support this operation.
/// </summary>
public const ushort DuplicateCategory = 3750;
/// <summary errorCategory="3000-3999: Can't overdraw user balance" httpStatusCode="403">
/// User balance too low to support this operation.
/// </summary>
public const ushort UserBalanceTooLowForOperation = 3999;
#endregion
#region 6000-6999: Internal Server Error
/// <summary errorCategory="6000-6999: Internal Server Error" httpStatusCode="500">
/// An unknown error occurred while communicating with Data access layer.
/// </summary>
public const ushort DataLayerError = 6000;
/// <summary errorCategory="6000-6999: Standard Internal Server Error" httpStatusCode="500">
/// The service has encountered an unknown internal server error.
/// </summary>
public const ushort UnknownInternalFailure = 6001;
#endregion
}
}