package sql import ( "context" "tercul/internal/domain" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" "gorm.io/gorm" ) type collectionRepository struct { domain.BaseRepository[domain.Collection] db *gorm.DB tracer trace.Tracer } // NewCollectionRepository creates a new CollectionRepository. func NewCollectionRepository(db *gorm.DB) domain.CollectionRepository { return &collectionRepository{ BaseRepository: NewBaseRepositoryImpl[domain.Collection](db), db: db, tracer: otel.Tracer("collection.repository"), } } // ListByUserID finds collections by user ID func (r *collectionRepository) ListByUserID(ctx context.Context, userID uint) ([]domain.Collection, error) { ctx, span := r.tracer.Start(ctx, "ListByUserID") defer span.End() var collections []domain.Collection if err := r.db.WithContext(ctx).Where("user_id = ?", userID).Find(&collections).Error; err != nil { return nil, err } return collections, nil } // AddWorkToCollection adds a work to a collection func (r *collectionRepository) AddWorkToCollection(ctx context.Context, collectionID uint, workID uint) error { ctx, span := r.tracer.Start(ctx, "AddWorkToCollection") defer span.End() return r.db.WithContext(ctx).Exec("INSERT INTO collection_works (collection_id, work_id) VALUES (?, ?) ON CONFLICT DO NOTHING", collectionID, workID).Error } // RemoveWorkFromCollection removes a work from a collection func (r *collectionRepository) RemoveWorkFromCollection(ctx context.Context, collectionID uint, workID uint) error { ctx, span := r.tracer.Start(ctx, "RemoveWorkFromCollection") defer span.End() return r.db.WithContext(ctx).Exec("DELETE FROM collection_works WHERE collection_id = ? AND work_id = ?", collectionID, workID).Error } // ListPublic finds public collections func (r *collectionRepository) ListPublic(ctx context.Context) ([]domain.Collection, error) { ctx, span := r.tracer.Start(ctx, "ListPublic") defer span.End() var collections []domain.Collection if err := r.db.WithContext(ctx).Where("is_public = ?", true).Find(&collections).Error; err != nil { return nil, err } return collections, nil } // ListByWorkID finds collections by work ID func (r *collectionRepository) ListByWorkID(ctx context.Context, workID uint) ([]domain.Collection, error) { ctx, span := r.tracer.Start(ctx, "ListByWorkID") defer span.End() var collections []domain.Collection if err := r.db.WithContext(ctx).Joins("JOIN collection_works ON collection_works.collection_id = collections.id"). Where("collection_works.work_id = ?", workID). Find(&collections).Error; err != nil { return nil, err } return collections, nil }