2024-03-16 15:45:32 +00:00
|
|
|
use std::str::FromStr;
|
|
|
|
|
|
|
|
use anyhow::Result;
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
use axum::routing::{get, post};
|
|
|
|
use axum::Router;
|
2024-03-16 15:45:32 +00:00
|
|
|
use axum_login::AuthManagerLayerBuilder;
|
|
|
|
use clap::Parser;
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
use diesel_migrations::{embed_migrations, EmbeddedMigrations};
|
|
|
|
use tower_http::services::ServeDir;
|
|
|
|
use tower_http::trace::{DefaultOnRequest, DefaultOnResponse, TraceLayer};
|
2024-03-16 15:45:32 +00:00
|
|
|
use tower_sessions::SessionManagerLayer;
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
use tower_sessions_sqlx_store::sqlx::SqlitePool;
|
|
|
|
use tower_sessions_sqlx_store::SqliteStore;
|
2024-03-16 15:45:32 +00:00
|
|
|
use tracing::Level;
|
|
|
|
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
use crate::config::CommandLineOptions;
|
|
|
|
use crate::db;
|
|
|
|
use crate::handler::documents::{
|
|
|
|
create_document_page, create_document_submit, documents_page, edit_document_page,
|
|
|
|
edit_document_submit,
|
|
|
|
};
|
|
|
|
use crate::handler::home::home_page;
|
|
|
|
use crate::handler::login::logout;
|
|
|
|
use crate::handler::projects::{create_project_page, create_project_submit, projects_page};
|
|
|
|
use crate::handler::{login_page, login_submit};
|
|
|
|
use crate::logging::setup_logging;
|
|
|
|
use crate::provider::Provider;
|
|
|
|
use crate::templates::make_template_loader;
|
|
|
|
|
|
|
|
pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!("./migrations/");
|
2024-03-16 15:45:32 +00:00
|
|
|
|
|
|
|
pub async fn run() -> Result<()> {
|
|
|
|
dotenvy::dotenv()?;
|
|
|
|
setup_logging();
|
|
|
|
|
|
|
|
let opts = CommandLineOptions::parse();
|
|
|
|
|
|
|
|
let template_loader = make_template_loader(opts.reload_templates);
|
|
|
|
|
|
|
|
let db_url = dotenvy::var("DATABASE_URL")?;
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
let mut db_conn = db::establish_connection(&db_url);
|
|
|
|
db::migrate(&mut db_conn);
|
2024-03-16 15:45:32 +00:00
|
|
|
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
let db_pool = db::build_connection_pool(&db_url);
|
2024-03-16 15:45:32 +00:00
|
|
|
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
let session_layer = create_session_manager_layer().await?;
|
2024-05-21 12:59:04 +00:00
|
|
|
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
let provider = Provider::new(db_pool, template_loader);
|
2024-03-16 15:45:32 +00:00
|
|
|
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
let auth_backend = provider.clone();
|
2024-03-16 15:45:32 +00:00
|
|
|
let auth_layer = AuthManagerLayerBuilder::new(auth_backend, session_layer.clone()).build();
|
|
|
|
|
|
|
|
let trace_layer = TraceLayer::new_for_http()
|
|
|
|
.on_request(DefaultOnRequest::new().level(Level::INFO))
|
|
|
|
.on_response(DefaultOnResponse::new().level(Level::INFO));
|
|
|
|
|
|
|
|
let app = Router::new()
|
|
|
|
.nest_service("/static", ServeDir::new("static"))
|
|
|
|
.route("/", get(home_page))
|
|
|
|
.route("/login", get(login_page))
|
|
|
|
.route("/login", post(login_submit))
|
|
|
|
.route("/logout", get(logout))
|
2024-05-21 12:59:04 +00:00
|
|
|
.route("/projects", get(projects_page))
|
|
|
|
.route("/projects/new", get(create_project_page))
|
|
|
|
.route("/projects/new", post(create_project_submit))
|
|
|
|
.route("/documents", get(documents_page))
|
|
|
|
.route("/documents/new", get(create_document_page))
|
|
|
|
.route("/documents/new", post(create_document_submit))
|
|
|
|
.route("/documents/edit/:id", get(edit_document_page))
|
|
|
|
.route("/documents/edit/:id", post(edit_document_submit))
|
2024-03-16 15:45:32 +00:00
|
|
|
.layer(trace_layer)
|
|
|
|
.layer(session_layer)
|
|
|
|
.layer(auth_layer)
|
Switch DB layer to Diesel from SeaORM and Fjall (#2)
Refactors Pique to use Diesel for the backing database layer instead of the previous choices of SeaORM and Fjall (with a custom DB on top of the KV store). This choice was made to speed up development. I found SeaORM much more challenging to discover things in than Diesel, and with Fjall I was getting mired in building things that already exist. This is a migration to a boring choice, and that's the right decision for this moment in time.
Among other things, the diff stats wind up being `47 files changed, 926 insertions(+), 950 deletions(-)` when you exclude lockfile changes and markdown changes. This validates that the code is not significantly more or less verbose, but is simply structured differently. So we're not giving anything up in brevity.
I decided to structure query calls into their own submodules, called `q` (short for `query`). I shortened the names to make it easier to type and make lines shorter, which may be a controversial take, but I think that it will wind up being worth it and will be easy to get used to.
I also renamed `Context` to `Provider`, because I think `Context` implies things like cancellation, while `Provider` implies giving access to resources, which is more precisely what's going on here.
Reviewed-on: https://git.kittencollective.com/nicole/pique/pulls/2
2024-06-02 18:37:15 +00:00
|
|
|
.with_state(provider);
|
2024-03-16 15:45:32 +00:00
|
|
|
|
|
|
|
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
|
|
|
|
axum::serve(listener, app).await.unwrap();
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
pub async fn create_session_manager_layer() -> Result<SessionManagerLayer<SqliteStore>> {
|
|
|
|
let session_db_url =
|
|
|
|
dotenvy::var("SESSION_DB_URL").unwrap_or("sqlite:./sessions.db?mode=rwc".to_owned());
|
|
|
|
let pool = SqlitePool::connect(&session_db_url).await?;
|
|
|
|
let session_store = SqliteStore::new(pool);
|
|
|
|
session_store.migrate().await?;
|
|
|
|
|
|
|
|
let use_secure_sessions: bool =
|
|
|
|
FromStr::from_str(&dotenvy::var("SECURE_SESSIONS").unwrap_or("true".to_owned()))?;
|
|
|
|
|
|
|
|
let session_layer = SessionManagerLayer::new(session_store).with_secure(use_secure_sessions);
|
|
|
|
|
|
|
|
Ok(session_layer)
|
|
|
|
}
|