Refactor errors and some other stuff/fixes
This commit is contained in:
		
							parent
							
								
									8d996888bd
								
							
						
					
					
						commit
						5a7b2de0ea
					
				
					 28 changed files with 507 additions and 341 deletions
				
			
		| 
						 | 
				
			
			@ -4,8 +4,8 @@ use serde_derive::{Deserialize, Serialize};
 | 
			
		|||
use sqlx::pool::PoolConnection;
 | 
			
		||||
use sqlx::Sqlite;
 | 
			
		||||
 | 
			
		||||
use crate::db::errors::DatabaseError;
 | 
			
		||||
use crate::db::{DbRelay, DbTag};
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
use crate::types::ControllerUid;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Serialize, Deserialize)]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,8 +3,8 @@ use std::ops::DerefMut;
 | 
			
		|||
use sqlx::pool::PoolConnection;
 | 
			
		||||
use sqlx::Sqlite;
 | 
			
		||||
 | 
			
		||||
use crate::db::errors::DatabaseError;
 | 
			
		||||
use crate::db::{DbRelay, DbSchedule};
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
use crate::types::Weekday;
 | 
			
		||||
 | 
			
		||||
pub struct DbJunctionRelaySchedule {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,8 +3,8 @@ use std::ops::DerefMut;
 | 
			
		|||
use sqlx::pool::PoolConnection;
 | 
			
		||||
use sqlx::Sqlite;
 | 
			
		||||
 | 
			
		||||
use crate::db::errors::DatabaseError;
 | 
			
		||||
use crate::db::{DbRelay, DbSchedule, DbTag};
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
 | 
			
		||||
pub struct DbJunctionTag {
 | 
			
		||||
	pub id: i64,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,6 @@ use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions};
 | 
			
		|||
use sqlx::{Pool, Sqlite};
 | 
			
		||||
 | 
			
		||||
mod controllers;
 | 
			
		||||
pub mod errors;
 | 
			
		||||
mod junction_relay_schedule;
 | 
			
		||||
mod junction_tag;
 | 
			
		||||
mod model_utils;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,8 +4,8 @@ use serde_derive::{Deserialize, Serialize};
 | 
			
		|||
use sqlx::pool::PoolConnection;
 | 
			
		||||
use sqlx::Sqlite;
 | 
			
		||||
 | 
			
		||||
use crate::db::errors::DatabaseError;
 | 
			
		||||
use crate::db::{DbController, DbJunctionTag, DbTag};
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Serialize, Deserialize)]
 | 
			
		||||
pub struct DbRelay {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,9 +5,9 @@ use serde_derive::{Deserialize, Serialize};
 | 
			
		|||
use sqlx::pool::PoolConnection;
 | 
			
		||||
use sqlx::Sqlite;
 | 
			
		||||
 | 
			
		||||
use crate::db::errors::DatabaseError;
 | 
			
		||||
use crate::db::model_utils::Period;
 | 
			
		||||
use crate::db::{DbJunctionTag, DbTag};
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
use crate::types::ScheduleUid;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Serialize, Deserialize)]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@ use serde_derive::Serialize;
 | 
			
		|||
use sqlx::pool::PoolConnection;
 | 
			
		||||
use sqlx::Sqlite;
 | 
			
		||||
 | 
			
		||||
use crate::db::errors::DatabaseError;
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Clone)]
 | 
			
		||||
