#[allow(unused_imports)]
use super::*;
pub struct ModuleExt {
pub locking_service: Arc<LockingService>,
pub multipart_upload_service: Arc<MultipartUploadService>,
pub conversion_service: Arc<ConversionService>,
#[allow(deprecated)]
pub cdn_service: Arc<CdnService>,
pub video_thumbnail_service: Arc<VideoThumbnailService>,
pub document_preview_service: Arc<DocumentPreviewService>,
pub storage: Option<Arc<dyn ObjectStorage>>,
pub bucket_config: Option<Arc<BucketConfig>>,
pub file_service: Option<Arc<FileService>>,
pub stored_file_repository: Arc<infrastructure::persistence::StoredFileRepository>,
}
pub struct ModuleBuilderExt {
storage: Option<Arc<dyn ObjectStorage>>,
bucket_config: Option<BucketConfig>,
}
impl Default for ModuleBuilderExt {
fn default() -> Self {
Self {
storage: None,
bucket_config: None,
}
}
}
impl ModuleBuilderExt {
#[allow(unused_variables, clippy::redundant_clone)]
pub(crate) fn build(self, parts: &ModuleParts<'_>) -> anyhow::Result<ModuleExt> {
let db_pool = parts.db_pool.clone();
let stored_file_repository = parts.stored_file_repository.clone();
let bucket_repository = parts.bucket_repository.clone();
let conversion_job_repository = parts.conversion_job_repository.clone();
let file_lock_repository = parts.file_lock_repository.clone();
let processing_job_repository = parts.processing_job_repository.clone();
let thumbnail_repository = parts.thumbnail_repository.clone();
let upload_session_repository = parts.upload_session_repository.clone();
let user_quota_repository = parts.user_quota_repository.clone();
let locking_service = Arc::new(LockingService::new(
file_lock_repository, stored_file_repository.clone(),
));
let multipart_upload_service = Arc::new(MultipartUploadService::new(
upload_session_repository, bucket_repository.clone(), user_quota_repository,
));
let conversion_service = Arc::new(ConversionService::new(
conversion_job_repository, stored_file_repository.clone(),
));
#[allow(deprecated)]
let cdn_service = Arc::new(CdnService::new(
stored_file_repository.clone(), bucket_repository,
));
let video_thumbnail_service = Arc::new(VideoThumbnailService::new(
processing_job_repository.clone(), thumbnail_repository.clone(), stored_file_repository.clone(),
));
let document_preview_service = Arc::new(DocumentPreviewService::new(
processing_job_repository, thumbnail_repository, stored_file_repository.clone(),
));
let bucket_config = self.bucket_config.map(Arc::new);
let storage = self.storage;
let file_service = match (&storage, &bucket_config) {
(Some(s), Some(c)) => Some(Arc::new(FileService::new(
s.clone(),
stored_file_repository.clone(),
c.clone(),
))),
_ => None,
};
Ok(ModuleExt {
locking_service,
multipart_upload_service,
conversion_service,
cdn_service,
video_thumbnail_service,
document_preview_service,
storage,
bucket_config,
file_service,
stored_file_repository,
})
}
}
impl crate::ThisModule {
pub fn upload_context(&self) -> Option<UploadContext> {
Some(UploadContext {
file_service: self.file_service.clone()?,
multipart_service: self.multipart_upload_service.clone(),
bucket_service: self.bucket_service.clone(),
storage: self.storage.clone()?,
})
}
}
impl crate::ThisModuleBuilder {
pub fn with_config(mut self, config: BucketConfig) -> Self {
self.bucket_config = Some(config);
self
}
pub fn with_storage(mut self, storage: Arc<dyn ObjectStorage>) -> Self {
self.storage = Some(storage);
self
}
}