You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.5 KiB

mod handlers;
mod db;
mod errors;
4 years ago
use warp::{
4 years ago
Filter,
Rejection,
Reply,
4 years ago
body
4 years ago
};
4 years ago
extern crate log;
extern crate env_logger;
4 years ago
4 years ago
use u_lib::{
MASTER_PORT,
api::Paths,
models::*
4 years ago
};
use db::*;
use serde::{
de::DeserializeOwned
};
4 years ago
use uuid::Uuid;
fn get_content<M>()
-> impl Filter<Extract = (BaseMessage<'static, M>,),
Error = Rejection> + Clone
where
M: ToMsg + Sync + Send + DeserializeOwned + 'static
{
body::content_length_limit(1024*64)
.and(body::json::<BaseMessage<M>>())
4 years ago
}
4 years ago
#[tokio::main]
async fn main() {
env_logger::init();
4 years ago
let base_db = UDB::new().unwrap();
let db = warp::any().map(move || base_db.clone());
4 years ago
let infallible_none = |_| async {
Ok::<(Option<Uuid>,), std::convert::Infallible>((None,))
};
4 years ago
4 years ago
let new_agent = warp::post()
.and(warp::path(Paths::init))
4 years ago
.and(get_content::<IAgent>())
.and(db.clone())
.and_then(handlers::add_agent);
let get_agents = warp::get()
.and(warp::path(Paths::get_agents))
4 years ago
.and(warp::path::param::<Uuid>().map(Some).or_else(infallible_none))
4 years ago
.and(db.clone())
.and_then(handlers::get_agents);
4 years ago
let upload_jobs = warp::post()
.and(warp::path(Paths::upload_jobs))
.and(get_content::<Vec<JobMeta>>())
.and(db.clone())
4 years ago
.and_then(handlers::upload_jobs);
let get_jobs = warp::get()
.and(warp::path(Paths::get_jobs))
4 years ago
.and(warp::path::param::<Uuid>().map(Some).or_else(infallible_none))
.and(db.clone())
.and_then(handlers::get_jobs);
4 years ago
let get_agent_jobs = warp::get()
.and(warp::path(Paths::get_agent_jobs))
4 years ago
.and(warp::path::param::<Uuid>().map(Some).or_else(infallible_none))
4 years ago
.and(db.clone())
4 years ago
.and_then(|uid, db| handlers::get_agent_jobs(uid, db, false));
let get_personal_jobs = warp::get()
.and(warp::path(Paths::get_agent_jobs))
.and(warp::path::param::<Uuid>().map(Some).or_else(infallible_none))
.and(db.clone())
.and_then(|uid, db| handlers::get_agent_jobs(uid, db, true));
4 years ago
let del = warp::get()
.and(warp::path(Paths::del))
.and(warp::path::param::<Uuid>())
.and(db.clone())
.and_then(handlers::del);
4 years ago
4 years ago
let set_jobs = warp::post()
.and(warp::path(Paths::set_jobs))
.and(warp::path::param::<Uuid>())
4 years ago
.and(get_content::<Vec<Uuid>>())
4 years ago
.and(db.clone())
4 years ago
.and_then(handlers::set_jobs);
4 years ago
let report = warp::post()
.and(warp::path(Paths::report))
.and(get_content::<Vec<JobResult>>())
.and(db.clone())
.and_then(handlers::report);
4 years ago
let get_results = warp::get()
.and(warp::path(Paths::get_results))
.and(warp::path::param::<Uuid>().map(Some).or_else(infallible_none))
.and(db.clone())
.and_then(handlers::get_results);
let auth_token = warp::header::exact("authorization", "Bearer 123qwe");
4 years ago
let agent_zone = new_agent
.or(get_personal_jobs)
.or(report)
;
let auth_zone = auth_token
4 years ago
.and(
get_agents
.or(get_jobs)
.or(upload_jobs)
.or(del)
.or(set_jobs)
.or(get_agent_jobs)
.or(get_results)
4 years ago
);
4 years ago
4 years ago
let routes = agent_zone
.or(auth_zone);
4 years ago
warp::serve(routes.with(warp::log("warp")))
4 years ago
.run(([0,0,0,0], MASTER_PORT)).await;
4 years ago
}
#[cfg(test)]
mod tests {
use super::*;
/*
#[tokio::test]
async fn test_gather() {
}
*/
}