115 lines
3.9 KiB
Go
115 lines
3.9 KiB
Go
|
|
package usecase
|
|||
|
|
|
|||
|
|
// Import necessary packages
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
type NotificationUseCase interface {
|
|||
|
|
EventUseCase
|
|||
|
|
UserNotificationUseCase
|
|||
|
|
CursorUseCase
|
|||
|
|
}
|
|||
|
|
type NotificationEvent struct {
|
|||
|
|
EventType string // POST_PUBLISHED / COMMENT_ADDED / MENTIONED ...
|
|||
|
|
ActorUID string // 觸發者 UID
|
|||
|
|
ObjectType string // POST / COMMENT / USER ...
|
|||
|
|
ObjectID string // 對應物件 ID(post_id 等)
|
|||
|
|
Title string // 顯示用標題
|
|||
|
|
Body string // 顯示用內容 / 摘要
|
|||
|
|
Payload string // JSON string(額外欄位,例如 {"postId": "..."})
|
|||
|
|
Priority string // critical, high, normal, low
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type NotificationEventResp struct {
|
|||
|
|
EventID string `json:"event_id"`
|
|||
|
|
EventType string `json:"event_type"`
|
|||
|
|
ActorUID string `json:"actor_uid"`
|
|||
|
|
ObjectType string `json:"object_type"`
|
|||
|
|
ObjectID string `json:"object_id"`
|
|||
|
|
Title string `json:"title"`
|
|||
|
|
Body string `json:"body"`
|
|||
|
|
Payload string `json:"payload"`
|
|||
|
|
Priority string `json:"priority"`
|
|||
|
|
CreatedAt string `json:"created_at"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type QueryNotificationEventParam struct {
|
|||
|
|
ObjectID *string
|
|||
|
|
ObjectType *string
|
|||
|
|
Limit *int
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type EventUseCase interface {
|
|||
|
|
// CreateEvent creates a new notification event.
|
|||
|
|
CreateEvent(ctx context.Context, e *NotificationEvent) error
|
|||
|
|
|
|||
|
|
// GetEventByID retrieves an event by its ID.
|
|||
|
|
GetEventByID(ctx context.Context, id string) (*NotificationEventResp, error)
|
|||
|
|
|
|||
|
|
// ListEventsByObject lists events related to a specific object.
|
|||
|
|
ListEventsByObject(ctx context.Context, param QueryNotificationEventParam) ([]*NotificationEventResp, error)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type UserNotification struct {
|
|||
|
|
UserID string `json:"user_id"` // 收通知的人
|
|||
|
|
EventID string `json:"event_id"` // 對應 notification_event.event_id
|
|||
|
|
TTL int `json:"ttl"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type ListLatestOptions struct {
|
|||
|
|
UserID string
|
|||
|
|
Buckets []string // e.g. []string{"202511", "202510"}
|
|||
|
|
Limit int // 建議在 service 層限制最大值,例如 <= 100
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type UserNotificationResponse struct {
|
|||
|
|
UserID string `json:"user_id"` // 收通知的人
|
|||
|
|
Bucket string `json:"bucket"` // 分桶,例如 '2025-11' 或 '2025-11-17'
|
|||
|
|
TS string `json:"ts"` // 通知時間,用 now() 產生,排序用(UTC0)
|
|||
|
|
EventID string `json:"event_id"` // 對應 notification_event.event_id
|
|||
|
|
Status string `json:"status"` // UNREAD / READ / ARCHIVED
|
|||
|
|
ReadAt *string `json:"read_at,omitempty"` // 已讀時間(非必填)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserNotificationUseCase handles user-specific notification operations.
|
|||
|
|
type UserNotificationUseCase interface {
|
|||
|
|
// CreateUserNotification creates a notification for a single user.
|
|||
|
|
CreateUserNotification(ctx context.Context, n *UserNotification) error
|
|||
|
|
|
|||
|
|
// BulkCreateNotifications creates multiple notifications in batch.
|
|||
|
|
BulkCreateNotifications(ctx context.Context, list []*UserNotification) error
|
|||
|
|
|
|||
|
|
// ListLatestNotifications lists the latest notifications for a user.
|
|||
|
|
ListLatestNotifications(ctx context.Context, opt ListLatestOptions) ([]*UserNotificationResponse, error)
|
|||
|
|
|
|||
|
|
// MarkAsRead marks a single notification as read.
|
|||
|
|
MarkAsRead(ctx context.Context, userID, bucket string, ts string) error
|
|||
|
|
|
|||
|
|
// MarkAllAsRead marks all notifications in specified buckets as read.
|
|||
|
|
MarkAllAsRead(ctx context.Context, userID string, buckets []string) error
|
|||
|
|
|
|||
|
|
// CountUnread approximates the count of unread notifications.
|
|||
|
|
CountUnread(ctx context.Context, userID string, buckets []string) (int64, error)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type NotificationCursor struct {
|
|||
|
|
UID string
|
|||
|
|
LastSeenTS string
|
|||
|
|
UpdatedAt string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type UpdateNotificationCursorParam struct {
|
|||
|
|
UID string
|
|||
|
|
LastSeenTS string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CursorUseCase handles notification cursor operations for efficient reading.
|
|||
|
|
type CursorUseCase interface {
|
|||
|
|
// GetCursor retrieves the notification cursor for a user.
|
|||
|
|
GetCursor(ctx context.Context, userID string) (*NotificationCursor, error)
|
|||
|
|
|
|||
|
|
// UpdateCursor updates or inserts the cursor for a user.
|
|||
|
|
UpdateCursor(ctx context.Context, cursor *UpdateNotificationCursorParam) error
|
|||
|
|
}
|