announcement_read_repo.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package repository
  2. import (
  3. "context"
  4. "time"
  5. dbent "github.com/Wei-Shaw/sub2api/ent"
  6. "github.com/Wei-Shaw/sub2api/ent/announcementread"
  7. "github.com/Wei-Shaw/sub2api/internal/service"
  8. )
  9. type announcementReadRepository struct {
  10. client *dbent.Client
  11. }
  12. func NewAnnouncementReadRepository(client *dbent.Client) service.AnnouncementReadRepository {
  13. return &announcementReadRepository{client: client}
  14. }
  15. func (r *announcementReadRepository) MarkRead(ctx context.Context, announcementID, userID int64, readAt time.Time) error {
  16. client := clientFromContext(ctx, r.client)
  17. err := client.AnnouncementRead.Create().
  18. SetAnnouncementID(announcementID).
  19. SetUserID(userID).
  20. SetReadAt(readAt).
  21. OnConflictColumns(announcementread.FieldAnnouncementID, announcementread.FieldUserID).
  22. DoNothing().
  23. Exec(ctx)
  24. if isSQLNoRowsError(err) {
  25. return nil
  26. }
  27. return err
  28. }
  29. func (r *announcementReadRepository) GetReadMapByUser(ctx context.Context, userID int64, announcementIDs []int64) (map[int64]time.Time, error) {
  30. if len(announcementIDs) == 0 {
  31. return map[int64]time.Time{}, nil
  32. }
  33. rows, err := r.client.AnnouncementRead.Query().
  34. Where(
  35. announcementread.UserIDEQ(userID),
  36. announcementread.AnnouncementIDIn(announcementIDs...),
  37. ).
  38. All(ctx)
  39. if err != nil {
  40. return nil, err
  41. }
  42. out := make(map[int64]time.Time, len(rows))
  43. for i := range rows {
  44. out[rows[i].AnnouncementID] = rows[i].ReadAt
  45. }
  46. return out, nil
  47. }
  48. func (r *announcementReadRepository) GetReadMapByUsers(ctx context.Context, announcementID int64, userIDs []int64) (map[int64]time.Time, error) {
  49. if len(userIDs) == 0 {
  50. return map[int64]time.Time{}, nil
  51. }
  52. rows, err := r.client.AnnouncementRead.Query().
  53. Where(
  54. announcementread.AnnouncementIDEQ(announcementID),
  55. announcementread.UserIDIn(userIDs...),
  56. ).
  57. All(ctx)
  58. if err != nil {
  59. return nil, err
  60. }
  61. out := make(map[int64]time.Time, len(rows))
  62. for i := range rows {
  63. out[rows[i].UserID] = rows[i].ReadAt
  64. }
  65. return out, nil
  66. }
  67. func (r *announcementReadRepository) CountByAnnouncementID(ctx context.Context, announcementID int64) (int64, error) {
  68. count, err := r.client.AnnouncementRead.Query().
  69. Where(announcementread.AnnouncementIDEQ(announcementID)).
  70. Count(ctx)
  71. if err != nil {
  72. return 0, err
  73. }
  74. return int64(count), nil
  75. }