tercul-backend/repositories/book_repository.go
Damir Mukimov 4957117cb6 Initial commit: Tercul Go project with comprehensive architecture
- Core Go application with GraphQL API using gqlgen
- Comprehensive data models for literary works, authors, translations
- Repository pattern with caching layer
- Authentication and authorization system
- Linguistics analysis capabilities with multiple adapters
- Vector search integration with Weaviate
- Docker containerization support
- Python data migration and analysis scripts
- Clean architecture with proper separation of concerns
- Production-ready configuration and middleware
- Proper .gitignore excluding vendor/, database files, and build artifacts
2025-08-13 07:42:32 +02:00

74 lines
2.2 KiB
Go

package repositories
import (
"context"
"errors"
"gorm.io/gorm"
"tercul/models"
)
// BookRepository defines CRUD methods specific to Book.
type BookRepository interface {
BaseRepository[models.Book]
ListByAuthorID(ctx context.Context, authorID uint) ([]models.Book, error)
ListByPublisherID(ctx context.Context, publisherID uint) ([]models.Book, error)
ListByWorkID(ctx context.Context, workID uint) ([]models.Book, error)
FindByISBN(ctx context.Context, isbn string) (*models.Book, error)
}
type bookRepository struct {
BaseRepository[models.Book]
db *gorm.DB
}
// NewBookRepository creates a new BookRepository.
func NewBookRepository(db *gorm.DB) BookRepository {
return &bookRepository{
BaseRepository: NewBaseRepositoryImpl[models.Book](db),
db: db,
}
}
// ListByAuthorID finds books by author ID
func (r *bookRepository) ListByAuthorID(ctx context.Context, authorID uint) ([]models.Book, error) {
var books []models.Book
if err := r.db.WithContext(ctx).Joins("JOIN book_authors ON book_authors.book_id = books.id").
Where("book_authors.author_id = ?", authorID).
Find(&books).Error; err != nil {
return nil, err
}
return books, nil
}
// ListByPublisherID finds books by publisher ID
func (r *bookRepository) ListByPublisherID(ctx context.Context, publisherID uint) ([]models.Book, error) {
var books []models.Book
if err := r.db.WithContext(ctx).Where("publisher_id = ?", publisherID).Find(&books).Error; err != nil {
return nil, err
}
return books, nil
}
// ListByWorkID finds books by work ID
func (r *bookRepository) ListByWorkID(ctx context.Context, workID uint) ([]models.Book, error) {
var books []models.Book
if err := r.db.WithContext(ctx).Joins("JOIN book_works ON book_works.book_id = books.id").
Where("book_works.work_id = ?", workID).
Find(&books).Error; err != nil {
return nil, err
}
return books, nil
}
// FindByISBN finds a book by ISBN
func (r *bookRepository) FindByISBN(ctx context.Context, isbn string) (*models.Book, error) {
var book models.Book
if err := r.db.WithContext(ctx).Where("isbn = ?", isbn).First(&book).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrEntityNotFound
}
return nil, err
}
return &book, nil
}