Compare commits

...

2 Commits

Author SHA1 Message Date
e71bb730e5
More fixes 2024-08-09 23:15:00 +03:00
c2adee1188
Graceful shutdown 2024-08-09 21:40:30 +03:00
7 changed files with 47 additions and 11 deletions

10
Cargo.lock generated
View File

@ -1814,6 +1814,15 @@ dependencies = [
"lazy_static", "lazy_static",
] ]
[[package]]
name = "signal-hook-registry"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "signature" name = "signature"
version = "2.2.0" version = "2.2.0"
@ -2255,6 +2264,7 @@ dependencies = [
"mio", "mio",
"parking_lot", "parking_lot",
"pin-project-lite", "pin-project-lite",
"signal-hook-registry",
"socket2", "socket2",
"tokio-macros", "tokio-macros",
"windows-sys 0.52.0", "windows-sys 0.52.0",

View File

@ -38,7 +38,7 @@ sqlx = { version = "0.8", features = [
"uuid", "uuid",
] } ] }
subtle = "2" subtle = "2"
tokio = { version = "1", features = ["parking_lot", "rt-multi-thread"] } tokio = { version = "1", features = ["parking_lot", "rt-multi-thread", "signal"] }
tokio-util = { version = "0.7" } tokio-util = { version = "0.7" }
tower = { version = "0.4" } tower = { version = "0.4" }
tower-http = { version = "0.5", features = [ tower-http = { version = "0.5", features = [

View File

@ -8,7 +8,7 @@ pub struct Params {
pub async fn delete( pub async fn delete(
State(state): State<AppState>, State(state): State<AppState>,
claims: Claims, claims: Claims,
Json(params): Json<Params>, Query(params): Query<Params>,
) -> GeneralResult<()> { ) -> GeneralResult<()> {
let root = db::folder::get_root(claims.user_id, &state.pool) let root = db::folder::get_root(claims.user_id, &state.pool)
.await .await

View File

@ -18,8 +18,8 @@ pub async fn get(
.await .await
.can_manage_guard()?; .can_manage_guard()?;
let permissions = db::permissions::get_all_for_folder(params.folder_id, &pool) db::permissions::get_all_for_folder(params.folder_id, &pool)
.await .await
.handle_internal("Error getting permissions")?; .handle_internal("Error getting permissions")
Ok(Json(permissions)) .map(Json)
} }

View File

@ -6,8 +6,8 @@ pub async fn get_top_level(
State(pool): State<Pool>, State(pool): State<Pool>,
claims: Claims, claims: Claims,
) -> GeneralResult<Json<Vec<FolderWithoutParentId>>> { ) -> GeneralResult<Json<Vec<FolderWithoutParentId>>> {
let folders = db::permissions::get_top_level_permitted_folders(claims.user_id, &pool) db::permissions::get_top_level_permitted_folders(claims.user_id, &pool)
.await .await
.handle_internal("Error reading from the database")?; .handle_internal("Error reading from the database")
Ok(Json(folders)) .map(Json)
} }

View File

@ -4,7 +4,7 @@ use crate::prelude::*;
#[derive(Deserialize, Debug, Validate)] #[derive(Deserialize, Debug, Validate)]
pub struct Params { pub struct Params {
#[validate(email)] #[validate(length(min = 3, max = 10))]
username: String, username: String,
#[validate(email)] #[validate(email)]
email: String, email: String,

View File

@ -10,7 +10,7 @@ use std::{env, net::Ipv4Addr};
use auth::HashedBytes; use auth::HashedBytes;
use axum::{extract::FromRef, routing::post, Router}; use axum::{extract::FromRef, routing::post, Router};
use file_storage::FileStorage; use file_storage::FileStorage;
use tokio::net::TcpListener; use tokio::{net::TcpListener, signal};
type Pool = sqlx::postgres::PgPool; type Pool = sqlx::postgres::PgPool;
@ -66,11 +66,37 @@ async fn main() -> anyhow::Result<()> {
let addr = (Ipv4Addr::UNSPECIFIED, 3000); let addr = (Ipv4Addr::UNSPECIFIED, 3000);
let listener = TcpListener::bind(addr).await?; let listener = TcpListener::bind(addr).await?;
axum::serve(listener, router).await?; axum::serve(listener, router)
.with_graceful_shutdown(shutdown_signal())
.await?;
Ok(()) Ok(())
} }
async fn shutdown_signal() {
let ctrl_c = async {
signal::ctrl_c()
.await
.expect("failed to install Ctrl+C handler");
};
#[cfg(unix)]
let terminate = async {
signal::unix::signal(signal::unix::SignalKind::terminate())
.expect("failed to install signal handler")
.recv()
.await;
};
#[cfg(not(unix))]
let terminate = std::future::pending::<()>();
tokio::select! {
() = ctrl_c => {},
() = terminate => {},
}
}
fn app(state: AppState) -> Router { fn app(state: AppState) -> Router {
use axum::{http::header, routing::get}; use axum::{http::header, routing::get};
use endpoints::{ use endpoints::{