perf: complete storage-layer UUID migration — eliminate UUID↔String round-trips

- Domain: Folder.owner_id + File.owner_id → Option<Uuid> (was Option<String>)
- Traits: folder_repository signatures accept Uuid directly (was &str)
- Infra: remove all fi.user_id::text / fo.user_id::text SQL casts in repos
- Infra: remove $N::uuid bind casts (columns are native UUID now)
- Services: eliminate to_string() bridge variables in folder_service,
  search_service, trash_service
- DTOs: boundary conversion to String only at API edge (file_dto, folder_dto)
- Ports: default impls compare Option<Uuid> directly
- Stubs: updated signatures to match trait

13 files changed across domain/application/infrastructure layers.
Compiles clean (cargo check passes).
This commit is contained in:
Diocrafts
2026-03-07 18:05:52 +01:00
parent cc98c5b0da
commit 6b02c10942
13 changed files with 131 additions and 129 deletions
+7 -5
View File
@@ -1,3 +1,5 @@
use uuid::Uuid;
use crate::domain::services::path_service::StoragePath;
// Re-export entity errors from the centralized module
@@ -23,7 +25,7 @@ pub struct Folder {
/// Owner user ID — scopes folder visibility per user.
/// `None` only for legacy/stub folders; real folders always have an owner.
owner_id: Option<String>,
owner_id: Option<Uuid>,
/// Creation timestamp
created_at: u64,
@@ -66,7 +68,7 @@ impl Folder {
name: String,
storage_path: StoragePath,
parent_id: Option<String>,
owner_id: Option<String>,
owner_id: Option<Uuid>,
) -> FolderResult<Self> {
// Validate folder name
if name.is_empty() || name.contains('/') || name.contains('\\') {
@@ -119,7 +121,7 @@ impl Folder {
name: String,
storage_path: StoragePath,
parent_id: Option<String>,
owner_id: Option<String>,
owner_id: Option<Uuid>,
created_at: u64,
modified_at: u64,
) -> FolderResult<Self> {
@@ -172,8 +174,8 @@ impl Folder {
self.modified_at
}
pub fn owner_id(&self) -> Option<&str> {
self.owner_id.as_deref()
pub fn owner_id(&self) -> Option<Uuid> {
self.owner_id
}
/// Creates a new Folder instance from a DTO