diff --git a/src/server/auth.rs b/src/application/auth.rs similarity index 98% rename from src/server/auth.rs rename to src/application/auth.rs index d2e8488..eac93f9 100644 --- a/src/server/auth.rs +++ b/src/application/auth.rs @@ -5,9 +5,9 @@ use axum::{ }; use tower_cookies::Cookies; +use crate::application::server::AppState; use crate::domain::users::User; use crate::infrastructure::auth::hash_token; -use crate::server::server::AppState; const SESSION_COOKIE_NAME: &str = "brewlog_session"; diff --git a/src/server/errors.rs b/src/application/errors.rs similarity index 100% rename from src/server/errors.rs rename to src/application/errors.rs diff --git a/src/server/mod.rs b/src/application/mod.rs similarity index 100% rename from src/server/mod.rs rename to src/application/mod.rs diff --git a/src/server/routes/auth.rs b/src/application/routes/auth.rs similarity index 98% rename from src/server/routes/auth.rs rename to src/application/routes/auth.rs index 287954e..fedce43 100644 --- a/src/server/routes/auth.rs +++ b/src/application/routes/auth.rs @@ -8,10 +8,10 @@ use serde::Deserialize; use tower_cookies::{Cookie, Cookies}; use tracing::{error, warn}; +use crate::application::routes::render_html; +use crate::application::server::AppState; use crate::domain::sessions::NewSession; use crate::infrastructure::auth::{generate_session_token, hash_token, verify_password}; -use crate::server::routes::render_html; -use crate::server::server::AppState; const SESSION_COOKIE_NAME: &str = "brewlog_session"; diff --git a/src/server/routes/mod.rs b/src/application/routes/mod.rs similarity index 98% rename from src/server/routes/mod.rs rename to src/application/routes/mod.rs index 0ab0494..c6c6a59 100644 --- a/src/server/routes/mod.rs +++ b/src/application/routes/mod.rs @@ -13,7 +13,7 @@ use tower::ServiceBuilder; use tower_cookies::CookieManagerLayer; use tracing::error; -use crate::server::server::AppState; +use crate::application::server::AppState; use crate::presentation::templates::render_template; diff --git a/src/server/routes/roasters.rs b/src/application/routes/roasters.rs similarity index 88% rename from src/server/routes/roasters.rs rename to src/application/routes/roasters.rs index 7e9eeb5..32e40f5 100644 --- a/src/server/routes/roasters.rs +++ b/src/application/routes/roasters.rs @@ -3,6 +3,13 @@ use axum::extract::{Path, Query, State}; use axum::http::{HeaderMap, StatusCode}; use axum::response::{Html, IntoResponse, Redirect, Response}; +use crate::application::auth::AuthenticatedUser; +use crate::application::errors::{ApiError, AppError, map_app_error}; +use crate::application::routes::render_html; +use crate::application::routes::support::{ + FlexiblePayload, ListQuery, PayloadSource, is_datastar_request, +}; +use crate::application::server::AppState; use crate::domain::ids::RoasterId; use crate::domain::listing::{ListRequest, SortDirection}; use crate::domain::roasters::{NewRoaster, Roaster, RoasterSortKey, UpdateRoaster}; @@ -10,13 +17,6 @@ use crate::presentation::templates::{ RoasterDetailTemplate, RoasterListTemplate, RoastersTemplate, }; use crate::presentation::views::{ListNavigator, Paginated, RoastView, RoasterView}; -use crate::server::auth::AuthenticatedUser; -use crate::server::errors::{ApiError, AppError, map_app_error}; -use crate::server::routes::render_html; -use crate::server::routes::support::{ - FlexiblePayload, ListQuery, PayloadSource, is_datastar_request, -}; -use crate::server::server::AppState; const ROASTER_PAGE_PATH: &str = "/roasters"; const ROASTER_FRAGMENT_PATH: &str = "/roasters#roaster-list"; @@ -31,7 +31,7 @@ async fn load_roaster_page( .await .map_err(AppError::from)?; - Ok(crate::server::routes::support::build_page_view( + Ok(crate::application::routes::support::build_page_view( page, request, RoasterView::from, @@ -49,7 +49,8 @@ pub(crate) async fn roasters_page( let request = query.into_request::(); if is_datastar_request(&headers) { - let is_authenticated = crate::server::routes::auth::is_authenticated(&state, &cookies).await; + let is_authenticated = + crate::application::routes::auth::is_authenticated(&state, &cookies).await; return render_roaster_list_fragment(state, request, is_authenticated) .await .map_err(map_app_error); @@ -59,7 +60,8 @@ pub(crate) async fn roasters_page( .await .map_err(map_app_error)?; - let is_authenticated = crate::server::routes::auth::is_authenticated(&state, &cookies).await; + let is_authenticated = + crate::application::routes::auth::is_authenticated(&state, &cookies).await; let template = RoastersTemplate { nav_active: "roasters", @@ -88,7 +90,8 @@ pub(crate) async fn roaster_page( .map_err(|err| map_app_error(AppError::from(err)))?; let roaster_view = RoasterView::from(roaster); - let is_authenticated = crate::server::routes::auth::is_authenticated(&state, &cookies).await; + let is_authenticated = + crate::application::routes::auth::is_authenticated(&state, &cookies).await; let template = RoasterDetailTemplate { nav_active: "roasters", @@ -208,5 +211,5 @@ async fn render_roaster_list_fragment( navigator, }; - crate::server::routes::support::render_fragment(template, "#roaster-list") + crate::application::routes::support::render_fragment(template, "#roaster-list") } diff --git a/src/server/routes/roasts.rs b/src/application/routes/roasts.rs similarity index 91% rename from src/server/routes/roasts.rs rename to src/application/routes/roasts.rs index feebe6b..ca0038b 100644 --- a/src/server/routes/roasts.rs +++ b/src/application/routes/roasts.rs @@ -4,19 +4,19 @@ use axum::http::{HeaderMap, StatusCode}; use axum::response::{Html, IntoResponse, Redirect, Response}; use serde::Deserialize; +use crate::application::auth::AuthenticatedUser; +use crate::application::errors::{ApiError, AppError, map_app_error}; +use crate::application::routes::render_html; +use crate::application::routes::support::{ + FlexiblePayload, ListQuery, PayloadSource, is_datastar_request, +}; +use crate::application::server::AppState; use crate::domain::ids::{RoastId, RoasterId}; use crate::domain::listing::{ListRequest, SortDirection}; use crate::domain::roasters::RoasterSortKey; use crate::domain::roasts::{NewRoast, Roast, RoastSortKey, RoastWithRoaster}; use crate::presentation::templates::{RoastDetailTemplate, RoastListTemplate, RoastsTemplate}; use crate::presentation::views::{ListNavigator, Paginated, RoastView, RoasterOptionView}; -use crate::server::auth::AuthenticatedUser; -use crate::server::errors::{ApiError, AppError, map_app_error}; -use crate::server::routes::render_html; -use crate::server::routes::support::{ - FlexiblePayload, ListQuery, PayloadSource, is_datastar_request, -}; -use crate::server::server::AppState; const ROAST_PAGE_PATH: &str = "/roasts"; const ROAST_FRAGMENT_PATH: &str = "/roasts#roast-list"; @@ -31,7 +31,7 @@ async fn load_roast_page( .await .map_err(AppError::from)?; - Ok(crate::server::routes::support::build_page_view( + Ok(crate::application::routes::support::build_page_view( page, request, RoastView::from_list_item, @@ -49,7 +49,8 @@ pub(crate) async fn roasts_page( let request = query.into_request::(); if is_datastar_request(&headers) { - let is_authenticated = crate::server::routes::auth::is_authenticated(&state, &cookies).await; + let is_authenticated = + crate::application::routes::auth::is_authenticated(&state, &cookies).await; return render_roast_list_fragment(state, request, is_authenticated) .await .map_err(map_app_error); @@ -67,7 +68,8 @@ pub(crate) async fn roasts_page( .await .map_err(map_app_error)?; - let is_authenticated = crate::server::routes::auth::is_authenticated(&state, &cookies).await; + let is_authenticated = + crate::application::routes::auth::is_authenticated(&state, &cookies).await; let template = RoastsTemplate { nav_active: "roasts", @@ -97,7 +99,8 @@ pub(crate) async fn roast_page( .await .map_err(|err| map_app_error(AppError::from(err)))?; - let is_authenticated = crate::server::routes::auth::is_authenticated(&state, &cookies).await; + let is_authenticated = + crate::application::routes::auth::is_authenticated(&state, &cookies).await; let template = RoastDetailTemplate { nav_active: "roasts", @@ -277,5 +280,5 @@ async fn render_roast_list_fragment( navigator, }; - crate::server::routes::support::render_fragment(template, "#roast-list") + crate::application::routes::support::render_fragment(template, "#roast-list") } diff --git a/src/server/routes/support.rs b/src/application/routes/support.rs similarity index 99% rename from src/server/routes/support.rs rename to src/application/routes/support.rs index 5906af1..655ee99 100644 --- a/src/server/routes/support.rs +++ b/src/application/routes/support.rs @@ -5,11 +5,11 @@ use axum::http::{HeaderMap, HeaderValue, header::CONTENT_TYPE}; use axum::response::{Html, IntoResponse, Response}; use serde::Deserialize; +use crate::application::errors::{ApiError, AppError}; use crate::domain::listing::{ DEFAULT_PAGE_SIZE, ListRequest, Page, PageSize, SortDirection, SortKey, }; use crate::presentation::views::{ListNavigator, Paginated}; -use crate::server::errors::{ApiError, AppError}; #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum PayloadSource { diff --git a/src/server/routes/timeline.rs b/src/application/routes/timeline.rs similarity index 89% rename from src/server/routes/timeline.rs rename to src/application/routes/timeline.rs index e5e2996..b81cb44 100644 --- a/src/server/routes/timeline.rs +++ b/src/application/routes/timeline.rs @@ -3,14 +3,14 @@ use axum::http::HeaderMap; use axum::http::StatusCode; use axum::response::{IntoResponse, Response}; +use crate::application::errors::{AppError, map_app_error}; +use crate::application::routes::render_html; +use crate::application::routes::support::{ListQuery, is_datastar_request, normalize_request}; +use crate::application::server::AppState; use crate::domain::listing::ListRequest; use crate::domain::timeline::{TimelineEvent, TimelineSortKey}; use crate::presentation::templates::{TimelineChunkTemplate, TimelineTemplate}; use crate::presentation::views::{ListNavigator, Paginated, TimelineEventView, TimelineMonthView}; -use crate::server::errors::{AppError, map_app_error}; -use crate::server::routes::render_html; -use crate::server::routes::support::{ListQuery, is_datastar_request, normalize_request}; -use crate::server::server::AppState; const TIMELINE_PAGE_PATH: &str = "/timeline"; const TIMELINE_FRAGMENT_PATH: &str = "/timeline"; @@ -33,7 +33,8 @@ pub(crate) async fn timeline_page( .await .map_err(map_app_error)?; - let is_authenticated = crate::server::routes::auth::is_authenticated(&state, &cookies).await; + let is_authenticated = + crate::application::routes::auth::is_authenticated(&state, &cookies).await; let template = TimelineTemplate { nav_active: "timeline", @@ -63,7 +64,7 @@ async fn render_timeline_chunk( months: data.months, }; - crate::server::routes::support::render_fragment(template, "#timeline-loader") + crate::application::routes::support::render_fragment(template, "#timeline-loader") } struct TimelinePageData { diff --git a/src/server/routes/tokens.rs b/src/application/routes/tokens.rs similarity index 97% rename from src/server/routes/tokens.rs rename to src/application/routes/tokens.rs index b67d732..6454828 100644 --- a/src/server/routes/tokens.rs +++ b/src/application/routes/tokens.rs @@ -4,11 +4,11 @@ use axum::http::StatusCode; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; +use crate::application::auth::AuthenticatedUser; +use crate::application::server::AppState; use crate::domain::ids::{TokenId, UserId}; use crate::domain::tokens::{NewToken, Token}; use crate::infrastructure::auth::{generate_token, hash_token, verify_password}; -use crate::server::auth::AuthenticatedUser; -use crate::server::server::AppState; #[derive(Debug, Deserialize)] pub struct CreateTokenRequest { diff --git a/src/server/server.rs b/src/application/server.rs similarity index 99% rename from src/server/server.rs rename to src/application/server.rs index ac090bf..8777c71 100644 --- a/src/server/server.rs +++ b/src/application/server.rs @@ -7,6 +7,7 @@ use tokio::net::TcpListener; use tokio::signal; use tracing::info; +use crate::application::routes::app_router; use crate::domain::repositories::{ RoastRepository, RoasterRepository, SessionRepository, TimelineEventRepository, TokenRepository, UserRepository, @@ -20,7 +21,6 @@ use crate::infrastructure::repositories::sessions::SqlSessionRepository; use crate::infrastructure::repositories::timeline_events::SqlTimelineEventRepository; use crate::infrastructure::repositories::tokens::SqlTokenRepository; use crate::infrastructure::repositories::users::SqlUserRepository; -use crate::server::routes::app_router; pub struct ServerConfig { pub bind_address: SocketAddr, diff --git a/src/client/mod.rs b/src/client/mod.rs index 878f7a7..d628e32 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -5,7 +5,7 @@ pub mod tokens; use anyhow::{Context, Result, anyhow}; use reqwest::{Client, Url}; -use crate::server::errors::ErrorResponse; +use crate::application::errors::ErrorResponse; pub struct BrewlogClient { base_url: Url, diff --git a/src/lib.rs b/src/lib.rs index a27af4e..285b3ca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,6 @@ +pub mod application; pub mod cli; pub mod client; pub mod domain; pub mod infrastructure; pub mod presentation; -pub mod server; diff --git a/src/main.rs b/src/main.rs index b47e07e..776e4d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use anyhow::Result; +use brewlog::application::{ServerConfig, serve}; use brewlog::cli::{Cli, Commands, ServeCommand, roasters, roasts, tokens}; use brewlog::client::BrewlogClient; -use brewlog::server::{ServerConfig, serve}; use clap::Parser; use tracing_subscriber::{EnvFilter, fmt, prelude::*}; diff --git a/tests/server/helpers.rs b/tests/server/helpers.rs index 624cc4c..a933610 100644 --- a/tests/server/helpers.rs +++ b/tests/server/helpers.rs @@ -1,5 +1,7 @@ use std::sync::Arc; +use brewlog::application::routes::app_router; +use brewlog::application::server::AppState; use brewlog::domain::repositories::{ RoastRepository, RoasterRepository, SessionRepository, TimelineEventRepository, TokenRepository, UserRepository, @@ -14,8 +16,6 @@ use brewlog::infrastructure::repositories::sessions::SqlSessionRepository; use brewlog::infrastructure::repositories::timeline_events::SqlTimelineEventRepository; use brewlog::infrastructure::repositories::tokens::SqlTokenRepository; use brewlog::infrastructure::repositories::users::SqlUserRepository; -use brewlog::server::routes::app_router; -use brewlog::server::server::AppState; use reqwest::Client; use tokio::net::TcpListener;