Profiles: add tagging logic to bbcode processor
This commit is contained in:
parent
67aee2603c
commit
abb9f79464
|
@ -1,8 +1,9 @@
|
||||||
use activitystreams::base::AnyBase;
|
use activitystreams::base::AnyBase;
|
||||||
use actix_rt::Arbiter;
|
use actix_rt::Arbiter;
|
||||||
use actix_web::{client::Client, dev::Payload, HttpRequest};
|
use actix_web::{client::Client, dev::Payload, HttpRequest};
|
||||||
|
use hyaenidae_content::NodeView;
|
||||||
use sled::Db;
|
use sled::Db;
|
||||||
use std::{fmt, sync::Arc};
|
use std::{borrow::Cow, fmt, sync::Arc};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
@ -100,6 +101,11 @@ pub trait Outbound {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait UrlFor {
|
||||||
|
fn profile(&self, profile: &store::Profile) -> String;
|
||||||
|
fn icon(&self, file: &store::File) -> String;
|
||||||
|
}
|
||||||
|
|
||||||
trait Required<T> {
|
trait Required<T> {
|
||||||
fn req(self, msg: &str) -> Result<T, Error>;
|
fn req(self, msg: &str) -> Result<T, Error>;
|
||||||
}
|
}
|
||||||
|
@ -122,6 +128,7 @@ pub struct State {
|
||||||
pub apub: apub::Store,
|
pub apub: apub::Store,
|
||||||
pub pictrs: pictrs::State,
|
pub pictrs: pictrs::State,
|
||||||
pub spawner: Arc<dyn Spawner + Send + Sync>,
|
pub spawner: Arc<dyn Spawner + Send + Sync>,
|
||||||
|
pub url_for: Arc<dyn UrlFor + Send + Sync>,
|
||||||
pub arbiter: Arbiter,
|
pub arbiter: Arbiter,
|
||||||
_db: Db,
|
_db: Db,
|
||||||
}
|
}
|
||||||
|
@ -132,6 +139,7 @@ impl State {
|
||||||
image_info: impl ImageInfo + Send + Sync + 'static,
|
image_info: impl ImageInfo + Send + Sync + 'static,
|
||||||
apub_info: impl ApubIds + Send + Sync + 'static,
|
apub_info: impl ApubIds + Send + Sync + 'static,
|
||||||
spawner: impl Spawner + Send + Sync + 'static,
|
spawner: impl Spawner + Send + Sync + 'static,
|
||||||
|
url_for: impl UrlFor + Send + Sync + 'static,
|
||||||
arbiter: Arbiter,
|
arbiter: Arbiter,
|
||||||
db: Db,
|
db: Db,
|
||||||
) -> Result<Arc<Self>, sled::Error> {
|
) -> Result<Arc<Self>, sled::Error> {
|
||||||
|
@ -140,11 +148,86 @@ impl State {
|
||||||
apub: apub::Store::build(apub_info, &db)?,
|
apub: apub::Store::build(apub_info, &db)?,
|
||||||
pictrs: pictrs::State::new(pictrs_upstream, image_info),
|
pictrs: pictrs::State::new(pictrs_upstream, image_info),
|
||||||
spawner: Arc::new(spawner),
|
spawner: Arc::new(spawner),
|
||||||
|
url_for: Arc::new(url_for),
|
||||||
arbiter,
|
arbiter,
|
||||||
_db: db,
|
_db: db,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn map_nodeview<'a>(&self, view: NodeView<'a>) -> NodeView<'a> {
|
||||||
|
match view {
|
||||||
|
NodeView::IconText { handle, domain, .. } => {
|
||||||
|
let id_res = self.store.profiles.by_handle(&handle, &domain);
|
||||||
|
if let Ok(Some(id)) = &id_res {
|
||||||
|
if let Ok(Some(profile)) = self.store.profiles.by_id(*id) {
|
||||||
|
if let Some(file_id) = profile.icon() {
|
||||||
|
if let Ok(Some(file)) = self.store.files.by_id(file_id) {
|
||||||
|
return NodeView::IconText {
|
||||||
|
handle,
|
||||||
|
domain,
|
||||||
|
href: Some(self.url_for.profile(&profile)),
|
||||||
|
img: Some(self.url_for.icon(&file)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NodeView::Handle {
|
||||||
|
handle,
|
||||||
|
domain,
|
||||||
|
href: Some(self.url_for.profile(&profile)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeView::Text {
|
||||||
|
text: Cow::Owned(format!("@{}@{}", handle, domain)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NodeView::Icon { handle, domain, .. } => {
|
||||||
|
if let Ok(Some(id)) = self.store.profiles.by_handle(&handle, &domain) {
|
||||||
|
if let Ok(Some(profile)) = self.store.profiles.by_id(id) {
|
||||||
|
if let Some(file_id) = profile.icon() {
|
||||||
|
if let Ok(Some(file)) = self.store.files.by_id(file_id) {
|
||||||
|
return NodeView::Icon {
|
||||||
|
handle,
|
||||||
|
domain,
|
||||||
|
href: Some(self.url_for.profile(&profile)),
|
||||||
|
img: Some(self.url_for.icon(&file)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NodeView::Handle {
|
||||||
|
handle,
|
||||||
|
domain,
|
||||||
|
href: Some(self.url_for.profile(&profile)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeView::Text {
|
||||||
|
text: Cow::Owned(format!("@{}@{}", handle, domain)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NodeView::Handle { handle, domain, .. } => {
|
||||||
|
if let Ok(Some(id)) = self.store.profiles.by_handle(&handle, &domain) {
|
||||||
|
if let Ok(Some(profile)) = self.store.profiles.by_id(id) {
|
||||||
|
return NodeView::Handle {
|
||||||
|
handle,
|
||||||
|
domain,
|
||||||
|
href: Some(self.url_for.profile(&profile)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeView::Text {
|
||||||
|
text: Cow::Owned(format!("@{}@{}", handle, domain)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rest => rest,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn create_server_actor(self: &Arc<Self>, domain: String) -> Result<(), Error> {
|
pub async fn create_server_actor(self: &Arc<Self>, domain: String) -> Result<(), Error> {
|
||||||
let ctx = self.clone();
|
let ctx = self.clone();
|
||||||
|
|
||||||
|
|
|
@ -152,7 +152,7 @@ impl<'a> CommentChanges<'a> {
|
||||||
|
|
||||||
pub(crate) fn body_source(&mut self, body_source: &str) -> &mut Self {
|
pub(crate) fn body_source(&mut self, body_source: &str) -> &mut Self {
|
||||||
self.body_source = Some(body_source.to_owned());
|
self.body_source = Some(body_source.to_owned());
|
||||||
self.body(&bbcode(body_source, |v| v))
|
self.body(&bbcode(body_source, |v| self.state.map_nodeview(v)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn published(&mut self, published: DateTime<Utc>) -> &mut Self {
|
pub(crate) fn published(&mut self, published: DateTime<Utc>) -> &mut Self {
|
||||||
|
|
|
@ -142,7 +142,7 @@ impl<'a> ProfileChanges<'a> {
|
||||||
|
|
||||||
pub(crate) fn description_source(&mut self, description_source: &str) -> &mut Self {
|
pub(crate) fn description_source(&mut self, description_source: &str) -> &mut Self {
|
||||||
self.description_source = Some(description_source.to_owned());
|
self.description_source = Some(description_source.to_owned());
|
||||||
self.description(&bbcode(description_source, |v| v))
|
self.description(&bbcode(description_source, |v| self.state.map_nodeview(v)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn login_required(&mut self, required: bool) -> &mut Self {
|
pub(crate) fn login_required(&mut self, required: bool) -> &mut Self {
|
||||||
|
@ -663,7 +663,11 @@ fn id_profile_key(id: Uuid) -> String {
|
||||||
|
|
||||||
// Used to map handle -> id
|
// Used to map handle -> id
|
||||||
fn handle_id_key(handle: &str, domain: &str) -> String {
|
fn handle_id_key(handle: &str, domain: &str) -> String {
|
||||||
format!("/handle/{}:{}/profile", handle, domain)
|
format!(
|
||||||
|
"/handle/{}:{}/profile",
|
||||||
|
handle.to_lowercase(),
|
||||||
|
domain.to_lowercase()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_id_prefix(handle: &str) -> String {
|
fn handle_id_prefix(handle: &str) -> String {
|
||||||
|
|
|
@ -130,7 +130,7 @@ impl<'a> ServerChanges<'a> {
|
||||||
|
|
||||||
pub(crate) fn description_source(&mut self, description_source: &str) -> &mut Self {
|
pub(crate) fn description_source(&mut self, description_source: &str) -> &mut Self {
|
||||||
self.description_source = Some(description_source.to_owned());
|
self.description_source = Some(description_source.to_owned());
|
||||||
self.description(&bbcode(description_source, |v| v))
|
self.description(&bbcode(description_source, |v| self.state.map_nodeview(v)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn published(&mut self, published: DateTime<Utc>) -> &mut Self {
|
pub(crate) fn published(&mut self, published: DateTime<Utc>) -> &mut Self {
|
||||||
|
|
|
@ -212,7 +212,7 @@ impl<'a> SubmissionChanges<'a> {
|
||||||
|
|
||||||
pub(crate) fn description_source(&mut self, description_source: &str) -> &mut Self {
|
pub(crate) fn description_source(&mut self, description_source: &str) -> &mut Self {
|
||||||
self.description_source = Some(description_source.to_owned());
|
self.description_source = Some(description_source.to_owned());
|
||||||
self.description(&bbcode(description_source, |v| v))
|
self.description(&bbcode(description_source, |v| self.state.map_nodeview(v)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn visibility(&mut self, visibility: Visibility) -> &mut Self {
|
pub(crate) fn visibility(&mut self, visibility: Visibility) -> &mut Self {
|
||||||
|
|
Loading…
Reference in a new issue