diff --git a/Cargo.lock b/Cargo.lock index fd43989..76e82bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1510,6 +1510,7 @@ dependencies = [ "dioxus-cli-config", "dioxus-logger", "dotenvy", + "tokio", ] [[package]] @@ -2156,6 +2157,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "slab" version = "0.4.9" @@ -2327,7 +2337,9 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", diff --git a/Cargo.toml b/Cargo.toml index 8dfe1d1..3304734 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,11 +9,13 @@ dioxus = { version = "0.6", features = ["fullstack"] } dioxus-cli-config = "0.6" dioxus-logger = "0.6" dotenvy = { version = "0.15", optional = true } +tokio = { version = "1", features = ["full"], optional = true } [features] default = [] -server = ["dioxus/server", "dotenvy"] +server = ["dioxus/server", "tokio", "dotenvy"] web = ["dioxus/web"] +tokio = ["dep:tokio"] [profile] diff --git a/src/domain/entities/site.rs b/src/domain/entities/site.rs index 0be8a4c..2ee7b18 100644 --- a/src/domain/entities/site.rs +++ b/src/domain/entities/site.rs @@ -2,3 +2,13 @@ pub struct SiteMetadata { pub domain: String, pub title: String, } + +pub struct PageInfo { + pub title: String, + pub name: String, +} + +pub struct SiteInfo { + pub info: SiteMetadata, + pub pages: Vec<PageInfo>, +} diff --git a/src/inbound/renderer/mod.rs b/src/inbound/renderer/mod.rs index 602797f..30b366f 100644 --- a/src/inbound/renderer/mod.rs +++ b/src/inbound/renderer/mod.rs @@ -2,9 +2,10 @@ use dioxus::prelude::*; -#[component] +mod server; + pub fn App() -> Element { rsx! { - h1 { "hello world" } + h1 { "Hello, world!" } } } diff --git a/src/inbound/renderer/server.rs b/src/inbound/renderer/server.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/inbound/renderer/server.rs @@ -0,0 +1 @@ + diff --git a/src/main.rs b/src/main.rs index c00cb1a..67dc143 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ -use dioxus::prelude::*; +use dioxus::prelude::server_only; use dioxus_logger::tracing::Level; -use outbound::repository::adapters::static_data::StaticData; mod domain; mod inbound; @@ -16,10 +15,13 @@ fn main() { let mut builder = dioxus::LaunchBuilder::new(); server_only! { + use outbound::repository::adapters::static_data::StaticData; + use outbound::services::site::SiteService; + builder = builder .with_context_provider( || { - Box::new(outbound::services::site::SiteService::new(StaticData{})) + Box::new(SiteService::new(StaticData{})) } ); } diff --git a/src/outbound/repository/adapters/static_data.rs b/src/outbound/repository/adapters/static_data.rs index f655a72..523d5a6 100644 --- a/src/outbound/repository/adapters/static_data.rs +++ b/src/outbound/repository/adapters/static_data.rs @@ -1,12 +1,28 @@ -use crate::{domain::entities::site::SiteMetadata, outbound::repository::site::SiteRepository}; +use crate::{ + domain::entities::site::{PageInfo, SiteMetadata}, + outbound::repository::site::SiteRepository, +}; pub struct StaticData {} impl SiteRepository for StaticData { - async fn get_site_by_domain(domain: &str) -> SiteMetadata { + async fn get_site_by_domain(&self, domain: &str) -> SiteMetadata { SiteMetadata { domain: domain.to_string(), title: "Test site".to_string(), } } + + async fn get_pages_for_site(&self, _: &str) -> Vec<PageInfo> { + vec![ + PageInfo { + title: "Home".to_string(), + name: "/".to_string(), + }, + PageInfo { + title: "Cool page".to_string(), + name: "cool".to_string(), + }, + ] + } } diff --git a/src/outbound/repository/site.rs b/src/outbound/repository/site.rs index a6751c4..38408b7 100644 --- a/src/outbound/repository/site.rs +++ b/src/outbound/repository/site.rs @@ -1,5 +1,6 @@ -use crate::domain::entities::site::SiteMetadata; +use crate::domain::entities::site::{PageInfo, SiteMetadata}; pub trait SiteRepository { - async fn get_site_by_domain(domain: &str) -> SiteMetadata; + async fn get_site_by_domain(&self, domain: &str) -> SiteMetadata; + async fn get_pages_for_site(&self, domain: &str) -> Vec<PageInfo>; } diff --git a/src/outbound/services/site.rs b/src/outbound/services/site.rs index 42031b1..e928e77 100644 --- a/src/outbound/services/site.rs +++ b/src/outbound/services/site.rs @@ -1,4 +1,4 @@ -use crate::outbound::repository::site::SiteRepository; +use crate::{domain::entities::site::SiteInfo, outbound::repository::site::SiteRepository}; pub struct SiteService<SiteRepo: SiteRepository> { site_repository: SiteRepo, @@ -8,4 +8,25 @@ impl<SiteRepo: SiteRepository> SiteService<SiteRepo> { pub fn new(site_repository: SiteRepo) -> Self { Self { site_repository } } + + pub async fn get_site(&self, domain: &str) -> SiteInfo { + let info = self.site_repository.get_site_by_domain(domain).await; + let pages = self.site_repository.get_pages_for_site(&info.domain).await; + SiteInfo { info, pages } + } +} + +#[cfg(test)] +mod tests { + use super::SiteService; + use crate::outbound::repository::adapters::static_data::StaticData; + + #[tokio::test] + async fn gets_site_info() { + let service = SiteService::new(StaticData {}); + let info = service.get_site("example.com").await; + assert_eq!(info.info.domain, "example.com"); + assert_eq!(info.info.title, "Test site"); + assert_eq!(info.pages.len(), 2); + } }