package sql import ( "context" "tercul/internal/domain" "tercul/internal/platform/config" "github.com/google/uuid" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" "gorm.io/gorm" ) type contributionRepository struct { domain.BaseRepository[domain.Contribution] db *gorm.DB tracer trace.Tracer } // NewContributionRepository creates a new ContributionRepository. func NewContributionRepository(db *gorm.DB, cfg *config.Config) domain.ContributionRepository { return &contributionRepository{ BaseRepository: NewBaseRepositoryImpl[domain.Contribution](db, cfg), db: db, tracer: otel.Tracer("contribution.repository"), } } // ListByUserID finds contributions by user ID func (r *contributionRepository) ListByUserID(ctx context.Context, userID uuid.UUID) ([]domain.Contribution, error) { ctx, span := r.tracer.Start(ctx, "ListByUserID") defer span.End() var contributions []domain.Contribution if err := r.db.WithContext(ctx).Where("user_id = ?", userID).Find(&contributions).Error; err != nil { return nil, err } return contributions, nil } // ListByReviewerID finds contributions by reviewer ID func (r *contributionRepository) ListByReviewerID(ctx context.Context, reviewerID uuid.UUID) ([]domain.Contribution, error) { ctx, span := r.tracer.Start(ctx, "ListByReviewerID") defer span.End() var contributions []domain.Contribution if err := r.db.WithContext(ctx).Where("reviewer_id = ?", reviewerID).Find(&contributions).Error; err != nil { return nil, err } return contributions, nil } // ListByWorkID finds contributions by work ID func (r *contributionRepository) ListByWorkID(ctx context.Context, workID uuid.UUID) ([]domain.Contribution, error) { ctx, span := r.tracer.Start(ctx, "ListByWorkID") defer span.End() var contributions []domain.Contribution if err := r.db.WithContext(ctx).Where("work_id = ?", workID).Find(&contributions).Error; err != nil { return nil, err } return contributions, nil } // ListByTranslationID finds contributions by translation ID func (r *contributionRepository) ListByTranslationID(ctx context.Context, translationID uuid.UUID) ([]domain.Contribution, error) { ctx, span := r.tracer.Start(ctx, "ListByTranslationID") defer span.End() var contributions []domain.Contribution if err := r.db.WithContext(ctx).Where("translation_id = ?", translationID).Find(&contributions).Error; err != nil { return nil, err } return contributions, nil } // ListByStatus finds contributions by status func (r *contributionRepository) ListByStatus(ctx context.Context, status string) ([]domain.Contribution, error) { ctx, span := r.tracer.Start(ctx, "ListByStatus") defer span.End() var contributions []domain.Contribution if err := r.db.WithContext(ctx).Where("status = ?", status).Find(&contributions).Error; err != nil { return nil, err } return contributions, nil }