pub struct DbTag {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										25
									
								
								emgauwa-lib/src/errors/api_error.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								emgauwa-lib/src/errors/api_error.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
use actix_web::http::StatusCode;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub enum ApiError {
 | 
			
		||||
	ProtectedSchedule,
 | 
			
		||||
	InternalError(String),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ApiError {
 | 
			
		||||
	pub fn get_code(&self) -> StatusCode {
 | 
			
		||||
		match self {
 | 
			
		||||
			ApiError::ProtectedSchedule => StatusCode::FORBIDDEN,
 | 
			
		||||
			ApiError::InternalError(_) => StatusCode::INTERNAL_SERVER_ERROR,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<&ApiError> for String {
 | 
			
		||||
	fn from(err: &ApiError) -> Self {
 | 
			
		||||
		match err {
 | 
			
		||||
			ApiError::ProtectedSchedule => String::from("the targeted schedule is protected"),
 | 
			
		||||
			ApiError::InternalError(msg) => msg.clone(),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										107
									
								
								emgauwa-lib/src/errors/emgauwa_error.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								emgauwa-lib/src/errors/emgauwa_error.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,107 @@
 | 
			
		|||
use std::fmt::{Debug, Display, Formatter};
 | 
			
		||||
 | 
			
		||||
use actix_web::http::StatusCode;
 | 
			
		||||
use actix_web::HttpResponse;
 | 
			
		||||
use serde::ser::SerializeStruct;
 | 
			
		||||
use serde::{Serialize, Serializer};
 | 
			
		||||
 | 
			
		||||
use crate::errors::{ApiError, DatabaseError};
 | 
			
		||||
 | 
			
		||||
pub enum EmgauwaError {
 | 
			
		||||
	Api(ApiError),
 | 
			
		||||
	Uid(uuid::Error),
 | 
			
		||||
	Serialization(serde_json::Error),
 | 
			
		||||
	Database(DatabaseError),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl EmgauwaError {
 | 
			
		||||
	fn get_code(&self) -> StatusCode {
 | 
			
		||||
		match self {
 | 
			
		||||
			EmgauwaError::Api(err) => err.get_code(),
 | 
			
		||||
			EmgauwaError::Serialization(_) => StatusCode::INTERNAL_SERVER_ERROR,
 | 
			
		||||
			EmgauwaError::Database(err) => err.get_code(),
 | 
			
		||||
			EmgauwaError::Uid(_) => StatusCode::BAD_REQUEST,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<&EmgauwaError> for String {
 | 
			
		||||
	fn from(err: &EmgauwaError) -> Self {
 | 
			
		||||
		match err {
 | 
			
		||||
			EmgauwaError::Api(err) => String::from(err),
 | 
			
		||||
			EmgauwaError::Serialization(_) => String::from("error during (de-)serialization"),
 | 
			
		||||
			EmgauwaError::Database(err) => String::from(err),
 | 
			
		||||
			EmgauwaError::Uid(_) => String::from("the uid is in a bad format"),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<ApiError> for EmgauwaError {
 | 
			
		||||
	fn from(value: ApiError) -> Self {
 | 
			
		||||
		EmgauwaError::Api(value)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<DatabaseError> for EmgauwaError {
 | 
			
		||||
	fn from(value: DatabaseError) -> Self {
 | 
			
		||||
		EmgauwaError::Database(value)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<serde_json::Error> for EmgauwaError {
 | 
			
		||||
	fn from(value: serde_json::Error) -> Self {
 | 
			
		||||
		EmgauwaError::Serialization(value)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<sqlx::Error> for EmgauwaError {
 | 
			
		||||
	fn from(value: sqlx::Error) -> Self {
 | 
			
		||||
		EmgauwaError::Database(DatabaseError::from(value))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<uuid::Error> for EmgauwaError {
 | 
			
		||||
	fn from(value: uuid::Error) -> Self {
 | 
			
		||||
		EmgauwaError::Uid(value)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<&EmgauwaError> for HttpResponse {
 | 
			
		||||
	fn from(err: &EmgauwaError) -> Self {
 | 
			
		||||
		HttpResponse::build(err.get_code()).json(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Serialize for EmgauwaError {
 | 
			
		||||
	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
 | 
			
		||||
	where
 | 
			
		||||
		S: Serializer,
 | 
			
		||||
	{
 | 
			
		||||
		let mut s = serializer.serialize_struct("error", 2)?;
 | 
			
		||||
		s.serialize_field("code", &self.get_code().as_u16())?;
 | 
			
		||||
		s.serialize_field("description", &String::from(self))?;
 | 
			
		||||
		s.end()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Display for EmgauwaError {
 | 
			
		||||
	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
 | 
			
		||||
		write!(f, "{}: {}", self.get_code(), String::from(self))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Debug for EmgauwaError {
 | 
			
		||||
	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
 | 
			
		||||
		write!(f, "{}", String::from(self))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl actix_web::error::ResponseError for EmgauwaError {
 | 
			
		||||
	fn status_code(&self) -> StatusCode {
 | 
			
		||||
		self.get_code()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn error_response(&self) -> HttpResponse {
 | 
			
		||||
		HttpResponse::from(self)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								emgauwa-lib/src/errors/mod.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								emgauwa-lib/src/errors/mod.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
mod api_error;
 | 
			
		||||
mod database_error;
 | 
			
		||||
mod emgauwa_error;
 | 
			
		||||
 | 
			
		||||
pub use api_error::ApiError;
 | 
			
		||||
pub use database_error::DatabaseError;
 | 
			
		||||
pub use emgauwa_error::EmgauwaError;
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
pub mod constants;
 | 
			
		||||
pub mod db;
 | 
			
		||||
pub mod errors;
 | 
			
		||||
pub mod models;
 | 
			
		||||
pub mod types;
 | 
			
		||||
pub mod utils;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,8 +3,8 @@ use serde_derive::{Deserialize, Serialize};
 | 
			
		|||
use sqlx::pool::PoolConnection;
 | 
			
		||||
use sqlx::Sqlite;
 | 
			
		||||
 | 
			
		||||
use crate::db::errors::DatabaseError;
 | 
			
		||||
use crate::db::{DbController, DbJunctionRelaySchedule, DbRelay, DbSchedule};
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
use crate::types::{ControllerUid, Weekday};
 | 
			
		||||
use crate::utils;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,18 @@
 | 
			
		|||
mod controller_uid;
 | 
			
		||||
mod schedule_uid;
 | 
			
		||||
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
use std::sync::{Arc, Mutex};
 | 
			
		||||
 | 
			
		||||
use actix::Message;
 | 
			
		||||
pub use controller_uid::ControllerUid;
 | 
			
		||||
pub use schedule_uid::ScheduleUid;
 | 
			
		||||
use serde_derive::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
use crate::errors::EmgauwaError;
 | 
			
		||||
use crate::models::Controller;
 | 
			
		||||
 | 
			
		||||
pub type ConnectedControllersType = Arc<Mutex<HashMap<ControllerUid, Controller>>>;
 | 
			
		||||
pub type Weekday = i64;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize, Message)]
 | 
			
		||||
#[rtype(result = "Result<(), EmgauwaError>")]
 | 
			
		||||
pub enum ControllerWsAction {
 | 
			
		||||
	Register(Controller),
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue