Files
appks/service/notify/util.rs
T
2026-06-07 11:30:56 +08:00

70 lines
2.6 KiB
Rust

pub use crate::service::util::clamp_limit_offset;
use crate::error::AppError;
use crate::models::notifications::Notification;
use sqlx::PgPool;
use uuid::Uuid;
impl Notification {
pub async fn find_by_id(
pool: &PgPool,
id: Uuid,
user_id: Uuid,
) -> Result<Option<Self>, AppError> {
sqlx::query_as::<_, Notification>(
"SELECT id, user_id, actor_id, workspace_id, repo_id, issue_id, pull_request_id, \
channel_id, message_id, notification_type, title, body, target_type, target_id, \
action_url, priority, read_at, dismissed_at, metadata, created_at, updated_at, deleted_at \
FROM notification WHERE id = $1 AND user_id = $2 AND deleted_at IS NULL",
)
.bind(id)
.bind(user_id)
.fetch_optional(pool)
.await
.map_err(AppError::Database)
}
pub async fn list_for_user(
pool: &PgPool,
user_id: Uuid,
unread_only: bool,
limit: i64,
offset: i64,
) -> Result<Vec<Self>, AppError> {
let sql = if unread_only {
"SELECT id, user_id, actor_id, workspace_id, repo_id, issue_id, pull_request_id, \
channel_id, message_id, notification_type, title, body, target_type, target_id, \
action_url, priority, read_at, dismissed_at, metadata, created_at, updated_at, deleted_at \
FROM notification \
WHERE user_id = $1 AND deleted_at IS NULL AND read_at IS NULL AND dismissed_at IS NULL \
ORDER BY created_at DESC LIMIT $2 OFFSET $3"
} else {
"SELECT id, user_id, actor_id, workspace_id, repo_id, issue_id, pull_request_id, \
channel_id, message_id, notification_type, title, body, target_type, target_id, \
action_url, priority, read_at, dismissed_at, metadata, created_at, updated_at, deleted_at \
FROM notification \
WHERE user_id = $1 AND deleted_at IS NULL AND dismissed_at IS NULL \
ORDER BY created_at DESC LIMIT $2 OFFSET $3"
};
sqlx::query_as::<_, Notification>(sql)
.bind(user_id)
.bind(limit)
.bind(offset)
.fetch_all(pool)
.await
.map_err(AppError::Database)
}
pub async fn count_unread(pool: &PgPool, user_id: Uuid) -> Result<i64, AppError> {
sqlx::query_scalar(
"SELECT COUNT(*) FROM notification \
WHERE user_id = $1 AND deleted_at IS NULL AND read_at IS NULL AND dismissed_at IS NULL",
)
.bind(user_id)
.fetch_one(pool)
.await
.map_err(AppError::Database)
}
}