- 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
39 lines
1.2 KiB
Go
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
|
|
}
|