#![recursion_limit = "1024"]
#![allow(unused_imports)]
pub mod domain;
pub mod infrastructure;
pub mod application;
pub mod presentation;
pub mod seeders;
pub mod exports;
#[path = "lib.ext.rs"]
mod lib_ext;
pub use lib_ext::*;
#[allow(dead_code)]
pub(crate) type ThisModule = BucketModule;
#[allow(dead_code)]
pub(crate) type ThisModuleBuilder = BucketModuleBuilder;
pub use domain::entity::*;
pub use domain::state_machine::*;
pub use domain::computed::{HasComputedFields, ComputedFieldValues};
pub use domain::permission::{Action, FieldRestriction, PermissionChecker, PermissionError, PermissionResult};
pub use infrastructure::persistence::*;
pub use application::service::AccessLogService;
pub use application::service::BucketService;
pub use application::service::ContentHashService;
pub use application::service::ConversionJobService;
pub use application::service::FileCommentService;
pub use application::service::FileLockService;
pub use application::service::FileShareService;
pub use application::service::FileVersionService;
pub use application::service::ProcessingJobService;
pub use application::service::StoredFileService;
pub use application::service::ThumbnailService;
pub use application::service::UploadSessionService;
pub use application::service::UserQuotaService;
pub use application::validator::{ValidationError, ValidationResult};
pub use application::triggers::*;
pub use application::workflows::*;
use std::sync::Arc;
use axum::Router;
use sqlx::PgPool;
pub struct BucketModule {
#[allow(dead_code)]
pub(crate) access_log_service: Arc<AccessLogService>,
pub(crate) bucket_service: Arc<BucketService>,
pub(crate) content_hash_service: Arc<ContentHashService>,
pub(crate) conversion_job_service: Arc<ConversionJobService>,
pub(crate) file_comment_service: Arc<FileCommentService>,
pub(crate) file_lock_service: Arc<FileLockService>,
pub(crate) file_share_service: Arc<FileShareService>,
#[allow(dead_code)]
pub(crate) file_version_service: Arc<FileVersionService>,
pub(crate) processing_job_service: Arc<ProcessingJobService>,
pub(crate) stored_file_service: Arc<StoredFileService>,
#[allow(dead_code)]
pub(crate) thumbnail_service: Arc<ThumbnailService>,
pub(crate) upload_session_service: Arc<UploadSessionService>,
pub(crate) user_quota_service: Arc<UserQuotaService>,
pub(crate) ext: ModuleExt,
}
impl std::ops::Deref for BucketModule {
type Target = ModuleExt;
fn deref(&self) -> &Self::Target {
&self.ext
}
}
impl std::ops::DerefMut for BucketModule {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.ext
}
}
#[allow(dead_code)]
pub(crate) struct ModuleParts<'a> {
pub(crate) db_pool: &'a PgPool,
pub(crate) access_log_service: &'a Arc<AccessLogService>,
pub(crate) access_log_repository: &'a Arc<AccessLogRepository>,
pub(crate) bucket_service: &'a Arc<BucketService>,
pub(crate) bucket_repository: &'a Arc<BucketRepository>,
pub(crate) content_hash_service: &'a Arc<ContentHashService>,
pub(crate) content_hash_repository: &'a Arc<ContentHashRepository>,
pub(crate) conversion_job_service: &'a Arc<ConversionJobService>,
pub(crate) conversion_job_repository: &'a Arc<ConversionJobRepository>,
pub(crate) file_comment_service: &'a Arc<FileCommentService>,
pub(crate) file_comment_repository: &'a Arc<FileCommentRepository>,
pub(crate) file_lock_service: &'a Arc<FileLockService>,
pub(crate) file_lock_repository: &'a Arc<FileLockRepository>,
pub(crate) file_share_service: &'a Arc<FileShareService>,
pub(crate) file_share_repository: &'a Arc<FileShareRepository>,
pub(crate) file_version_service: &'a Arc<FileVersionService>,
pub(crate) file_version_repository: &'a Arc<FileVersionRepository>,
pub(crate) processing_job_service: &'a Arc<ProcessingJobService>,
pub(crate) processing_job_repository: &'a Arc<ProcessingJobRepository>,
pub(crate) stored_file_service: &'a Arc<StoredFileService>,
pub(crate) stored_file_repository: &'a Arc<StoredFileRepository>,
pub(crate) thumbnail_service: &'a Arc<ThumbnailService>,
pub(crate) thumbnail_repository: &'a Arc<ThumbnailRepository>,
pub(crate) upload_session_service: &'a Arc<UploadSessionService>,
pub(crate) upload_session_repository: &'a Arc<UploadSessionRepository>,
pub(crate) user_quota_service: &'a Arc<UserQuotaService>,
pub(crate) user_quota_repository: &'a Arc<UserQuotaRepository>,
}
impl BucketModule {
pub fn builder() -> BucketModuleBuilder {
BucketModuleBuilder::new()
}
pub fn all_crud_routes(&self) -> Router {
use presentation::http::{
create_bucket_routes,
create_content_hash_routes,
create_conversion_job_routes,
create_file_comment_routes,
create_file_lock_routes,
create_file_share_routes,
create_processing_job_routes,
create_stored_file_routes,
create_upload_session_routes,
create_user_quota_routes,
};
Router::new()
.merge(create_bucket_routes(self.bucket_service.clone()))
.merge(create_content_hash_routes(self.content_hash_service.clone()))
.merge(create_conversion_job_routes(self.conversion_job_service.clone()))
.merge(create_file_comment_routes(self.file_comment_service.clone()))
.merge(create_file_lock_routes(self.file_lock_service.clone()))
.merge(create_file_share_routes(self.file_share_service.clone()))
.merge(create_processing_job_routes(self.processing_job_service.clone()))
.merge(create_stored_file_routes(self.stored_file_service.clone()))
.merge(create_upload_session_routes(self.upload_session_service.clone()))
.merge(create_user_quota_routes(self.user_quota_service.clone()))
}
#[deprecated(note = "mounts unvalidated generic CRUD; prefer readonly_routes() + validated writes, or all_crud_routes() for the full/unguarded surface")]
pub fn routes(&self) -> Router {
self.all_crud_routes()
}
pub fn readonly_routes(&self) -> Router {
use presentation::http::{
create_bucket_read_routes,
create_content_hash_read_routes,
create_conversion_job_read_routes,
create_file_comment_read_routes,
create_file_lock_read_routes,
create_file_share_read_routes,
create_processing_job_read_routes,
create_stored_file_read_routes,
create_upload_session_read_routes,
create_user_quota_read_routes,
};
Router::new()
.merge(create_bucket_read_routes(self.bucket_service.clone()))
.merge(create_content_hash_read_routes(self.content_hash_service.clone()))
.merge(create_conversion_job_read_routes(self.conversion_job_service.clone()))
.merge(create_file_comment_read_routes(self.file_comment_service.clone()))
.merge(create_file_lock_read_routes(self.file_lock_service.clone()))
.merge(create_file_share_read_routes(self.file_share_service.clone()))
.merge(create_processing_job_read_routes(self.processing_job_service.clone()))
.merge(create_stored_file_read_routes(self.stored_file_service.clone()))
.merge(create_upload_session_read_routes(self.upload_session_service.clone()))
.merge(create_user_quota_read_routes(self.user_quota_service.clone()))
}
}
pub struct BucketModuleBuilder {
db_pool: Option<PgPool>,
ext: ModuleBuilderExt,
}
impl std::ops::Deref for BucketModuleBuilder {
type Target = ModuleBuilderExt;
fn deref(&self) -> &Self::Target {
&self.ext
}
}
impl std::ops::DerefMut for BucketModuleBuilder {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.ext
}
}
impl BucketModuleBuilder {
pub fn new() -> Self {
Self {
db_pool: None,
ext: Default::default(),
}
}
pub fn with_database(mut self, pool: PgPool) -> Self {
self.db_pool = Some(pool);
self
}
pub fn build(self) -> anyhow::Result<BucketModule> {
let db_pool = self.db_pool
.ok_or_else(|| anyhow::anyhow!("Database pool not configured"))?;
let access_log_repository = Arc::new(AccessLogRepository::new(db_pool.clone()));
let access_log_service = Arc::new(AccessLogService::with_repository(access_log_repository.clone()));
let bucket_repository = Arc::new(BucketRepository::new(db_pool.clone()));
let bucket_service = Arc::new(BucketService::with_repository(bucket_repository.clone()).with_guard(Arc::new(crate::application::service::BucketRowRules)));
let content_hash_repository = Arc::new(ContentHashRepository::new(db_pool.clone()));
let content_hash_service = Arc::new(ContentHashService::with_repository(content_hash_repository.clone()));
let conversion_job_repository = Arc::new(ConversionJobRepository::new(db_pool.clone()));
let conversion_job_service = Arc::new(ConversionJobService::with_repository(conversion_job_repository.clone()).with_guard(Arc::new(crate::application::service::ConversionJobRowRules)));
let file_comment_repository = Arc::new(FileCommentRepository::new(db_pool.clone()));
let file_comment_service = Arc::new(FileCommentService::with_repository(file_comment_repository.clone()).with_guard(Arc::new(crate::application::service::FileCommentRowRules)));
let file_lock_repository = Arc::new(FileLockRepository::new(db_pool.clone()));
let file_lock_service = Arc::new(FileLockService::with_repository(file_lock_repository.clone()).with_guard(Arc::new(crate::application::service::FileLockRowRules)));
let file_share_repository = Arc::new(FileShareRepository::new(db_pool.clone()));
let file_share_service = Arc::new(FileShareService::with_repository(file_share_repository.clone()).with_guard(Arc::new(crate::application::service::FileShareRowRules)));
let file_version_repository = Arc::new(FileVersionRepository::new(db_pool.clone()));
let file_version_service = Arc::new(FileVersionService::with_repository(file_version_repository.clone()));
let processing_job_repository = Arc::new(ProcessingJobRepository::new(db_pool.clone()));
let processing_job_service = Arc::new(ProcessingJobService::with_repository(processing_job_repository.clone()).with_guard(Arc::new(crate::application::service::ProcessingJobRowRules)));
let stored_file_repository = Arc::new(StoredFileRepository::new(db_pool.clone()));
let stored_file_service = Arc::new(StoredFileService::with_repository(stored_file_repository.clone()).with_guard(Arc::new(crate::application::service::StoredFileRowRules)));
let thumbnail_repository = Arc::new(ThumbnailRepository::new(db_pool.clone()));
let thumbnail_service = Arc::new(ThumbnailService::with_repository(thumbnail_repository.clone()));
let upload_session_repository = Arc::new(UploadSessionRepository::new(db_pool.clone()));
let upload_session_service = Arc::new(UploadSessionService::with_repository(upload_session_repository.clone()).with_guard(Arc::new(crate::application::service::UploadSessionRowRules)));
let user_quota_repository = Arc::new(UserQuotaRepository::new(db_pool.clone()));
let user_quota_service = Arc::new(UserQuotaService::with_repository(user_quota_repository.clone()).with_guard(Arc::new(crate::application::service::UserQuotaRowRules)));
let ext = self.ext.build(&ModuleParts {
db_pool: &db_pool,
access_log_service: &access_log_service,
access_log_repository: &access_log_repository,
bucket_service: &bucket_service,
bucket_repository: &bucket_repository,
content_hash_service: &content_hash_service,
content_hash_repository: &content_hash_repository,
conversion_job_service: &conversion_job_service,
conversion_job_repository: &conversion_job_repository,
file_comment_service: &file_comment_service,
file_comment_repository: &file_comment_repository,
file_lock_service: &file_lock_service,
file_lock_repository: &file_lock_repository,
file_share_service: &file_share_service,
file_share_repository: &file_share_repository,
file_version_service: &file_version_service,
file_version_repository: &file_version_repository,
processing_job_service: &processing_job_service,
processing_job_repository: &processing_job_repository,
stored_file_service: &stored_file_service,
stored_file_repository: &stored_file_repository,
thumbnail_service: &thumbnail_service,
thumbnail_repository: &thumbnail_repository,
upload_session_service: &upload_session_service,
upload_session_repository: &upload_session_repository,
user_quota_service: &user_quota_service,
user_quota_repository: &user_quota_repository,
})?;
Ok(BucketModule {
access_log_service,
bucket_service,
content_hash_service,
conversion_job_service,
file_comment_service,
file_lock_service,
file_share_service,
file_version_service,
processing_job_service,
stored_file_service,
thumbnail_service,
upload_session_service,
user_quota_service,
ext,
})
}
}
impl Default for BucketModuleBuilder {
fn default() -> Self {
Self::new()
}
}
include!("mod.ext.rs");