feat: setup seaorm and a first "debug" entity as example
This commit is contained in:
@ -8,14 +8,23 @@ askama = "0.12.1"
|
||||
askama_axum = "0.4.0"
|
||||
axum = "0.7.5"
|
||||
axum-htmx = { version = "0.6", features = ["auto-vary"] }
|
||||
futures = "0.3.30"
|
||||
listenfd = "1.0.1"
|
||||
notify = "6.1.1"
|
||||
sea-orm = { version = "1.0.1", features = [
|
||||
# Same as in the migration crate
|
||||
"sqlx-sqlite",
|
||||
"runtime-tokio-rustls",
|
||||
"macros",
|
||||
] }
|
||||
serde = { version = "1.0.204", features = ["derive"] }
|
||||
thiserror = "1.0.63"
|
||||
tokio = { version = "1.39.1", features = ["macros", "rt-multi-thread"] }
|
||||
tower-http = { version = "0.5.2", features = ["fs"] }
|
||||
tower-livereload = "0.9.3"
|
||||
|
||||
entity = { path = "../../entity" }
|
||||
migration = { path = "../../migration" }
|
||||
utils = { path = "../utils" }
|
||||
|
||||
[dev-dependencies]
|
||||
|
@ -2,6 +2,15 @@
|
||||
|
||||
- Récupérer le binaire TailwindCSS : https://tailwindcss.com/blog/standalone-cli
|
||||
|
||||
## Configuration
|
||||
|
||||
> Astuce : lorsqu'on exécute directement la crate `App` à des fins de développement, le système de configuration n'utilisera pas l'éventuel fichier `.env` situé à la racine du workspace Rust. Pour éviter de dupliquer le fichier `.env`, il est possible de créer un lien symbolique vers le fichier `.env` de la crate `App` :
|
||||
|
||||
```bash
|
||||
cd crates/app
|
||||
ln -s ../../.env .env
|
||||
```
|
||||
|
||||
## Exécution
|
||||
|
||||
- Lancer tailwindcss en mode watch dans un terminal :
|
||||
|
11
crates/app/src/db.rs
Normal file
11
crates/app/src/db.rs
Normal file
@ -0,0 +1,11 @@
|
||||
use migration::{Migrator, MigratorTrait};
|
||||
use sea_orm::{Database, DatabaseConnection, DbErr};
|
||||
use std::env;
|
||||
|
||||
pub async fn get_connection() -> Result<DatabaseConnection, DbErr> {
|
||||
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
|
||||
|
||||
let db_connection = Database::connect(database_url).await?;
|
||||
Migrator::up(&db_connection, None).await?;
|
||||
Ok(db_connection)
|
||||
}
|
@ -2,6 +2,7 @@ use std::path::PathBuf;
|
||||
|
||||
use axum::http::{StatusCode, Uri};
|
||||
use axum_htmx::AutoVaryLayer;
|
||||
use sea_orm::DatabaseConnection;
|
||||
use thiserror::Error;
|
||||
use tower_http::services::ServeDir;
|
||||
|
||||
@ -27,12 +28,20 @@ pub fn init() -> Result<(), InitError> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct AppState {
|
||||
db_connection: DatabaseConnection,
|
||||
}
|
||||
|
||||
pub async fn get_router(assets_path: PathBuf) -> axum::Router<()> {
|
||||
let db_connection = db::get_connection().await.unwrap();
|
||||
let state: AppState = AppState { db_connection };
|
||||
|
||||
axum::Router::new()
|
||||
.nest_service("/assets", ServeDir::new(assets_path))
|
||||
.merge(pages::get_routes())
|
||||
.fallback(fallback)
|
||||
.with_state(state)
|
||||
// The AutoVaryLayer is used to avoid cache issues with htmx (cf: https://github.com/robertwayne/axum-htmx?tab=readme-ov-file#auto-caching-management)
|
||||
.layer(AutoVaryLayer)
|
||||
}
|
||||
|
@ -20,6 +20,8 @@ pub enum AppError {
|
||||
NotifyWatcher(#[from] notify::Error),
|
||||
#[error("Missing environment variable {var}")]
|
||||
MissingEnvVar { var: &'static str },
|
||||
#[error("Error with the database connection")]
|
||||
DatabaseConnection(#[from] sea_orm::DbErr),
|
||||
#[error("Error while initialising the app")]
|
||||
Initialisation(#[from] InitError),
|
||||
}
|
||||
|
Reference in New Issue
Block a user