Compare commits
No commits in common. "e71bb730e583846725a04e4f7e991aadf108a54e" and "a420c80765c52b639b9ced42001fd3548b942921" have entirely different histories.
e71bb730e5
...
a420c80765
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -1814,15 +1814,6 @@ 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"
|
||||||
@ -2264,7 +2255,6 @@ 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",
|
||||||
|
@ -38,7 +38,7 @@ sqlx = { version = "0.8", features = [
|
|||||||
"uuid",
|
"uuid",
|
||||||
] }
|
] }
|
||||||
subtle = "2"
|
subtle = "2"
|
||||||
tokio = { version = "1", features = ["parking_lot", "rt-multi-thread", "signal"] }
|
tokio = { version = "1", features = ["parking_lot", "rt-multi-thread"] }
|
||||||
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 = [
|
||||||
|
@ -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,
|
||||||
Query(params): Query<Params>,
|
Json(params): Json<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
|
||||||
|
@ -18,8 +18,8 @@ pub async fn get(
|
|||||||
.await
|
.await
|
||||||
.can_manage_guard()?;
|
.can_manage_guard()?;
|
||||||
|
|
||||||
db::permissions::get_all_for_folder(params.folder_id, &pool)
|
let permissions = db::permissions::get_all_for_folder(params.folder_id, &pool)
|
||||||
.await
|
.await
|
||||||
.handle_internal("Error getting permissions")
|
.handle_internal("Error getting permissions")?;
|
||||||
.map(Json)
|
Ok(Json(permissions))
|
||||||
}
|
}
|
||||||
|
@ -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>>> {
|
||||||
db::permissions::get_top_level_permitted_folders(claims.user_id, &pool)
|
let folders = 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")?;
|
||||||
.map(Json)
|
Ok(Json(folders))
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ use crate::prelude::*;
|
|||||||
|
|
||||||
#[derive(Deserialize, Debug, Validate)]
|
#[derive(Deserialize, Debug, Validate)]
|
||||||
pub struct Params {
|
pub struct Params {
|
||||||
#[validate(length(min = 3, max = 10))]
|
#[validate(email)]
|
||||||
username: String,
|
username: String,
|
||||||
#[validate(email)]
|
#[validate(email)]
|
||||||
email: String,
|
email: String,
|
||||||
|
30
src/main.rs
30
src/main.rs
@ -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, signal};
|
use tokio::net::TcpListener;
|
||||||
|
|
||||||
type Pool = sqlx::postgres::PgPool;
|
type Pool = sqlx::postgres::PgPool;
|
||||||
|
|
||||||
@ -66,37 +66,11 @@ 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)
|
axum::serve(listener, router).await?;
|
||||||
.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::{
|
||||||
|
Reference in New Issue
Block a user