This commit is contained in:
Hamcha 2025-01-25 13:23:02 +01:00
parent b3a5f342bd
commit 32a02d4964
Signed by: hamcha
GPG key ID: 1669C533B8CF6D89
9 changed files with 77 additions and 11 deletions
Cargo.lockCargo.toml
src
domain/entities
inbound/renderer
main.rs
outbound
repository
services

12
Cargo.lock generated
View file

@ -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",

View file

@ -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]

View file

@ -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>,
}

View file

@ -2,9 +2,10 @@
use dioxus::prelude::*;
#[component]
mod server;
pub fn App() -> Element {
rsx! {
h1 { "hello world" }
h1 { "Hello, world!" }
}
}

View file

@ -0,0 +1 @@

View file

@ -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{}))
}
);
}

View file

@ -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(),
},
]
}
}

View file

@ -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>;
}

View file

@ -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);
}
}