refactor: wrap direct port calls behind use cases — notifications, search, popular_tags
Some checks failed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m7s
test / unit (pull_request) Successful in 15m51s
test / integration (pull_request) Failing after 17m3s

This commit is contained in:
2026-05-14 16:13:34 +02:00
parent 004f3cd4d2
commit d50c13a2db
7 changed files with 82 additions and 10 deletions

View File

@@ -1,21 +1,28 @@
use axum::{extract::{Path, State}, http::StatusCode, Json};
use uuid::Uuid;
use domain::{models::feed::PageParams, value_objects::NotificationId};
use application::use_cases::notifications::{
list_notifications as uc_list_notifications,
mark_notification_read as uc_mark_notification_read,
mark_all_notifications_read,
};
use crate::{errors::ApiError, extractors::AuthUser, state::AppState};
#[utoipa::path(get, path = "/notifications", responses((status = 200, description = "Notification summary")), security(("bearer_auth" = [])))]
pub async fn list_notifications(State(s): State<AppState>, AuthUser(uid): AuthUser) -> Result<Json<serde_json::Value>, ApiError> {
let page = PageParams { page: 1, per_page: 20 };
let result = s.notifications.list_for_user(&uid, &page).await?;
let result = uc_list_notifications(&*s.notifications, &uid, page).await?;
Ok(Json(serde_json::json!({ "total": result.total, "unread": result.items.iter().filter(|n| !n.read).count() })))
}
#[utoipa::path(post, path = "/notifications/{id}/read", params(("id" = uuid::Uuid, Path, description = "Notification ID")), responses((status = 204, description = "Marked read")), security(("bearer_auth" = [])))]
pub async fn mark_notification_read(State(s): State<AppState>, AuthUser(uid): AuthUser, Path(id): Path<Uuid>) -> Result<StatusCode, ApiError> {
s.notifications.mark_read(&NotificationId::from_uuid(id), &uid).await?;
uc_mark_notification_read(&*s.notifications, &NotificationId::from_uuid(id), &uid).await?;
Ok(StatusCode::NO_CONTENT)
}
#[utoipa::path(post, path = "/notifications/read-all", responses((status = 204, description = "All marked read")), security(("bearer_auth" = [])))]
pub async fn mark_all_read(State(s): State<AppState>, AuthUser(uid): AuthUser) -> Result<StatusCode, ApiError> {
s.notifications.mark_all_read(&uid).await?;
mark_all_notifications_read(&*s.notifications, &uid).await?;
Ok(StatusCode::NO_CONTENT)
}