jmserver/src/v1/routes.rs

141 lines
5 KiB
Rust
Raw Normal View History

2021-12-17 23:50:03 +01:00
use crate::config::ConfVars;
2021-07-19 22:29:03 +02:00
use crate::v1::models::*;
use sqlx::{MySqlPool, Error};
2021-08-26 17:45:38 +02:00
use axum::{Router, Json};
use axum::routing::BoxRoute;
use axum::response::IntoResponse;
use axum::handler::get;
use axum::extract::{Query, Extension};
use axum::http::StatusCode;
2021-07-19 22:29:03 +02:00
2021-12-17 23:50:03 +01:00
async fn meme(params: Query<MemeIDQuery>, Extension(db_pool): Extension<MySqlPool>, Extension(vars): Extension<ConfVars>) -> impl IntoResponse {
let q = Meme::get(params.id, &db_pool, vars.cdn).await;
2021-07-19 22:29:03 +02:00
match q {
2021-08-26 17:45:38 +02:00
Ok(meme) => (StatusCode::OK, Json(MemeResponse {
2021-07-19 22:29:03 +02:00
status: 200,
error: None,
2021-08-26 17:45:38 +02:00
meme: Some(meme)
})),
2021-07-19 22:29:03 +02:00
Err(err) => match err {
2021-08-26 17:45:38 +02:00
Error::RowNotFound => (StatusCode::NOT_FOUND, Json(MemeResponse {
2021-07-19 22:29:03 +02:00
status: 404,
2021-08-26 17:45:38 +02:00
error: Some(String::from("Meme not found")),
2021-07-19 22:29:03 +02:00
meme: None
2021-08-26 17:45:38 +02:00
})),
_ => (StatusCode::INTERNAL_SERVER_ERROR, Json(MemeResponse {
2021-07-19 22:29:03 +02:00
status: 500,
2021-08-26 17:45:38 +02:00
error: Some(String::from("Internal Server Error")),
2021-07-19 22:29:03 +02:00
meme: None
2021-08-26 17:45:38 +02:00
}))
2021-07-19 22:29:03 +02:00
}
}
}
2021-12-17 23:50:03 +01:00
async fn memes(params: Query<MemeFilterQuery>, Extension(db_pool): Extension<MySqlPool>, Extension(vars): Extension<ConfVars>) -> impl IntoResponse {
let q = Meme::get_all(params.0, &db_pool, vars.cdn).await;
2021-07-19 22:29:03 +02:00
match q {
2021-08-26 17:45:38 +02:00
Ok(memes) => (StatusCode::OK, Json(MemesResponse {
2021-07-19 22:29:03 +02:00
status: 200,
error: None,
2021-08-26 17:45:38 +02:00
memes: Some(memes)
})),
_ => (StatusCode::INTERNAL_SERVER_ERROR, Json(MemesResponse {
2021-07-19 22:29:03 +02:00
status: 500,
2021-08-26 17:45:38 +02:00
error: Some(String::from("Internal Server Error")),
2021-07-19 22:29:03 +02:00
memes: None
2021-08-26 17:45:38 +02:00
}))
2021-07-19 22:29:03 +02:00
}
}
2021-08-26 17:45:38 +02:00
async fn category(params: Query<IDQuery>, Extension(db_pool): Extension<MySqlPool>) -> impl IntoResponse {
let q = Category::get(&params.id, &db_pool).await;
2021-07-19 22:29:03 +02:00
match q {
2021-08-26 17:45:38 +02:00
Ok(category) => (StatusCode::OK, Json(CategoryResponse { status: 200, error: None, category: Some(category)})),
2021-07-19 22:29:03 +02:00
Err(err) => match err {
2021-08-26 17:45:38 +02:00
Error::RowNotFound => (StatusCode::NOT_FOUND, Json(CategoryResponse {
2021-07-19 22:29:03 +02:00
status: 404,
2021-08-26 17:45:38 +02:00
error: Some(String::from("Category not found")),
2021-07-19 22:29:03 +02:00
category: None
2021-08-26 17:45:38 +02:00
})),
_ => (StatusCode::INTERNAL_SERVER_ERROR, Json(CategoryResponse {
2021-07-19 22:29:03 +02:00
status: 500,
2021-08-26 17:45:38 +02:00
error: Some(String::from("Internal Server Error")),
2021-07-19 22:29:03 +02:00
category: None
2021-08-26 17:45:38 +02:00
}))
2021-07-19 22:29:03 +02:00
}
}
}
2021-08-26 17:45:38 +02:00
async fn categories(Extension(db_pool): Extension<MySqlPool>) -> impl IntoResponse {
let q = Category::get_all(&db_pool).await;
2021-07-19 22:29:03 +02:00
match q {
2021-08-26 17:45:38 +02:00
Ok(categories) => (StatusCode::OK, Json(CategoriesResponse { status: 200, error: None, categories: Some(categories)})),
_ => (StatusCode::INTERNAL_SERVER_ERROR, Json(CategoriesResponse {
2021-07-19 22:29:03 +02:00
status: 500,
2021-08-26 17:45:38 +02:00
error: Some(String::from("Internal Server Error")),
2021-07-19 22:29:03 +02:00
categories: None
2021-08-26 17:45:38 +02:00
}))
2021-07-19 22:29:03 +02:00
}
}
2021-08-26 17:45:38 +02:00
async fn user(params: Query<UserIDQuery>, Extension(db_pool): Extension<MySqlPool>) -> impl IntoResponse {
let q = User::get(params.0, &db_pool).await;
2021-07-19 22:29:03 +02:00
match q {
2021-08-26 17:45:38 +02:00
Ok(user) => (StatusCode::OK, Json(UserResponse { status: 200, error: None, user: Some(user)})),
_ => (StatusCode::INTERNAL_SERVER_ERROR, Json(UserResponse {
2021-07-19 22:29:03 +02:00
status: 500,
2021-08-26 17:45:38 +02:00
error: Some(String::from("Internal Server Error")),
2021-07-19 22:29:03 +02:00
user: None
2021-08-26 17:45:38 +02:00
}))
2021-07-19 22:29:03 +02:00
}
}
2021-08-26 17:45:38 +02:00
async fn users(Extension(db_pool): Extension<MySqlPool>) -> impl IntoResponse {
let q = User::get_all(&db_pool).await;
2021-07-19 22:29:03 +02:00
match q {
2021-08-26 17:45:38 +02:00
Ok(users) => (StatusCode::OK, Json(UsersResponse { status: 200, error: None, users: Some(users)})),
_ => (StatusCode::INTERNAL_SERVER_ERROR, Json(UsersResponse {
2021-07-19 22:29:03 +02:00
status: 500,
2021-08-26 17:45:38 +02:00
error: Some(String::from("Internal Server Error")),
2021-07-19 22:29:03 +02:00
users: None
2021-08-26 17:45:38 +02:00
}))
2021-07-19 22:29:03 +02:00
}
}
2021-12-17 23:50:03 +01:00
async fn random(params: Query<MemeFilterQuery>, Extension(db_pool): Extension<MySqlPool>, Extension(vars): Extension<ConfVars>) -> impl IntoResponse {
let q = Meme::get_random(params.0, &db_pool, vars.cdn).await;
2021-07-20 12:36:19 +02:00
match q {
2021-08-26 17:45:38 +02:00
Ok(random) => (StatusCode::OK, Json(MemeResponse {
2021-07-20 12:36:19 +02:00
status: 200,
error: None,
meme: Some(random)
2021-08-26 17:45:38 +02:00
})),
2021-07-20 12:36:19 +02:00
Err(err) => match err {
2021-08-26 17:45:38 +02:00
Error::RowNotFound => (StatusCode::NOT_FOUND, Json(MemeResponse {
2021-07-20 12:36:19 +02:00
status: 404,
error: Some(String::from("Meme not found")),
meme: None
2021-08-26 17:45:38 +02:00
})),
_ => (StatusCode::INTERNAL_SERVER_ERROR, Json(MemeResponse {
2021-07-20 12:36:19 +02:00
status: 500,
error: Some(String::from("Internal Server Error")),
meme: None
2021-08-26 17:45:38 +02:00
}))
2021-07-20 12:36:19 +02:00
}
}
}
2021-07-19 22:29:03 +02:00
//TODO: Implement upload endpoint
2021-08-26 17:45:38 +02:00
pub fn routes() -> Router<BoxRoute> {
Router::new()
.route("/meme", get(meme))
.route("/memes", get(memes))
.route("/category", get(category))
.route("/categories", get(categories))
.route("/user", get(user))
.route("/users", get(users))
.route("/random", get(random))
.boxed()
2021-07-19 22:29:03 +02:00
}