get_site
This commit is contained in:
parent
b3a5f342bd
commit
32a02d4964
9 changed files with 77 additions and 11 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -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",
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -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>,
|
||||
}
|
||||
|
|
|
@ -2,9 +2,10 @@
|
|||
|
||||
use dioxus::prelude::*;
|
||||
|
||||
#[component]
|
||||
mod server;
|
||||
|
||||
pub fn App() -> Element {
|
||||
rsx! {
|
||||
h1 { "hello world" }
|
||||
h1 { "Hello, world!" }
|
||||
}
|
||||
}
|
||||
|
|
1
src/inbound/renderer/server.rs
Normal file
1
src/inbound/renderer/server.rs
Normal file
|
@ -0,0 +1 @@
|
|||
|
|
@ -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{}))
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue