Add cache-media job to keep icons up-to-date
This commit is contained in:
		
							parent
							
								
									ce9de20471
								
							
						
					
					
						commit
						a45c204a5b
					
				
					 3 changed files with 58 additions and 4 deletions
				
			
		
							
								
								
									
										44
									
								
								src/jobs/cache_media.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/jobs/cache_media.rs
									
										
									
									
									
										Normal 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)) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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>() | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue