Compare commits

..

1 commit

Author SHA1 Message Date
1c52be1fe6 config: static settings reference in appstate 2025-02-04 04:32:06 -08:00
7 changed files with 29 additions and 71 deletions

26
Cargo.lock generated
View file

@ -290,21 +290,6 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "axum-range"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1c30398a7f716ebdd7f3c8a4f7a7a6df48a30e002007fd57b2a7a00fac864bd"
dependencies = [
"axum",
"axum-extra",
"bytes",
"futures",
"http-body",
"pin-project",
"tokio",
]
[[package]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.71" version = "0.3.71"
@ -1472,14 +1457,13 @@ dependencies = [
[[package]] [[package]]
name = "nyazoom" name = "nyazoom"
version = "0.3.2" version = "0.2.4"
dependencies = [ dependencies = [
"async-bincode", "async-bincode",
"async-trait", "async-trait",
"async_zip", "async_zip",
"axum", "axum",
"axum-extra", "axum-extra",
"axum-range",
"bincode", "bincode",
"chrono", "chrono",
"clap", "clap",
@ -1499,7 +1483,7 @@ dependencies = [
"sqlx", "sqlx",
"tokio", "tokio",
"tokio-util", "tokio-util",
"tower 0.5.2", "tower 0.5.0",
"tower-http", "tower-http",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
@ -2672,14 +2656,14 @@ dependencies = [
[[package]] [[package]]
name = "tower" name = "tower"
version = "0.5.2" version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" checksum = "36b837f86b25d7c0d7988f00a54e74739be6477f2aac6201b8f429a7569991b7"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-util", "futures-util",
"pin-project-lite", "pin-project-lite",
"sync_wrapper 1.0.1", "sync_wrapper 0.1.2",
"tower-layer", "tower-layer",
"tower-service", "tower-service",
] ]

View file

@ -1,6 +1,6 @@
[package] [package]
name = "nyazoom" name = "nyazoom"
version = "0.3.2" version = "0.2.4"
edition = "2021" edition = "2021"
authors = ["Zynh Ludwig <Zynh0722@gmail.com>"] authors = ["Zynh Ludwig <Zynh0722@gmail.com>"]
readme = "README.md" readme = "README.md"
@ -46,7 +46,6 @@ tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
color-eyre = "0.6.3" color-eyre = "0.6.3"
eyre = "0.6.12" eyre = "0.6.12"
clap = "4.5.26" clap = "4.5.26"
axum-range = "0.4.0"
# I want to use askama's block feature, this requires unreleased 0.13 # I want to use askama's block feature, this requires unreleased 0.13
[dependencies.sqlx] [dependencies.sqlx]

View file

@ -7,9 +7,8 @@ README is a supreme work in progress, terribly sorry
<!-- markdownlint-disable MD013 --> <!-- markdownlint-disable MD013 -->
| variable | description | default | | variable | description | default |
| -------------- | --------------------------------------------- | ------------------------ | | ----------- | --------------------------------------------- | ------------------------ |
| `NZ_CACHE_DIR` | the location for storing all downloaded files | "/var/lib/nyazoom/cache" | | `CACHE_DIR` | the location for storing all downloaded files | "/var/lib/nyazoom/cache" |
| `NZ_DIST_DIR` | location of the folder to be static served | "./dist" | | `DIST_DIR` | location of the folder to be static served | "./dist" |
| `DATABASE_URL` | sqlite database connection url | "./dist" |
<!-- markdownlint-restore --> <!-- markdownlint-restore -->

View file

@ -1,5 +0,0 @@
// generated by `sqlx migrate build-script`
fn main() {
// trigger recompilation when a new migration is added
println!("cargo:rerun-if-changed=migrations");
}

View file

@ -6,15 +6,13 @@ use axum::{
Router, Router,
}; };
use axum_extra::TypedHeader; use axum_extra::TypedHeader;
use eyre::Context;
use tower_http::{services::ServeDir, trace::TraceLayer}; use tower_http::{services::ServeDir, trace::TraceLayer};
use views::templates::WelcomeTemplate; use views::templates::WelcomeTemplate;
use std::net::SocketAddr; use std::{net::SocketAddr, sync::OnceLock};
use nyazoom::*; use nyazoom::{config::Settings, *};
use config::Settings;
use util::{headers::ForwardedFor, logging, sweeper}; use util::{headers::ForwardedFor, logging, sweeper};
#[tokio::main] #[tokio::main]
@ -22,26 +20,16 @@ async fn main() -> eyre::Result<()> {
color_eyre::install()?; color_eyre::install()?;
logging::init_tracing(); logging::init_tracing();
// Generate settings from figments and create initial AppState let config = Settings::try_new()?;
let state = AppState::new_with_settings(Settings::try_new()?); tracing::info!(?config, "config generated");
tracing::debug!( // uses create_dir_all to create both .cache and serve inside it in one go
chache_dir=?state.settings.cache.dir, util::make_dir(&config.cache.dir).await?;
dist_dir=?state.settings.dist.dir,
db_url=?state.settings.database.url,
"config generated"
);
// uses create_dir_all to ensure a valid directory structure let fallback_service = ServeDir::new(&config.dist.dir);
util::make_dir(&state.settings.cache.dir).await?;
// Use the sqlite pool to run the db migrations let state = AppState::new_with_settings(config);
sqlx::migrate!()
.run(&state.pool)
.await
.context("running database migrations")?;
// Spawn the cleanup task
sweeper::spawn(state.clone()); sweeper::spawn(state.clone());
// Router Setup // Router Setup
@ -51,10 +39,10 @@ async fn main() -> eyre::Result<()> {
.nest("/upload", get_upload_router()) .nest("/upload", get_upload_router())
.nest("/records", get_records_router()) .nest("/records", get_records_router())
.nest("/link", get_link_router()) .nest("/link", get_link_router())
.fallback_service(ServeDir::new(&state.settings.dist.dir)) .with_state(state)
.fallback_service(fallback_service)
.layer(TraceLayer::new_for_http()) .layer(TraceLayer::new_for_http())
.layer(middleware::from_fn(log_source)) .layer(middleware::from_fn(log_source));
.with_state(state);
serve(app).await; serve(app).await;

View file

@ -1,12 +1,12 @@
use axum::{ use axum::{
body::Body,
extract::State, extract::State,
response::{IntoResponse, Redirect}, response::{IntoResponse, Redirect},
routing::get, routing::get,
Router, Router,
}; };
use axum_extra::{headers::Range, TypedHeader};
use axum_range::{KnownSize, Ranged};
use reqwest::StatusCode; use reqwest::StatusCode;
use tokio_util::io::ReaderStream;
use crate::AppState; use crate::AppState;
@ -16,7 +16,6 @@ pub fn get_download_router() -> Router<AppState> {
async fn download( async fn download(
axum::extract::Path(id): axum::extract::Path<String>, axum::extract::Path(id): axum::extract::Path<String>,
range: Option<TypedHeader<Range>>,
State(state): State<AppState>, State(state): State<AppState>,
) -> Result<axum::response::Response, (StatusCode, String)> { ) -> Result<axum::response::Response, (StatusCode, String)> {
let mut conn = state.pool.acquire().await.unwrap(); let mut conn = state.pool.acquire().await.unwrap();
@ -34,11 +33,10 @@ async fn download(
.await .await
.map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()))?; .map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()))?;
let body = KnownSize::file(file).await.unwrap(); return Ok(axum::response::Response::builder()
let range = range.map(|TypedHeader(range)| range); .header("Content-Type", "application/zip")
let ranged_body = Ranged::new(range, body); .body(Body::from_stream(ReaderStream::new(file)))
.unwrap());
return Ok(([("Content-Type", "application/zip")], ranged_body).into_response());
} }
Ok(Redirect::to("/404.html").into_response()) Ok(Redirect::to("/404.html").into_response())

View file

@ -1,9 +1,6 @@
use std::str::FromStr; use std::str::FromStr;
use sqlx::{ use sqlx::{sqlite::SqliteConnectOptions, SqlitePool};
sqlite::{SqliteConnectOptions, SqliteJournalMode},
SqlitePool,
};
use crate::config::Settings; use crate::config::Settings;
@ -19,9 +16,7 @@ impl AppState {
Self { Self {
pool: SqlitePool::connect_lazy_with( pool: SqlitePool::connect_lazy_with(
SqliteConnectOptions::from_str(&settings.database.url) SqliteConnectOptions::from_str(&settings.database.url)
.expect("Invalid Database String") .expect("Invalid Database String"),
.journal_mode(SqliteJournalMode::Wal)
.create_if_missing(true),
), ),
settings, settings,
} }