Wrapped ApiError to have an simple "error" json object.

This commit is contained in:
Keanu D?lle 2020-10-29 23:54:25 +01:00
parent 44b39a348f
commit b847228f82
8 changed files with 92 additions and 97 deletions

View File

@ -142,6 +142,7 @@ DrivingPermissionModule = ( function() {
contentType: 'application/json',
success: function(data) {
console.log(data);
if('')
$(element).removeClass("btn-success").addClass("btn-warning");
$(element).data("permission-level", "license");
},

View File

@ -2,7 +2,7 @@ use crate::database::controller::member_licenses::{
add_member_driving_permission, add_member_license, remove_member_license,
};
use crate::helper::settings::Settings;
use crate::modules::api::model::api_outcome::ApiError;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
use diesel::result::Error;
use rocket::State;
use rocket_contrib::json::Json;
@ -11,22 +11,20 @@ pub fn add_member_license_or_error(
member_id: uuid::Uuid,
license_name: String,
settings: &State<Settings>,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
match add_member_license(settings, member_id, license_name) {
Ok(num) => {
if num != 1 {
Err(Json(ApiError {
code: "500-invalid-database-operations".to_string(),
description: format!("Performed {} database operations. Should be one.", num),
}))
Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten.".to_string()).to_wrapper(),
))
} else {
Ok(())
}
}
Err(_) => Err(Json(ApiError {
code: "500-database-error".to_string(),
description: format!("Database Error occurred."),
})),
Err(_) => Err(Json(
ApiError::new(400, "Datenbankfehler aufgetreten.".to_string()).to_wrapper(),
)),
}
}
@ -34,22 +32,22 @@ pub fn add_member_driving_permission_or_error(
member_id: uuid::Uuid,
license_name: String,
settings: &State<Settings>,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
match add_member_driving_permission(settings, member_id, license_name) {
Ok(num) => {
if num != 1 {
Err(Json(ApiError {
code: "500-invalid-database-operations".to_string(),
description: format!("Performed {} database operations. Should be one.", num),
}))
Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten".to_string()).to_wrapper(),
))
} else {
Ok(())
}
}
Err(_) => Err(Json(ApiError {
code: "500-database-error".to_string(),
description: format!("Database Error occurred."),
})),
Err(_) => {
(Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten".to_string()).to_wrapper(),
)))
}
}
}
@ -57,21 +55,19 @@ pub fn remove_member_license_or_error(
member_id: uuid::Uuid,
license_name: String,
settings: &State<Settings>,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
match remove_member_license(settings, member_id, license_name) {
Ok(num) => {
if num != 1 {
Err(Json(ApiError {
code: "500-invalid-database-operations".to_string(),
description: format!("Performed {} database operations. Should be one.", num),
}))
Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten.".to_string()).to_wrapper(),
))
} else {
Ok(())
}
}
Err(_) => Err(Json(ApiError {
code: "500-database-error".to_string(),
description: format!("Database Error occurred."),
})),
Err(_) => Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten.".to_string()).to_wrapper(),
)),
}
}

View File

@ -1,8 +1,10 @@
use crate::modules::api::model::api_outcome::ApiError;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
use rocket_contrib::json::Json;
use std::str::FromStr;
pub fn parse_qualification_id(qualification_id: String) -> Result<uuid::Uuid, Json<ApiError>> {
pub fn parse_qualification_id(
qualification_id: String,
) -> Result<uuid::Uuid, Json<ApiErrorWrapper>> {
match uuid::Uuid::from_str(&qualification_id) {
Ok(id) => Ok(id),
Err(e) => {
@ -10,15 +12,14 @@ pub fn parse_qualification_id(qualification_id: String) -> Result<uuid::Uuid, Js
"Couldn't parse qualification uuid send via API: {} {}",
qualification_id, e
);
Err(Json(ApiError {
code: "400-qualification-uuid-invalid".to_string(),
description: "qualification UUID invalid".to_string(),
}))
Err(Json(
ApiError::new(400, "Qualifikations UUID ungültig".to_string()).to_wrapper(),
))
}
}
}
pub fn parse_category_id(category_id: String) -> Result<uuid::Uuid, Json<ApiError>> {
pub fn parse_category_id(category_id: String) -> Result<uuid::Uuid, Json<ApiErrorWrapper>> {
match uuid::Uuid::from_str(&category_id) {
Ok(id) => Ok(id),
Err(e) => {
@ -26,10 +27,9 @@ pub fn parse_category_id(category_id: String) -> Result<uuid::Uuid, Json<ApiErro
"Couldn't parse category_id send via API: {} {}",
category_id, e
);
Err(Json(ApiError {
code: "400-category_id-invalid".to_string(),
description: "category id invalid".to_string(),
}))
Err(Json(
ApiError::new(400, "Kategoreie ID ungültig".to_string()).to_wrapper(),
))
}
}
}

