use crate::models::base_info::{RepoBaseInfo, UserBaseInfo, WorkspaceBaseInfo}; use crate::models::common::{NotificationType, Priority, TargetType}; use crate::models::json_types::{NotificationMetadata, TypedJson}; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use uuid::Uuid; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, sqlx::FromRow, utoipa::ToSchema)] pub struct Notification { pub id: Uuid, pub user_id: Uuid, pub actor_id: Option, pub workspace_id: Option, pub repo_id: Option, pub issue_id: Option, pub pull_request_id: Option, pub channel_id: Option, pub message_id: Option, pub notification_type: NotificationType, pub title: String, pub body: Option, pub target_type: Option, pub target_id: Option, pub action_url: Option, pub priority: Priority, pub read_at: Option>, pub dismissed_at: Option>, #[schema(value_type = serde_json::Value)] pub metadata: Option>, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] pub struct NotificationDetail { pub id: Uuid, pub user_id: Uuid, pub actor: Option, pub workspace: Option, pub repo: Option, pub issue_id: Option, pub pull_request_id: Option, pub channel_id: Option, pub message_id: Option, pub notification_type: NotificationType, pub title: String, pub body: Option, pub target_type: Option, pub target_id: Option, pub action_url: Option, pub priority: Priority, pub read_at: Option>, pub dismissed_at: Option>, #[schema(value_type = serde_json::Value)] pub metadata: Option>, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } impl Notification { pub fn into_detail( self, actor: Option, workspace: Option, repo: Option, ) -> NotificationDetail { NotificationDetail { id: self.id, user_id: self.user_id, actor, workspace, repo, issue_id: self.issue_id, pull_request_id: self.pull_request_id, channel_id: self.channel_id, message_id: self.message_id, notification_type: self.notification_type, title: self.title, body: self.body, target_type: self.target_type, target_id: self.target_id, action_url: self.action_url, priority: self.priority, read_at: self.read_at, dismissed_at: self.dismissed_at, metadata: self.metadata, created_at: self.created_at, updated_at: self.updated_at, deleted_at: self.deleted_at, } } }