domain: add cross-cutting value objects (SystemId, DateTimeStamp, Checksum, StructuredData)

This commit is contained in:
2026-05-31 03:16:28 +02:00
parent f9cb142c3b
commit 3571c94bec
28 changed files with 320 additions and 122 deletions

View File

@@ -5,7 +5,7 @@ use domain::{
entities::User,
errors::DomainError,
ports::{PasswordHasher, TokenIssuer, UserRepository},
value_objects::{Email, PasswordHash, Role, UserId},
value_objects::{Email, PasswordHash, SystemId},
};
pub struct InMemoryUserRepository {
@@ -28,7 +28,7 @@ impl Default for InMemoryUserRepository {
#[async_trait]
impl UserRepository for InMemoryUserRepository {
async fn find_by_id(&self, id: &UserId) -> Result<Option<User>, DomainError> {
async fn find_by_id(&self, id: &SystemId) -> Result<Option<User>, DomainError> {
Ok(self.users.lock().await.get(&id.to_string()).cloned())
}
@@ -43,7 +43,7 @@ impl UserRepository for InMemoryUserRepository {
Ok(())
}
async fn delete(&self, id: &UserId) -> Result<(), DomainError> {
async fn delete(&self, id: &SystemId) -> Result<(), DomainError> {
self.users.lock().await.remove(&id.to_string());
Ok(())
}
@@ -65,15 +65,15 @@ pub struct StubTokenIssuer;
#[async_trait]
impl TokenIssuer for StubTokenIssuer {
async fn issue(&self, user_id: &UserId, _role: &Role) -> Result<String, DomainError> {
async fn issue(&self, user_id: &SystemId, _role: &str) -> Result<String, DomainError> {
Ok(format!("token:{user_id}"))
}
async fn verify(&self, token: &str) -> Result<(UserId, Role), DomainError> {
async fn verify(&self, token: &str) -> Result<(SystemId, String), DomainError> {
let id_str = token.strip_prefix("token:").ok_or_else(|| {
DomainError::Unauthorized("Invalid stub token".to_string())
})?;
let uuid = uuid::Uuid::parse_str(id_str)
.map_err(|_| DomainError::Unauthorized("Bad UUID in stub token".to_string()))?;
Ok((UserId::from_uuid(uuid), Role::User))
Ok((SystemId::from_uuid(uuid), "user".to_string()))
}
}