announcement.go 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package service
  2. import (
  3. "context"
  4. "time"
  5. "github.com/Wei-Shaw/sub2api/internal/domain"
  6. infraerrors "github.com/Wei-Shaw/sub2api/internal/pkg/errors"
  7. "github.com/Wei-Shaw/sub2api/internal/pkg/pagination"
  8. )
  9. const (
  10. AnnouncementStatusDraft = domain.AnnouncementStatusDraft
  11. AnnouncementStatusActive = domain.AnnouncementStatusActive
  12. AnnouncementStatusArchived = domain.AnnouncementStatusArchived
  13. )
  14. const (
  15. AnnouncementNotifyModeSilent = domain.AnnouncementNotifyModeSilent
  16. AnnouncementNotifyModePopup = domain.AnnouncementNotifyModePopup
  17. )
  18. const (
  19. AnnouncementConditionTypeSubscription = domain.AnnouncementConditionTypeSubscription
  20. AnnouncementConditionTypeBalance = domain.AnnouncementConditionTypeBalance
  21. )
  22. const (
  23. AnnouncementOperatorIn = domain.AnnouncementOperatorIn
  24. AnnouncementOperatorGT = domain.AnnouncementOperatorGT
  25. AnnouncementOperatorGTE = domain.AnnouncementOperatorGTE
  26. AnnouncementOperatorLT = domain.AnnouncementOperatorLT
  27. AnnouncementOperatorLTE = domain.AnnouncementOperatorLTE
  28. AnnouncementOperatorEQ = domain.AnnouncementOperatorEQ
  29. )
  30. var (
  31. ErrAnnouncementNotFound = domain.ErrAnnouncementNotFound
  32. ErrAnnouncementInvalidTarget = domain.ErrAnnouncementInvalidTarget
  33. ErrAnnouncementNilInput = infraerrors.BadRequest("ANNOUNCEMENT_INPUT_REQUIRED", "announcement input is required")
  34. ErrAnnouncementInvalidTitle = infraerrors.BadRequest("ANNOUNCEMENT_TITLE_INVALID", "announcement title is invalid")
  35. ErrAnnouncementContentRequired = infraerrors.BadRequest(
  36. "ANNOUNCEMENT_CONTENT_REQUIRED",
  37. "announcement content is required",
  38. )
  39. ErrAnnouncementInvalidStatus = infraerrors.BadRequest("ANNOUNCEMENT_STATUS_INVALID", "announcement status is invalid")
  40. ErrAnnouncementInvalidNotifyMode = infraerrors.BadRequest(
  41. "ANNOUNCEMENT_NOTIFY_MODE_INVALID",
  42. "announcement notify_mode is invalid",
  43. )
  44. ErrAnnouncementInvalidSchedule = infraerrors.BadRequest(
  45. "ANNOUNCEMENT_TIME_RANGE_INVALID",
  46. "starts_at must be before ends_at",
  47. )
  48. )
  49. type AnnouncementTargeting = domain.AnnouncementTargeting
  50. type AnnouncementConditionGroup = domain.AnnouncementConditionGroup
  51. type AnnouncementCondition = domain.AnnouncementCondition
  52. type Announcement = domain.Announcement
  53. type AnnouncementListFilters struct {
  54. Status string
  55. Search string
  56. }
  57. type AnnouncementRepository interface {
  58. Create(ctx context.Context, a *Announcement) error
  59. GetByID(ctx context.Context, id int64) (*Announcement, error)
  60. Update(ctx context.Context, a *Announcement) error
  61. Delete(ctx context.Context, id int64) error
  62. List(ctx context.Context, params pagination.PaginationParams, filters AnnouncementListFilters) ([]Announcement, *pagination.PaginationResult, error)
  63. ListActive(ctx context.Context, now time.Time) ([]Announcement, error)
  64. }
  65. type AnnouncementReadRepository interface {
  66. MarkRead(ctx context.Context, announcementID, userID int64, readAt time.Time) error
  67. GetReadMapByUser(ctx context.Context, userID int64, announcementIDs []int64) (map[int64]time.Time, error)
  68. GetReadMapByUsers(ctx context.Context, announcementID int64, userIDs []int64) (map[int64]time.Time, error)
  69. CountByAnnouncementID(ctx context.Context, announcementID int64) (int64, error)
  70. }