- Enforce axum best practices across all 13 workspace crates (max 200 LOC/file, no comments, no unwrap, clean architecture) - Fix domain→infrastructure dependency inversions in imphnen-iam and imphnen-dimentorin - Extract imphnen-storage (MinIO) and imphnen-email (Lettre) as standalone crates - Centralize all config in ENV struct: CDN_URL, CORS_ALLOWED_ORIGINS - Centralize SMTP through imphnen-email; remove dead HackathonConfig - Centralize database: QR crate now shares main DB pool (single DATABASE_URL) - Rename QR users table to qr_users to avoid collision with main users table - Merge imphnen-qr into imphnen-cms/src/qr (13 crates, down from 14) - Restructure imphnen-hackathon flat modules into clean architecture - Remove all stale env vars from .env.example (SurrealDB, QR_JWT, Hackathon infra) - Fix Dockerfile to include all current workspace crates - Bump all crate versions 0.2.0 → 0.3.0 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
63 lines
1.3 KiB
Rust
63 lines
1.3 KiB
Rust
use async_trait::async_trait;
|
|
use imphnen_utils::errors::AppError;
|
|
use std::sync::Arc;
|
|
use uuid::Uuid;
|
|
|
|
use crate::qr::users::domain::{
|
|
entity::{UpdateUserInput, UserEntity},
|
|
repository::UserRepository,
|
|
service::QrUserService,
|
|
};
|
|
|
|
pub struct QrUserServiceImpl {
|
|
repo: Arc<dyn UserRepository>,
|
|
}
|
|
|
|
impl QrUserServiceImpl {
|
|
pub fn new(repo: Arc<dyn UserRepository>) -> Self {
|
|
Self { repo }
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl QrUserService for QrUserServiceImpl {
|
|
async fn get_profile(&self, user_id: Uuid) -> Result<UserEntity, AppError> {
|
|
self
|
|
.repo
|
|
.find_by_id(user_id)
|
|
.await?
|
|
.ok_or_else(|| AppError::NotFoundError("User not found".to_string()))
|
|
}
|
|
|
|
async fn update_profile(
|
|
&self,
|
|
user_id: Uuid,
|
|
input: UpdateUserInput,
|
|
) -> Result<UserEntity, AppError> {
|
|
if let Some(ref email) = input.email
|
|
&& email.trim().is_empty()
|
|
{
|
|
return Err(AppError::ValidationError(
|
|
"Email cannot be empty".to_string(),
|
|
));
|
|
}
|
|
self.repo.update(user_id, input).await
|
|
}
|
|
|
|
async fn list_all(&self) -> Result<Vec<UserEntity>, AppError> {
|
|
self.repo.find_all().await
|
|
}
|
|
|
|
async fn update_role(
|
|
&self,
|
|
id: Uuid,
|
|
role: String,
|
|
) -> Result<UserEntity, AppError> {
|
|
self.repo.update_role(id, role).await
|
|
}
|
|
|
|
async fn delete(&self, id: Uuid) -> Result<(), AppError> {
|
|
self.repo.delete(id).await
|
|
}
|
|
}
|