package sql import ( "context" "tercul/internal/domain" "tercul/internal/platform/config" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" "gorm.io/gorm" ) type authorRepository struct { domain.BaseRepository[domain.Author] db *gorm.DB tracer trace.Tracer } // NewAuthorRepository creates a new AuthorRepository. func NewAuthorRepository(db *gorm.DB, cfg *config.Config) domain.AuthorRepository { return &authorRepository{ BaseRepository: NewBaseRepositoryImpl[domain.Author](db, cfg), db: db, tracer: otel.Tracer("author.repository"), } } // ListByWorkID finds authors by work ID func (r *authorRepository) ListByWorkID(ctx context.Context, workID uint) ([]domain.Author, error) { ctx, span := r.tracer.Start(ctx, "ListByWorkID") defer span.End() var authors []domain.Author if err := r.db.WithContext(ctx).Joins("JOIN work_authors ON work_authors.author_id = authors.id"). Where("work_authors.work_id = ?", workID). Find(&authors).Error; err != nil { return nil, err } return authors, nil } // GetWithTranslations finds an author by ID and preloads their translations. func (r *authorRepository) GetWithTranslations(ctx context.Context, id uint) (*domain.Author, error) { ctx, span := r.tracer.Start(ctx, "GetWithTranslations") defer span.End() var author domain.Author if err := r.db.WithContext(ctx).Preload("Translations").First(&author, id).Error; err != nil { return nil, err } return &author, nil } // ListByBookID finds authors by book ID func (r *authorRepository) ListByBookID(ctx context.Context, bookID uint) ([]domain.Author, error) { ctx, span := r.tracer.Start(ctx, "ListByBookID") defer span.End() var authors []domain.Author if err := r.db.WithContext(ctx).Joins("JOIN book_authors ON book_authors.author_id = authors.id"). Where("book_authors.book_id = ?", bookID). Find(&authors).Error; err != nil { return nil, err } return authors, nil } // ListByCountryID finds authors by country ID func (r *authorRepository) ListByCountryID(ctx context.Context, countryID uint) ([]domain.Author, error) { ctx, span := r.tracer.Start(ctx, "ListByCountryID") defer span.End() var authors []domain.Author if err := r.db.WithContext(ctx).Where("country_id = ?", countryID).Find(&authors).Error; err != nil { return nil, err } return authors, nil }