@@ -146,49 +146,7 @@ pub struct ErrorToResponse {
146146
147147impl ResponseError for ServiceError {
148148 fn status_code ( & self ) -> StatusCode {
149- #[ allow( clippy:: match_same_arms) ]
150- match self {
151- ServiceError :: ClosedForRegistration => StatusCode :: FORBIDDEN ,
152- ServiceError :: EmailInvalid => StatusCode :: BAD_REQUEST ,
153- ServiceError :: NotAUrl => StatusCode :: BAD_REQUEST ,
154- ServiceError :: WrongPasswordOrUsername => StatusCode :: FORBIDDEN ,
155- ServiceError :: UsernameNotFound => StatusCode :: NOT_FOUND ,
156- ServiceError :: UserNotFound => StatusCode :: NOT_FOUND ,
157- ServiceError :: AccountNotFound => StatusCode :: NOT_FOUND ,
158- ServiceError :: ProfanityError => StatusCode :: BAD_REQUEST ,
159- ServiceError :: BlacklistError => StatusCode :: BAD_REQUEST ,
160- ServiceError :: UsernameCaseMappedError => StatusCode :: BAD_REQUEST ,
161- ServiceError :: PasswordTooShort => StatusCode :: BAD_REQUEST ,
162- ServiceError :: PasswordTooLong => StatusCode :: BAD_REQUEST ,
163- ServiceError :: PasswordsDontMatch => StatusCode :: BAD_REQUEST ,
164- ServiceError :: UsernameTaken => StatusCode :: BAD_REQUEST ,
165- ServiceError :: UsernameInvalid => StatusCode :: BAD_REQUEST ,
166- ServiceError :: EmailTaken => StatusCode :: BAD_REQUEST ,
167- ServiceError :: EmailNotVerified => StatusCode :: FORBIDDEN ,
168- ServiceError :: TokenNotFound => StatusCode :: UNAUTHORIZED ,
169- ServiceError :: TokenExpired => StatusCode :: UNAUTHORIZED ,
170- ServiceError :: TokenInvalid => StatusCode :: UNAUTHORIZED ,
171- ServiceError :: TorrentNotFound => StatusCode :: BAD_REQUEST ,
172- ServiceError :: InvalidTorrentFile => StatusCode :: BAD_REQUEST ,
173- ServiceError :: InvalidTorrentPiecesLength => StatusCode :: BAD_REQUEST ,
174- ServiceError :: InvalidFileType => StatusCode :: BAD_REQUEST ,
175- ServiceError :: BadRequest => StatusCode :: BAD_REQUEST ,
176- ServiceError :: InvalidCategory => StatusCode :: BAD_REQUEST ,
177- ServiceError :: InvalidTag => StatusCode :: BAD_REQUEST ,
178- ServiceError :: Unauthorized => StatusCode :: FORBIDDEN ,
179- ServiceError :: InfoHashAlreadyExists => StatusCode :: BAD_REQUEST ,
180- ServiceError :: TorrentTitleAlreadyExists => StatusCode :: BAD_REQUEST ,
181- ServiceError :: TrackerOffline => StatusCode :: INTERNAL_SERVER_ERROR ,
182- ServiceError :: CategoryAlreadyExists => StatusCode :: BAD_REQUEST ,
183- ServiceError :: TagAlreadyExists => StatusCode :: BAD_REQUEST ,
184- ServiceError :: InternalServerError => StatusCode :: INTERNAL_SERVER_ERROR ,
185- ServiceError :: EmailMissing => StatusCode :: NOT_FOUND ,
186- ServiceError :: FailedToSendVerificationEmail => StatusCode :: INTERNAL_SERVER_ERROR ,
187- ServiceError :: WhitelistingError => StatusCode :: INTERNAL_SERVER_ERROR ,
188- ServiceError :: DatabaseError => StatusCode :: INTERNAL_SERVER_ERROR ,
189- ServiceError :: CategoryNotFound => StatusCode :: NOT_FOUND ,
190- ServiceError :: TagNotFound => StatusCode :: NOT_FOUND ,
191- }
149+ http_status_code_for_service_error ( self )
192150 }
193151
194152 fn error_response ( & self ) -> HttpResponse {
@@ -220,22 +178,7 @@ impl From<sqlx::Error> for ServiceError {
220178
221179impl From < database:: Error > for ServiceError {
222180 fn from ( e : database:: Error ) -> Self {
223- #[ allow( clippy:: match_same_arms) ]
224- match e {
225- database:: Error :: Error => ServiceError :: InternalServerError ,
226- database:: Error :: ErrorWithText ( _) => ServiceError :: InternalServerError ,
227- database:: Error :: UsernameTaken => ServiceError :: UsernameTaken ,
228- database:: Error :: EmailTaken => ServiceError :: EmailTaken ,
229- database:: Error :: UserNotFound => ServiceError :: UserNotFound ,
230- database:: Error :: CategoryAlreadyExists => ServiceError :: CategoryAlreadyExists ,
231- database:: Error :: CategoryNotFound => ServiceError :: InvalidCategory ,
232- database:: Error :: TagAlreadyExists => ServiceError :: TagAlreadyExists ,
233- database:: Error :: TagNotFound => ServiceError :: InvalidTag ,
234- database:: Error :: TorrentNotFound => ServiceError :: TorrentNotFound ,
235- database:: Error :: TorrentAlreadyExists => ServiceError :: InfoHashAlreadyExists ,
236- database:: Error :: TorrentTitleAlreadyExists => ServiceError :: TorrentTitleAlreadyExists ,
237- database:: Error :: UnrecognizedDatabaseDriver => ServiceError :: InternalServerError ,
238- }
181+ map_database_error_to_service_error ( & e)
239182 }
240183}
241184
@@ -266,3 +209,70 @@ impl From<serde_json::Error> for ServiceError {
266209 ServiceError :: InternalServerError
267210 }
268211}
212+
213+ #[ must_use]
214+ pub fn http_status_code_for_service_error ( error : & ServiceError ) -> StatusCode {
215+ #[ allow( clippy:: match_same_arms) ]
216+ match error {
217+ ServiceError :: ClosedForRegistration => StatusCode :: FORBIDDEN ,
218+ ServiceError :: EmailInvalid => StatusCode :: BAD_REQUEST ,
219+ ServiceError :: NotAUrl => StatusCode :: BAD_REQUEST ,
220+ ServiceError :: WrongPasswordOrUsername => StatusCode :: FORBIDDEN ,
221+ ServiceError :: UsernameNotFound => StatusCode :: NOT_FOUND ,
222+ ServiceError :: UserNotFound => StatusCode :: NOT_FOUND ,
223+ ServiceError :: AccountNotFound => StatusCode :: NOT_FOUND ,
224+ ServiceError :: ProfanityError => StatusCode :: BAD_REQUEST ,
225+ ServiceError :: BlacklistError => StatusCode :: BAD_REQUEST ,
226+ ServiceError :: UsernameCaseMappedError => StatusCode :: BAD_REQUEST ,
227+ ServiceError :: PasswordTooShort => StatusCode :: BAD_REQUEST ,
228+ ServiceError :: PasswordTooLong => StatusCode :: BAD_REQUEST ,
229+ ServiceError :: PasswordsDontMatch => StatusCode :: BAD_REQUEST ,
230+ ServiceError :: UsernameTaken => StatusCode :: BAD_REQUEST ,
231+ ServiceError :: UsernameInvalid => StatusCode :: BAD_REQUEST ,
232+ ServiceError :: EmailTaken => StatusCode :: BAD_REQUEST ,
233+ ServiceError :: EmailNotVerified => StatusCode :: FORBIDDEN ,
234+ ServiceError :: TokenNotFound => StatusCode :: UNAUTHORIZED ,
235+ ServiceError :: TokenExpired => StatusCode :: UNAUTHORIZED ,
236+ ServiceError :: TokenInvalid => StatusCode :: UNAUTHORIZED ,
237+ ServiceError :: TorrentNotFound => StatusCode :: BAD_REQUEST ,
238+ ServiceError :: InvalidTorrentFile => StatusCode :: BAD_REQUEST ,
239+ ServiceError :: InvalidTorrentPiecesLength => StatusCode :: BAD_REQUEST ,
240+ ServiceError :: InvalidFileType => StatusCode :: BAD_REQUEST ,
241+ ServiceError :: BadRequest => StatusCode :: BAD_REQUEST ,
242+ ServiceError :: InvalidCategory => StatusCode :: BAD_REQUEST ,
243+ ServiceError :: InvalidTag => StatusCode :: BAD_REQUEST ,
244+ ServiceError :: Unauthorized => StatusCode :: FORBIDDEN ,
245+ ServiceError :: InfoHashAlreadyExists => StatusCode :: BAD_REQUEST ,
246+ ServiceError :: TorrentTitleAlreadyExists => StatusCode :: BAD_REQUEST ,
247+ ServiceError :: TrackerOffline => StatusCode :: INTERNAL_SERVER_ERROR ,
248+ ServiceError :: CategoryAlreadyExists => StatusCode :: BAD_REQUEST ,
249+ ServiceError :: TagAlreadyExists => StatusCode :: BAD_REQUEST ,
250+ ServiceError :: InternalServerError => StatusCode :: INTERNAL_SERVER_ERROR ,
251+ ServiceError :: EmailMissing => StatusCode :: NOT_FOUND ,
252+ ServiceError :: FailedToSendVerificationEmail => StatusCode :: INTERNAL_SERVER_ERROR ,
253+ ServiceError :: WhitelistingError => StatusCode :: INTERNAL_SERVER_ERROR ,
254+ ServiceError :: DatabaseError => StatusCode :: INTERNAL_SERVER_ERROR ,
255+ ServiceError :: CategoryNotFound => StatusCode :: NOT_FOUND ,
256+ ServiceError :: TagNotFound => StatusCode :: NOT_FOUND ,
257+ }
258+ }
259+
260+ #[ must_use]
261+ pub fn map_database_error_to_service_error ( error : & database:: Error ) -> ServiceError {
262+ #[ allow( clippy:: match_same_arms) ]
263+ match error {
264+ database:: Error :: Error => ServiceError :: InternalServerError ,
265+ database:: Error :: ErrorWithText ( _) => ServiceError :: InternalServerError ,
266+ database:: Error :: UsernameTaken => ServiceError :: UsernameTaken ,
267+ database:: Error :: EmailTaken => ServiceError :: EmailTaken ,
268+ database:: Error :: UserNotFound => ServiceError :: UserNotFound ,
269+ database:: Error :: CategoryAlreadyExists => ServiceError :: CategoryAlreadyExists ,
270+ database:: Error :: CategoryNotFound => ServiceError :: InvalidCategory ,
271+ database:: Error :: TagAlreadyExists => ServiceError :: TagAlreadyExists ,
272+ database:: Error :: TagNotFound => ServiceError :: InvalidTag ,
273+ database:: Error :: TorrentNotFound => ServiceError :: TorrentNotFound ,
274+ database:: Error :: TorrentAlreadyExists => ServiceError :: InfoHashAlreadyExists ,
275+ database:: Error :: TorrentTitleAlreadyExists => ServiceError :: TorrentTitleAlreadyExists ,
276+ database:: Error :: UnrecognizedDatabaseDriver => ServiceError :: InternalServerError ,
277+ }
278+ }
0 commit comments