Add cache-media job to keep icons up-to-date

This commit is contained in:
asonix 2020-05-21 18:04:12 -05:00
parent ce9de20471
commit a45c204a5b
3 changed files with 58 additions and 4 deletions

44
src/jobs/cache_media.rs Normal file
View file

@ -0,0 +1,44 @@
use crate::jobs::JobState;
use anyhow::Error;
use background_jobs::ActixJob;
use std::{future::Future, pin::Pin};
use uuid::Uuid;
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct CacheMedia {
uuid: Uuid,
}
impl CacheMedia {
pub fn new(uuid: Uuid) -> Self {
CacheMedia { uuid }
}
async fn perform(self, state: JobState) -> Result<(), Error> {
if state.media.get_bytes(self.uuid).await.is_some() {
return Ok(());
}
if let Some(url) = state.media.get_url(self.uuid).await? {
let (content_type, bytes) = state.requests.fetch_bytes(url.as_str()).await?;
state
.media
.store_bytes(self.uuid, content_type, bytes)
.await;
}
Ok(())
}
}
impl ActixJob for CacheMedia {
type State = JobState;
type Future = Pin<Box<dyn Future<Output = Result<(), Error>>>>;
const NAME: &'static str = "relay::jobs::CacheMedia";
fn run(self, state: Self::State) -> Self::Future {
Box::pin(self.perform(state))
}
}

View file

@ -1,4 +1,7 @@
use crate::{config::UrlKind, jobs::JobState}; use crate::{
config::UrlKind,
jobs::{cache_media::CacheMedia, JobState},
};
use activitystreams_new::primitives::XsdAnyUri; use activitystreams_new::primitives::XsdAnyUri;
use anyhow::Error; use anyhow::Error;
use background_jobs::ActixJob; use background_jobs::ActixJob;
@ -44,12 +47,16 @@ impl QueryInstance {
}; };
if let Some(mut contact) = instance.contact { if let Some(mut contact) = instance.contact {
if let Some(uuid) = state.media.get_uuid(&contact.avatar).await? { let uuid = if let Some(uuid) = state.media.get_uuid(&contact.avatar).await? {
contact.avatar = state.config.generate_url(UrlKind::Media(uuid)).parse()?; contact.avatar = state.config.generate_url(UrlKind::Media(uuid)).parse()?;
uuid
} else { } else {
let uuid = state.media.store_url(&contact.avatar).await?; let uuid = state.media.store_url(&contact.avatar).await?;
contact.avatar = state.config.generate_url(UrlKind::Media(uuid)).parse()?; contact.avatar = state.config.generate_url(UrlKind::Media(uuid)).parse()?;
} uuid
};
state.job_server.queue(CacheMedia::new(uuid))?;
state state
.node_cache .node_cache

View file

@ -1,4 +1,5 @@
pub mod apub; pub mod apub;
mod cache_media;
mod deliver; mod deliver;
mod deliver_many; mod deliver_many;
mod instance; mod instance;
@ -7,7 +8,8 @@ mod process_listeners;
mod storage; mod storage;
pub use self::{ pub use self::{
deliver::Deliver, deliver_many::DeliverMany, instance::QueryInstance, nodeinfo::QueryNodeinfo, cache_media::CacheMedia, deliver::Deliver, deliver_many::DeliverMany, instance::QueryInstance,
nodeinfo::QueryNodeinfo,
}; };
use crate::{ use crate::{
@ -54,6 +56,7 @@ pub fn create_workers(
.register::<QueryNodeinfo>() .register::<QueryNodeinfo>()
.register::<QueryInstance>() .register::<QueryInstance>()
.register::<Listeners>() .register::<Listeners>()
.register::<CacheMedia>()
.register::<apub::Announce>() .register::<apub::Announce>()
.register::<apub::Follow>() .register::<apub::Follow>()
.register::<apub::Forward>() .register::<apub::Forward>()