47 lines
1.5 KiB
Go
47 lines
1.5 KiB
Go
|
|
package domain
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"errors"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
KindJob = "job"
|
|||
|
|
KindSystem = "system"
|
|||
|
|
RefJob = "job"
|
|||
|
|
RefNone = "none"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var (
|
|||
|
|
ErrNotFound = errors.New("notification not found")
|
|||
|
|
ErrForbidden = errors.New("notification access denied")
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
type Notification struct {
|
|||
|
|
ID string `bson:"_id" json:"id"`
|
|||
|
|
OwnerUID int64 `bson:"owner_uid" json:"owner_uid"`
|
|||
|
|
Title string `bson:"title" json:"title"`
|
|||
|
|
Body string `bson:"body" json:"body"`
|
|||
|
|
Kind string `bson:"kind" json:"kind"`
|
|||
|
|
RefType string `bson:"ref_type" json:"ref_type"`
|
|||
|
|
RefID string `bson:"ref_id,omitempty" json:"ref_id,omitempty"`
|
|||
|
|
ReadAt int64 `bson:"read_at,omitempty" json:"read_at,omitempty"`
|
|||
|
|
CreatedAt int64 `bson:"created_at" json:"created_at"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func NowNano() int64 { return time.Now().UTC().UnixNano() }
|
|||
|
|
|
|||
|
|
type Repository interface {
|
|||
|
|
Insert(ctx context.Context, n *Notification) error
|
|||
|
|
ListByOwner(ctx context.Context, ownerUID int64) ([]*Notification, error)
|
|||
|
|
UnreadCount(ctx context.Context, ownerUID int64) (int64, error)
|
|||
|
|
MarkRead(ctx context.Context, ownerUID int64, id string) error
|
|||
|
|
MarkAllRead(ctx context.Context, ownerUID int64) error
|
|||
|
|
FindByID(ctx context.Context, id string) (*Notification, error)
|
|||
|
|
// FindLatestByJobRef — 同一 job 的最新通知(用於進度 upsert)
|
|||
|
|
FindLatestByJobRef(ctx context.Context, ownerUID int64, jobID string) (*Notification, error)
|
|||
|
|
// Replace full document
|
|||
|
|
Replace(ctx context.Context, n *Notification) error
|
|||
|
|
}
|