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-cli-config",
|
||||||
"dioxus-logger",
|
"dioxus-logger",
|
||||||
"dotenvy",
|
"dotenvy",
|
||||||
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2156,6 +2157,15 @@ version = "1.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
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]]
|
[[package]]
|
||||||
name = "slab"
|
name = "slab"
|
||||||
version = "0.4.9"
|
version = "0.4.9"
|
||||||
|
@ -2327,7 +2337,9 @@ dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"libc",
|
"libc",
|
||||||
"mio",
|
"mio",
|
||||||
|
"parking_lot",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
|
"signal-hook-registry",
|
||||||
"socket2",
|
"socket2",
|
||||||
"tokio-macros",
|
"tokio-macros",
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
|
|
|
@ -9,11 +9,13 @@ dioxus = { version = "0.6", features = ["fullstack"] }
|
||||||
dioxus-cli-config = "0.6"
|
dioxus-cli-config = "0.6"
|
||||||
dioxus-logger = "0.6"
|
dioxus-logger = "0.6"
|
||||||
dotenvy = { version = "0.15", optional = true }
|
dotenvy = { version = "0.15", optional = true }
|
||||||
|
tokio = { version = "1", features = ["full"], optional = true }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
server = ["dioxus/server", "dotenvy"]
|
server = ["dioxus/server", "tokio", "dotenvy"]
|
||||||
web = ["dioxus/web"]
|
web = ["dioxus/web"]
|
||||||
|
tokio = ["dep:tokio"]
|
||||||
|
|
||||||
[profile]
|
[profile]
|
||||||
|
|
||||||
|
|
|
@ -2,3 +2,13 @@ pub struct SiteMetadata {
|
||||||
pub domain: String,
|
pub domain: String,
|
||||||
pub title: 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::*;
|
use dioxus::prelude::*;
|
||||||
|
|
||||||
#[component]
|
mod server;
|
||||||
|
|
||||||
pub fn App() -> Element {
|
pub fn App() -> Element {
|
||||||
rsx! {
|
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 dioxus_logger::tracing::Level;
|
||||||
use outbound::repository::adapters::static_data::StaticData;
|
|
||||||
|
|
||||||
mod domain;
|
mod domain;
|
||||||
mod inbound;
|
mod inbound;
|
||||||
|
@ -16,10 +15,13 @@ fn main() {
|
||||||
|
|
||||||
let mut builder = dioxus::LaunchBuilder::new();
|
let mut builder = dioxus::LaunchBuilder::new();
|
||||||
server_only! {
|
server_only! {
|
||||||
|
use outbound::repository::adapters::static_data::StaticData;
|
||||||
|
use outbound::services::site::SiteService;
|
||||||
|
|
||||||
builder = builder
|
builder = builder
|
||||||
.with_context_provider(
|
.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 {}
|
pub struct StaticData {}
|
||||||
|
|
||||||
impl SiteRepository for 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 {
|
SiteMetadata {
|
||||||
domain: domain.to_string(),
|
domain: domain.to_string(),
|
||||||
title: "Test site".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 {
|
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> {
|
pub struct SiteService<SiteRepo: SiteRepository> {
|
||||||
site_repository: SiteRepo,
|
site_repository: SiteRepo,
|
||||||
|
@ -8,4 +8,25 @@ impl<SiteRepo: SiteRepository> SiteService<SiteRepo> {
|
||||||
pub fn new(site_repository: SiteRepo) -> Self {
|
pub fn new(site_repository: SiteRepo) -> Self {
|
||||||
Self { site_repository }
|
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