87 lines
2.6 KiB
Go
87 lines
2.6 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
// NotificationType identifies a user-facing notification kind persisted for the dashboard.
|
|
type NotificationType string
|
|
|
|
const (
|
|
// NotificationNeedsInput means an agent session is waiting for user input.
|
|
NotificationNeedsInput NotificationType = "needs_input"
|
|
// NotificationReadyToMerge means a PR has no known merge blockers.
|
|
NotificationReadyToMerge NotificationType = "ready_to_merge"
|
|
// NotificationPRMerged means a tracked PR was merged.
|
|
NotificationPRMerged NotificationType = "pr_merged"
|
|
// NotificationPRClosedUnmerged means a tracked PR closed without merging.
|
|
NotificationPRClosedUnmerged NotificationType = "pr_closed_unmerged"
|
|
)
|
|
|
|
// Valid reports whether t is one of the v1 notification kinds.
|
|
func (t NotificationType) Valid() bool {
|
|
switch t {
|
|
case NotificationNeedsInput, NotificationReadyToMerge, NotificationPRMerged, NotificationPRClosedUnmerged:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// NotificationStatus is the read state for a stored notification.
|
|
type NotificationStatus string
|
|
|
|
const (
|
|
// NotificationUnread marks a notification that has not been acknowledged.
|
|
NotificationUnread NotificationStatus = "unread"
|
|
// NotificationRead marks a notification that has been acknowledged.
|
|
NotificationRead NotificationStatus = "read"
|
|
)
|
|
|
|
// Valid reports whether s is a supported notification read state.
|
|
func (s NotificationStatus) Valid() bool {
|
|
switch s {
|
|
case NotificationUnread, NotificationRead:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// NotificationRecord is the durable notification persistence shape.
|
|
type NotificationRecord struct {
|
|
ID string
|
|
SessionID SessionID
|
|
ProjectID ProjectID
|
|
PRURL string
|
|
Type NotificationType
|
|
Title string
|
|
Body string
|
|
Status NotificationStatus
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
var (
|
|
// ErrInvalidNotificationType reports an unknown notification type.
|
|
ErrInvalidNotificationType = errors.New("invalid notification type")
|
|
// ErrInvalidNotificationStatus reports an unknown notification status.
|
|
ErrInvalidNotificationStatus = errors.New("invalid notification status")
|
|
// ErrInvalidNotificationRecord reports a missing required notification field.
|
|
ErrInvalidNotificationRecord = errors.New("invalid notification record")
|
|
)
|
|
|
|
// Validate checks the required fields and enum values for a stored notification.
|
|
func (r NotificationRecord) Validate() error {
|
|
if r.SessionID == "" || r.ProjectID == "" || r.Title == "" || r.CreatedAt.IsZero() {
|
|
return ErrInvalidNotificationRecord
|
|
}
|
|
if !r.Type.Valid() {
|
|
return ErrInvalidNotificationType
|
|
}
|
|
if !r.Status.Valid() {
|
|
return ErrInvalidNotificationStatus
|
|
}
|
|
return nil
|
|
}
|