use std::sync::Arc; use crate::common::errors::{DomainError, ErrorKind, Result}; use crate::infrastructure::repositories::pg::NextcloudObjectIdRepository; #[derive(Clone)] pub struct NextcloudFileIdService { repo: Option>, instance_id: String, } impl NextcloudFileIdService { pub fn new(repo: Arc, instance_id: String) -> Self { Self { repo: Some(repo), instance_id, } } pub fn new_stub() -> Self { Self { repo: None, instance_id: "ocnca".to_string(), } } pub async fn get_or_create_file_id(&self, file_id: &str) -> Result { let repo = self.repo.as_ref().ok_or_else(|| { DomainError::internal_error("NextcloudFileId", "Repository not initialized") })?; repo.get_or_create("file", file_id).await } pub async fn get_or_create_folder_id(&self, folder_id: &str) -> Result { let repo = self.repo.as_ref().ok_or_else(|| { DomainError::internal_error("NextcloudFileId", "Repository not initialized") })?; repo.get_or_create("folder", folder_id).await } /// Get the OxiCloud file UUID from a Nextcloud numeric ID. pub async fn get_oxicloud_id(&self, nc_file_id: i64) -> Result { let repo = self.repo.as_ref().ok_or_else(|| { DomainError::internal_error("NextcloudFileId", "Repository not initialized") })?; repo.get_object_id(nc_file_id, "file").await } pub fn format_oc_id(&self, id: i64) -> String { format!("{:08}{}", id, self.instance_id) } pub fn instance_id(&self) -> &str { &self.instance_id } #[cfg(test)] pub fn new_test(instance_id: &str) -> Self { Self { repo: None, instance_id: instance_id.to_string(), } } pub fn ensure_ready(&self) -> Result<()> { if self.repo.is_none() { return Err(DomainError::new( ErrorKind::InternalError, "NextcloudFileId", "Repository not initialized", )); } Ok(()) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_format_oc_id_default_instance() { let svc = NextcloudFileIdService::new_stub(); assert_eq!(svc.format_oc_id(42), "00000042ocnca"); } #[test] fn test_format_oc_id_custom_instance() { let svc = NextcloudFileIdService::new_test("myinst"); assert_eq!(svc.format_oc_id(1), "00000001myinst"); } #[test] fn test_format_oc_id_large_number() { let svc = NextcloudFileIdService::new_stub(); assert_eq!(svc.format_oc_id(123456789), "123456789ocnca"); } #[test] fn test_instance_id() { let svc = NextcloudFileIdService::new_stub(); assert_eq!(svc.instance_id(), "ocnca"); } #[test] fn test_ensure_ready_fails_on_stub() { let svc = NextcloudFileIdService::new_stub(); assert!(svc.ensure_ready().is_err()); } }