diff --git a/internal/repository/letter_outgoing_repository.go b/internal/repository/letter_outgoing_repository.go index cbe3941..8ace4d1 100644 --- a/internal/repository/letter_outgoing_repository.go +++ b/internal/repository/letter_outgoing_repository.go @@ -420,10 +420,23 @@ func (r *LetterOutgoingRecipientRepository) CreateBulk(ctx context.Context, list func (r *LetterOutgoingRecipientRepository) CountUnreadByUser(ctx context.Context, userID uuid.UUID) (int, error) { db := DBFromContext(ctx, r.db) var count int64 - if err := db.WithContext(ctx). - Model(&entities.LetterOutgoingRecipient{}). - Where("user_id = ? AND read_at IS NULL", userID). - Count(&count).Error; err != nil { + + sql := ` + SELECT COUNT(*) FROM ( + SELECT * FROM letter_outgoing_recipients + WHERE user_id = ? AND read_at IS NULL + AND id IN ( + SELECT id FROM ( + SELECT id, ROW_NUMBER() OVER (PARTITION BY letter_id ORDER BY created_at DESC) as rn + FROM letter_outgoing_recipients + WHERE user_id = ? + ) ranked + WHERE rn = 1 + ) + ) result + ` + + if err := db.WithContext(ctx).Raw(sql, userID, userID).Scan(&count).Error; err != nil { return 0, err } return int(count), nil diff --git a/internal/repository/letter_repository.go b/internal/repository/letter_repository.go index d024ab1..f73746e 100644 --- a/internal/repository/letter_repository.go +++ b/internal/repository/letter_repository.go @@ -865,10 +865,23 @@ func (r *LetterIncomingRecipientRepository) CountReadByLetter(ctx context.Contex func (r *LetterIncomingRecipientRepository) CountUnreadByUser(ctx context.Context, userID uuid.UUID) (int, error) { db := DBFromContext(ctx, r.db) var count int64 - if err := db.WithContext(ctx). - Model(&entities.LetterIncomingRecipient{}). - Where("recipient_user_id = ? AND read_at IS NULL", userID). - Count(&count).Error; err != nil { + + sql := ` + SELECT COUNT(*) FROM ( + SELECT * FROM letter_incoming_recipients + WHERE recipient_user_id = ? AND read_at IS NULL + AND id IN ( + SELECT id FROM ( + SELECT id, ROW_NUMBER() OVER (PARTITION BY letter_id ORDER BY created_at DESC) as rn + FROM letter_incoming_recipients + WHERE recipient_user_id = ? + ) ranked + WHERE rn = 1 + ) + ) result + ` + + if err := db.WithContext(ctx).Raw(sql, userID, userID).Scan(&count).Error; err != nil { return 0, err } return int(count), nil