veza/veza-backend-api/internal/repositories/read_receipt_repository.go
senke 2ee63b9b11 feat(chat): Sprint 1 -- migrations, models, repositories for chat rewrite
- Add migrations 109-112: read_receipts, delivered_status, message_reactions, messages extra columns
- Create ReadReceipt, DeliveredStatus, MessageReaction GORM models
- Update Message model with EditedAt, Status, IsPinned, Metadata fields
- Enrich ChatMessageRepository with cursor pagination, search, soft delete
- Create ReadReceiptRepository, DeliveredStatusRepository, ReactionRepository
- Create ChatPubSubService with Redis PubSub and in-memory fallback
2026-02-22 20:38:20 +01:00

39 lines
1.2 KiB
Go

package repositories
import (
"context"
"veza-backend-api/internal/models"
"github.com/google/uuid"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
type ReadReceiptRepository struct {
db *gorm.DB
}
func NewReadReceiptRepository(db *gorm.DB) *ReadReceiptRepository {
return &ReadReceiptRepository{db: db}
}
func (r *ReadReceiptRepository) MarkRead(ctx context.Context, receipt *models.ReadReceipt) error {
return r.db.WithContext(ctx).
Clauses(clause.OnConflict{DoNothing: true}).
Create(receipt).Error
}
func (r *ReadReceiptRepository) GetByMessageID(ctx context.Context, messageID uuid.UUID) ([]models.ReadReceipt, error) {
var receipts []models.ReadReceipt
err := r.db.WithContext(ctx).Where("message_id = ?", messageID).Find(&receipts).Error
return receipts, err
}
func (r *ReadReceiptRepository) GetByConversationAndUser(ctx context.Context, conversationID, userID uuid.UUID) ([]models.ReadReceipt, error) {
var receipts []models.ReadReceipt
err := r.db.WithContext(ctx).
Joins("JOIN messages ON messages.id = read_receipts.message_id").
Where("messages.room_id = ? AND read_receipts.user_id = ?", conversationID, userID).
Find(&receipts).Error
return receipts, err
}