View File

@ -1,12 +1,12 @@
use crate::database::controller::members::get_member_by_uuid;
use crate::helper::settings::Settings;
use crate::modules::api::model::api_outcome::ApiError;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
use crate::modules::member_management::model::member::Member;
use rocket::State;
use rocket_contrib::json::Json;
use std::str::FromStr;
pub fn parse_member_id(member_id: String) -> Result<uuid::Uuid, Json<ApiError>> {
pub fn parse_member_id(member_id: String) -> Result<uuid::Uuid, Json<ApiErrorWrapper>> {
match uuid::Uuid::from_str(&member_id) {
Ok(id) => Ok(id),
Err(e) => {
@ -14,10 +14,9 @@ pub fn parse_member_id(member_id: String) -> Result<uuid::Uuid, Json<ApiError>>
"Couldn't parse member uuid send via API: {} {}",
member_id, e
);
Err(Json(ApiError {
code: "400".to_string(),
description: "Mitglied UUID ungültig.".to_string(),
}))
Err(Json(
ApiError::new(400, "UUID des Mitglieds ist ungültig!".to_string()).to_wrapper(),
))
}
}
}
@ -25,23 +24,21 @@ pub fn parse_member_id(member_id: String) -> Result<uuid::Uuid, Json<ApiError>>
pub fn get_member_or_error(
member_id: uuid::Uuid,
settings: &State<Settings>,
) -> Result<Member, Json<ApiError>> {
) -> Result<Member, Json<ApiErrorWrapper>> {
match get_member_by_uuid(member_id, &settings) {
Some(member) => Ok(member),
None => Err(Json(ApiError {
code: "500".to_string(),
description: "Konnte Mitglied nicht laden.".to_string(),
})),
None => Err(Json(
ApiError::new(500, "Konnte Mitglied nicht laden!".to_string()).to_wrapper(),
)),
}
}
//Unwraps member from cookie or send user to login if no member specified (user skipped member selection)
pub fn parse_member_cookie(member: Option<Member>) -> Result<Member, Json<ApiError>> {
pub fn parse_member_cookie(member: Option<Member>) -> Result<Member, Json<ApiErrorWrapper>> {
match member {
Some(member) => Ok(member),
None => Err(Json(ApiError {
code: "403".to_string(),
description: "Mitgliederauswahl übersprungen".to_string(),
})),
None => Err(Json(
ApiError::new(403, "Kein Mitglied für Account ausgewählt!".to_string()).to_wrapper(),
)),
}
}

View File

@ -10,7 +10,7 @@ use crate::modules::api::member_management::controller::parser::{
use crate::modules::api::member_management::model::member_communication::{
CommunicationTargetId, CommunicationTypeList,
};
use crate::modules::api::model::api_outcome::ApiError;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
use diesel::result::Error;
use rocket::State;
use rocket_contrib::json::Json;
@ -19,7 +19,7 @@ use rocket_contrib::json::Json;
pub fn api_member_get_communication_types(
cookie: SessionCookie,
settings: State<Settings>,
) -> Result<Json<CommunicationTypeList>, Json<ApiError>> {
) -> Result<Json<CommunicationTypeList>, Json<ApiErrorWrapper>> {
//TODO: Check permissions!
let member = parse_member_cookie(cookie.member)?;
@ -37,16 +37,15 @@ pub fn api_member_add_communication_target(
cookie: SessionCookie,
settings: State<Settings>,
communication_target: Json<CommunicationTarget>,
) -> Result<Json<CommunicationTargetId>, Json<ApiError>> {
) -> Result<Json<CommunicationTargetId>, Json<ApiErrorWrapper>> {
//TODO: Check permissions!
let member = parse_member_cookie(cookie.member)?;
match add_communication_target(&settings, communication_target.into_inner()) {
Ok(target_id) => Ok(Json(CommunicationTargetId { target_id })),
Err(_) => Err(Json(ApiError {
code: "500".to_string(),
description: format!("Database error occured."),
})),
Err(_) => Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten".to_string()).to_wrapper(),
)),
}
}
@ -58,16 +57,15 @@ pub fn api_member_remove_communication_target(
cookie: SessionCookie,
settings: State<Settings>,
target_id: String,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
//TODO: Check permissions!
let member = parse_member_cookie(cookie.member)?;
let target_id = parse_member_id(target_id)?;
match remove_communication_target(&settings, target_id) {
Ok(_) => Ok(()),
Err(_) => Err(Json(ApiError {
code: "500".to_string(),
description: "Database error occured".to_string(),
})),
Err(_) => Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten".to_string()).to_wrapper(),
)),
}
}

