package repositories import ( "clapclap/internal/models" "log" "clapclap/internal/uuid" "gorm.io/gorm" "gorm.io/gorm/clause" ) // Create inserts a new genre. func (r *Repo) CreateGenre(genre *models.Genre) error { // GORM handles the UUID generation via the Base struct default if err := r.db.Create(genre).Error; err != nil { return err } log.Printf("genre %s created", genre.Name) return nil } func (r *Repo) GetGenreRoots(genres *[]models.Genre, preloads []string) error { query := r.db.Where("parent_id IS NULL") for _, p := range preloads { if p == "Tracks" { query = query.Preload("Tracks", "is_public = ?", true) } else { query = query.Preload(p) } } return query.Find(genres).Error } // GetAll retrieves every single genre in a flat list (useful for search/autocomplete). func (r *Repo) GetAllGenres(genres *[]models.Genre, preloads []string) error { query := r.db for _, p := range preloads { if p == "Tracks" { query = query.Preload("Tracks", "is_public = ?", true) } else { query = query.Preload(p) } } return query.Find(genres).Error } func (r *Repo) GetGenreByID(id string, preloads []string) (*models.Genre, error) { var genre models.Genre uid, err := uuid.Parse(id) if err != nil { return nil, err } query := r.db for _, p := range preloads { if p == "Tracks" { query = query.Preload("Tracks", "is_public = ?", true) } else { query = query.Preload(p) } } err = query.First(&genre, "id = ?", uid).Error return &genre, err } func (r *Repo) UpdateGenre(genre *models.Genre) error { // Updates allows partial updates of fields if err := r.db.Model(genre).Updates(genre).Error; err != nil { return err } log.Printf("genre %s updated", genre.Name) return nil } func (r *Repo) DeleteGenre(id string) error { uid, err := uuid.Parse(id) if err != nil { return err } var genre models.Genre // Soft Delete because of models.Base result := r.db.Clauses(clause.Returning{}). Where("id = ?", uid). Delete(&genre) if result.Error != nil { return result.Error } if result.RowsAffected == 0 { return gorm.ErrRecordNotFound } log.Printf("genre %s soft-deleted", genre.Name) return nil }