1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2025-06-20 16:35:17 +00:00
This commit is contained in:
2022-03-11 20:16:02 +01:00
parent 254b74282e
commit 5abb162233
6 changed files with 47 additions and 16 deletions

View File

@ -8,7 +8,7 @@ use crate::routes::RequestResult;
/// @author Pierre Hubert
/// Root server index
pub fn main_index(request: &mut HttpRequestHandler) -> RequestResult {
pub async fn main_index(request: &mut HttpRequestHandler) -> RequestResult {
request.success("Comunic API server V3. (c) Pierre Hubert 2020")
}

View File

@ -1,7 +1,11 @@
use std::error::Error;
use std::future::Future;
use std::pin::Pin;
use async_trait::async_trait;
use crate::constants::admin::AdminRole;
use crate::controllers::{account_controller, comments_controller, conversations_controller, forez_controller, friends_controller, groups_controller, likes_controller, notifications_controller, posts_controller, push_notifications_controller, search_controller, server_controller, settings_controller, surveys_controller, user_controller, user_ws_controller, virtual_directory_controller, web_app_controller};
use crate::controllers::*;
use crate::controllers::admin::*;
use crate::data::http_request_handler::HttpRequestHandler;
use crate::routes::Method::{GET, POST};
@ -60,6 +64,19 @@ impl LimitPolicy {
}
}
pub trait RouteTrait{
fn call(&self, req: &mut HttpRequestHandler) -> Pin<Box<dyn Future<Output=RequestResult>>>;
}
impl<Func, Fut> RouteTrait for Func where Func: 'static + Fn(&mut HttpRequestHandler) -> Fut + Clone ,
Fut: 'static +Future<Output=RequestResult> {
#[inline]
#[allow(non_snake_case)]
fn call(&self, req: &mut HttpRequestHandler) -> Pin<Box<dyn Future<Output=RequestResult>>> {
Box::pin((self)(req))
}
}
/// Define types
pub type RequestResult = Result<(), Box<dyn Error>>;
pub type RequestProcess = Box<dyn Fn(&mut HttpRequestHandler) -> RequestResult>;
@ -78,7 +95,7 @@ pub struct Route {
pub need_login: bool,
/// The function called to process a request
pub func: RequestProcess,
pub func: Pin<Box<dyn RouteTrait + 'static>>,
/// Request rate policy
pub limit_policy: LimitPolicy,
@ -88,19 +105,19 @@ pub struct Route {
}
impl Route {
pub fn get_without_login(uri: &'static str, func: RequestProcess) -> Route {
pub fn get_without_login<E>(uri: &'static str, func: E) -> Route where E: 'static + RouteTrait {
Route {
scope: RouteScope::USER,
method: GET,
need_login: false,
uri,
func,
func: Box::pin(func),
limit_policy: LimitPolicy::NONE,
admin_role: None,
}
}
pub fn post_without_login(uri: &'static str, func: RequestProcess) -> Route {
/*pub fn post_without_login(uri: &'static str, func: RequestProcess) -> Route {
Route {
scope: RouteScope::USER,
method: POST,
@ -182,15 +199,15 @@ impl Route {
limit_policy: LimitPolicy::NONE,
admin_role: Some(role),
}
}
}*/
}
/// Get the list of routes available
pub fn get_routes() -> Vec<Route> {
vec![
// Server meta routes
Route::get_without_login("/", Box::new(server_controller::main_index)),
Route::post_without_login("/server/config", Box::new(server_controller::get_config)),
Route::get_without_login("/", server_controller::main_index),
/*Route::post_without_login("/server/config", Box::new(server_controller::get_config)),
// Main user WebSocket
Route::post("/ws/token", Box::new(user_ws_controller::get_token)),
@ -399,6 +416,6 @@ pub fn get_routes() -> Vec<Route> {
Route::admin_post("/admin/users/search", Box::new(admin_users_controller::search)),
Route::admin_post("/admin/users/info", Box::new(admin_users_controller::get_single)),
Route::admin_post("/admin/users/change_email_address", Box::new(admin_users_controller::change_email_address)),
Route::admin_post("/admin/users/create_password_reset_link", Box::new(admin_users_controller::create_password_reset_link)),
Route::admin_post("/admin/users/create_password_reset_link", Box::new(admin_users_controller::create_password_reset_link)),*/
]
}

View File

@ -236,7 +236,8 @@ async fn process_simple_route(route: &Route, req: &mut HttpRequestHandler) -> Re
}
let res: RequestResult = (route.func)(req);
let res = route.func.call(req).await;
requests_limit_helper::trigger_after(res.is_ok(), req, route)?;