package models import "time" // ========================================= // NOTIFICATIONS (v0.20.0) // ========================================= // Notification represents an in-app notification for a user. // Notifications are immutable once created — only is_read can be toggled. type Notification struct { ID string `json:"id" db:"id"` UserID string `json:"user_id" db:"user_id"` Type string `json:"type" db:"type"` // domain.action, e.g. "role.fallback", "kb.ready" Title string `json:"title" db:"title"` // short summary shown in bell dropdown Body string `json:"body,omitempty" db:"body"` // optional detail text ResourceType string `json:"resource_type,omitempty" db:"resource_type"` // "channel", "knowledge_base", "project", etc. ResourceID string `json:"resource_id,omitempty" db:"resource_id"` // navigable entity ID (no FK — resource may be deleted) IsRead bool `json:"is_read" db:"is_read"` CreatedAt time.Time `json:"created_at" db:"created_at"` } // Notification type constants. Convention: domain.action. // Free-form strings — new types don't require migration. const ( NotifTypeRoleFallback = "role.fallback" NotifTypeKBReady = "kb.ready" NotifTypeKBError = "kb.error" NotifTypeGrantChanged = "grant.changed" NotifTypeUserMentioned = "user.mentioned" NotifTypeWorkflowAssign = "workflow.assigned" NotifTypeWorkflowClaimed = "workflow.claimed" NotifTypeTaskCompleted = "task.completed" NotifTypeTaskFailed = "task.failed" NotifTypeTaskBudget = "task.budget_exceeded" NotifTypeAnnouncement = "system.announcement" ) // Resource type constants for click-to-navigate. // Note: ResourceTypeKnowledgeBase is already declared in models.go (resource_grants). const ( ResourceTypeChannel = "channel" ResourceTypeProject = "project" ResourceTypeTeam = "team" ResourceTypeGroup = "group" )