View File

@ -9,7 +9,7 @@ use crate::modules::api::member_management::controller::member_driving_permissio
use crate::modules::api::member_management::controller::parser::{
get_member_or_error, parse_member_cookie, parse_member_id,
};
use crate::modules::api::model::api_outcome::ApiError;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
use rocket::State;
use rocket_contrib::json::Json;
use std::str::FromStr;
@ -23,7 +23,7 @@ pub fn api_member_add_driving_license(
settings: State<Settings>,
member_id: String,
license_name: String,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
let caller = parse_member_cookie(cookie.member)?;
let member = get_member_or_error(parse_member_id(member_id)?, &settings)?;
@ -33,10 +33,7 @@ pub fn api_member_add_driving_license(
caller.entity_id,
"modules.member_management.modules.member_management.profile.drive_permissions_licenses.edit".to_string(),
) {
return Err(Json(ApiError{
code: "401".to_string(),
description: "Keine Berechtigung, Fahrberechtigungen zu ändern!".to_string()
}));
return Err(Json(ApiError::new(401, "Keine Berechtigung, Fahrberechtigungen zu ändern!".to_string()).to_wrapper()));
}
add_member_license_or_error(member.entity_id, license_name, &settings)
@ -51,7 +48,7 @@ pub fn api_member_add_driving_permission(
settings: State<Settings>,
member_id: String,
license_name: String,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
let caller = parse_member_cookie(cookie.member)?;
let member = get_member_or_error(parse_member_id(member_id)?, &settings)?;
@ -61,10 +58,7 @@ pub fn api_member_add_driving_permission(
caller.entity_id,
"modules.member_management.modules.member_management.profile.drive_permissions_licenses.edit".to_string(),
) {
return Err(Json(ApiError{
code: "401".to_string(),
description: "Keine Berechtigung, Fahrberechtigungen zu ändern!".to_string()
}));
return Err(Json(ApiError::new(401, "Keine Berechtigung, Fahrberechtigungen zu ändern!".to_string()).to_wrapper()));
}
add_member_driving_permission_or_error(member.entity_id, license_name, &settings)
@ -79,7 +73,7 @@ pub fn api_member_remove_driving_license(
settings: State<Settings>,
member_id: String,
license_name: String,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
let caller = parse_member_cookie(cookie.member)?;
let member = get_member_or_error(parse_member_id(member_id)?, &settings)?;
@ -89,10 +83,7 @@ pub fn api_member_remove_driving_license(
caller.entity_id,
"modules.member_management.modules.member_management.profile.drive_permissions_licenses.edit".to_string(),
) {
return Err(Json(ApiError{
code: "401".to_string(),
description: "Keine Berechtigung, Fahrberechtigungen zu ändern!".to_string()
}));
return Err(Json(ApiError::new(401, "Keine Berechtigung, Fahrberechtigungen zu ändern!".to_string()).to_wrapper()));
}
remove_member_license_or_error(member.entity_id, license_name, &settings)

View File

@ -10,7 +10,7 @@ use crate::modules::api::member_management::controller::member_qualifications::{
use crate::modules::api::member_management::controller::parser::{
parse_member_cookie, parse_member_id,
};
use crate::modules::api::model::api_outcome::ApiError;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
use crate::modules::member_management::model::qualifications::{
Qualification, QualificationCategory, QualificationList,
};
@ -28,7 +28,7 @@ pub fn api_member_get_qualifications(
cookie: SessionCookie,
settings: State<Settings>,
member_id: String,
) -> Result<Json<QualificationList>, Json<ApiError>> {
) -> Result<Json<QualificationList>, Json<ApiErrorWrapper>> {
//TODO: Check permissions!
let member = parse_member_cookie(cookie.member)?;
let member_id = parse_member_id(member_id)?;
@ -46,7 +46,7 @@ pub fn api_member_get_qualifications_for_category(
cookie: SessionCookie,
settings: State<Settings>,
category_id: String,
) -> Result<Json<Vec<Qualification>>, Json<ApiError>> {
) -> Result<Json<Vec<Qualification>>, Json<ApiErrorWrapper>> {
//TODO: Check permissions!
let member = parse_member_cookie(cookie.member)?;
let category_id = parse_category_id(category_id)?;
@ -65,7 +65,7 @@ pub fn api_member_remove_qualification(
settings: State<Settings>,
member_id: String,
qualification_id: String,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
let member = parse_member_cookie(cookie.member)?;
let member_id = parse_member_id(member_id)?;
let qualification_id = parse_qualification_id(qualification_id)?;
@ -73,10 +73,9 @@ pub fn api_member_remove_qualification(
match remove_qualification_for_member(&settings, member_id, qualification_id) {
Ok(_) => Ok(()),
Err(e) => {
return Err(Json(ApiError {
code: "500".to_string(),
description: format!("Database error occured: {}", e),
}))
return Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten".to_string()).to_wrapper(),
))
}
}
@ -92,7 +91,7 @@ pub fn api_member_add_qualification(
settings: State<Settings>,
member_id: String,
qualification_id: String,
) -> Result<(), Json<ApiError>> {
) -> Result<(), Json<ApiErrorWrapper>> {
let member = parse_member_cookie(cookie.member)?;
let member_id = parse_member_id(member_id)?;
let qualification_id = parse_qualification_id(qualification_id)?;
@ -100,10 +99,9 @@ pub fn api_member_add_qualification(
match add_qualification_for_member(&settings, member_id, qualification_id) {
Ok(_) => Ok(()),
Err(e) => {
return Err(Json(ApiError {
code: "500".to_string(),
description: format!("Database error occured: {}", e),
}))
return Err(Json(
ApiError::new(500, "Datenbankfehler aufgetreten".to_string()).to_wrapper(),
))
}
}

View File

@ -1,5 +1,19 @@
#[derive(Serialize, Deserialize, Queryable, Clone, Debug)]
pub struct ApiError {
pub(crate) code: String,
pub(crate) code: u16,
pub(crate) description: String,
}
#[derive(Serialize, Deserialize, Queryable, Clone, Debug)]
pub struct ApiErrorWrapper {
pub(crate) error: ApiError,
}
impl ApiError {
pub fn new(code: u16, description: String) -> ApiError {
ApiError { code, description }
}
pub fn to_wrapper(self) -> ApiErrorWrapper {
ApiErrorWrapper { error: self }
}
}