From 4ab522da918ca6d15324e2ee5e7e9491e6f7fe88 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Wed, 20 May 2020 11:23:42 +0200 Subject: Rename: App -> Middleware Signed-off-by: Matthias Beyer --- src/app.rs | 107 ----------------------------------------------------- src/main.rs | 4 +- src/middleware.rs | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/server.rs | 6 +-- 4 files changed, 113 insertions(+), 112 deletions(-) delete mode 100644 src/app.rs create mode 100644 src/middleware.rs diff --git a/src/app.rs b/src/app.rs deleted file mode 100644 index b31839f..0000000 --- a/src/app.rs +++ /dev/null @@ -1,107 +0,0 @@ -use std::collections::BTreeMap; - -use anyhow::Error; -use futures::Stream; -use futures::stream; - -use crate::types::util::IPFSHash; -use crate::types::util::MimeType; -use crate::types::util::IPNSHash; -use crate::types::block::Block; -use crate::repository::repository::Repository; -use crate::types::content::Content; -use crate::types::payload::Payload; -use crate::types::util::Timestamp; -use crate::version::protocol_version; - -#[derive(Debug, Clone)] -pub struct App { - repo: Repository, - device_name: IPNSHash, - publishing_key: String -} - -impl App { - - pub fn load(device_name: IPNSHash, publishing_key: String, host: &str, port: u16) -> Result { - Repository::new(host, port).map(|repo| App { repo, device_name, publishing_key }) - } - - pub async fn new_profile(repo: Repository, publishing_key: &str, names: Vec) -> Result { - let payload = Payload::Profile { - names, - picture: None, - more: BTreeMap::new(), - }; - let timestamp = Timestamp::now(); - let content = Content::new(vec![], Some(timestamp), payload); - - let content_hash = repo.put_content(content).await?; - let head = repo.put_block(Block::new(protocol_version(), vec![], content_hash)).await?; - let device_name = repo.publish(&publishing_key, &head).await?; - - Ok(App { repo, device_name, publishing_key: publishing_key.to_string() }) - } - - pub async fn new_post(&self, - content: Vec, - mime: MimeType, - reply_to: Option, - comments_will_be_propagated: Option, - comments_propagated_until: Option) - -> Result<(), Error> - { - let content_hash = self.repo.put_raw_bytes(content).await?; - - let payload = Payload::Post { - content_format: mime, - content: content_hash, - reply_to, - comments_will_be_propagated, - comments_propagated_until, - }; - let timestamp = Timestamp::now(); - let content = Content::new(vec![], Some(timestamp), payload); - - let content_hash = self.repo.put_content(content).await?; - - let head = self.repo.put_block(Block::new(protocol_version(), vec![], content_hash)).await?; - let device_name = self.repo.publish(&self.publishing_key, &head).await?; - - Ok(()) - } - - pub fn blocks(&self, head: IPFSHash) -> impl Stream> { - stream::unfold((self.repo.clone(), vec![head]), move |(repo, mut state)| { - async { - if let Some(hash) = state.pop() { - match repo - .get_block(hash) - .await - .map(move |block| { - block.parents().iter().for_each(|parent| { - state.push(parent.clone()) - }); - - (block, state) - }) - .map(Some) - .transpose() - { - Some(Ok((item, state))) => Some((Ok(item), (repo, state))), - Some(Err(e)) => Some((Err(e), (repo, vec![]))), - None => None, - } - } else { - None - } - } - }) - } - - pub async fn blocks_of(&self, ipns: IPNSHash) -> Result>, Error> { - self.repo.resolve(ipns).await.map(|ipfs| self.blocks(ipfs)) - } - -} - diff --git a/src/main.rs b/src/main.rs index b624bd8..8cc2a8f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,10 +29,10 @@ extern crate pidlock; #[macro_use] extern crate add_getters_setters; #[macro_use] extern crate structopt; -mod app; mod cli; mod configuration; mod gui; +mod middleware; mod repository; mod server; mod types; @@ -54,9 +54,9 @@ use anyhow::Result; use anyhow::Error; use env_logger::Env; -use crate::app::App; use crate::cli::*; use crate::configuration::Configuration; +use crate::middleware::Middleware; use crate::repository::repository::Repository; use crate::types::block::Block; use crate::types::content::Content; diff --git a/src/middleware.rs b/src/middleware.rs new file mode 100644 index 0000000..37ea7a2 --- /dev/null +++ b/src/middleware.rs @@ -0,0 +1,108 @@ +use std::collections::BTreeMap; + +use anyhow::Error; +use futures::Stream; +use futures::stream; + +use crate::types::util::IPFSHash; +use crate::types::util::MimeType; +use crate::types::util::IPNSHash; +use crate::types::block::Block; +use crate::repository::repository::Repository; +use crate::types::content::Content; +use crate::types::payload::Payload; +use crate::types::util::Timestamp; +use crate::version::protocol_version; + +/// The "Middleware" type implements the actual application logic +#[derive(Debug, Clone)] +pub struct Middleware { + repo: Repository, + device_name: IPNSHash, + publishing_key: String +} + +impl Middleware { + + pub fn load(device_name: IPNSHash, publishing_key: String, host: &str, port: u16) -> Result { + Repository::new(host, port).map(|repo| Middleware { repo, device_name, publishing_key }) + } + + pub async fn new_profile(repo: Repository, publishing_key: &str, names: Vec) -> Result { + let payload = Payload::Profile { + names, + picture: None, + more: BTreeMap::new(), + }; + let timestamp = Timestamp::now(); + let content = Content::new(vec![], Some(timestamp), payload); + + let content_hash = repo.put_content(content).await?; + let head = repo.put_block(Block::new(protocol_version(), vec![], content_hash)).await?; + let device_name = repo.publish(&publishing_key, &head).await?; + + Ok(Middleware { repo, device_name, publishing_key: publishing_key.to_string() }) + } + + pub async fn new_post(&self, + content: Vec, + mime: MimeType, + reply_to: Option, + comments_will_be_propagated: Option, + comments_propagated_until: Option) + -> Result<(), Error> + { + let content_hash = self.repo.put_raw_bytes(content).await?; + + let payload = Payload::Post { + content_format: mime, + content: content_hash, + reply_to, + comments_will_be_propagated, + comments_propagated_until, + }; + let timestamp = Timestamp::now(); + let content = Content::new(vec![], Some(timestamp), payload); + + let content_hash = self.repo.put_content(content).await?; + + let head = self.repo.put_block(Block::new(protocol_version(), vec![], content_hash)).await?; + let device_name = self.repo.publish(&self.publishing_key, &head).await?; + + Ok(()) + } + + pub fn blocks(&self, head: IPFSHash) -> impl Stream> { + stream::unfold((self.repo.clone(), vec![head]), move |(repo, mut state)| { + async { + if let Some(hash) = state.pop() { + match repo + .get_block(hash) + .await + .map(move |block| { + block.parents().iter().for_each(|parent| { + state.push(parent.clone()) + }); + + (block, state) + }) + .map(Some) + .transpose() + { + Some(Ok((item, state))) => Some((Ok(item), (repo, state))), + Some(Err(e)) => Some((Err(e), (repo, vec![]))), + None => None, + } + } else { + None + } + } + }) + } + + pub async fn blocks_of(&self, ipns: IPNSHash) -> Result>, Error> { + self.repo.resolve(ipns).await.map(|ipfs| self.blocks(ipfs)) + } + +} + diff --git a/src/server.rs b/src/server.rs index 0fc8e9b..b1fa237 100644 --- a/src/server.rs +++ b/src/server.rs @@ -8,9 +8,9 @@ use actix_web::Responder; use actix_web::http::StatusCode; use actix_web::body::Body; -use crate::app::App; use crate::cli::*; use crate::configuration::Configuration; +use crate::middleware::Middleware; use crate::types::util::*; pub fn mk_lock() -> Pidlock { @@ -37,11 +37,11 @@ pub async fn run_server(config: Configuration, mut server_lock: Pidlock, adr: St let api_url = config.get_api_url().clone(); let api_port = config.get_api_port().clone(); - App::load(name, key, &api_url, api_port) + Middleware::load(name, key, &api_url, api_port) } else { // ask user for name(s) // boot repository - // load App object + // load Middleware object unimplemented!() } }?; -- cgit v1.2.3