feat(training): add Repository.FindBySlug() method
This commit is contained in:
parent
fe38dd6683
commit
e0594892d5
4 changed files with 84 additions and 8 deletions
|
|
@ -4,7 +4,7 @@ import (
|
|||
"context"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"gitlab.mareshq.com/hq/yggdrasil/pkg/slug"
|
||||
slugpkg "gitlab.mareshq.com/hq/yggdrasil/pkg/slug"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
|
@ -21,7 +21,7 @@ func (r *PostgresTrainingRepository) Create(training *Training) error {
|
|||
defer cancel()
|
||||
|
||||
if training.Slug == "" {
|
||||
training.Slug = slug.NewString(training.Name)
|
||||
training.Slug = slugpkg.NewString(training.Name)
|
||||
}
|
||||
|
||||
tx, txErr := r.pg.Begin(ctx)
|
||||
|
|
@ -77,7 +77,7 @@ func (r *PostgresTrainingRepository) FindByID(id ID) (*Training, error) {
|
|||
|
||||
var training Training
|
||||
err := r.pg.QueryRow(ctx, `
|
||||
SELECT id, name, description, days
|
||||
SELECT id, name, slug, description, days
|
||||
FROM training.trainings
|
||||
WHERE id = $1
|
||||
`, id).Scan(&training.ID, &training.Name, &training.Slug, &training.Description, &training.Days)
|
||||
|
|
@ -112,6 +112,51 @@ func (r *PostgresTrainingRepository) FindByID(id ID) (*Training, error) {
|
|||
return &training, nil
|
||||
}
|
||||
|
||||
func (r *PostgresTrainingRepository) FindBySlug(slug string) (*Training, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
|
||||
if err := slugpkg.Validate(slug); err != nil {
|
||||
return nil, ErrTrainingNotFound
|
||||
}
|
||||
|
||||
var training Training
|
||||
err := r.pg.QueryRow(ctx, `
|
||||
SELECT id, name, slug, description, days
|
||||
FROM training.trainings
|
||||
WHERE slug = $1
|
||||
`, slug).Scan(&training.ID, &training.Name, &training.Slug, &training.Description, &training.Days)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rows, err := r.pg.Query(ctx, `
|
||||
SELECT amount, currency, type
|
||||
FROM training.prices
|
||||
WHERE training_id = $1
|
||||
`, training.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
training.Pricing = make([]Price, 0)
|
||||
training.Pricing, err = pgx.CollectRows[Price](rows, func(row pgx.CollectableRow) (Price, error) {
|
||||
var price Price
|
||||
err := row.Scan(&price.Amount, &price.Currency, &price.Type)
|
||||
if err != nil {
|
||||
return Price{}, err
|
||||
}
|
||||
return price, nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &training, nil
|
||||
}
|
||||
|
||||
func (r *PostgresTrainingRepository) FindAll() ([]Training, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
|
|
@ -157,9 +202,9 @@ func (r *PostgresTrainingRepository) Update(training *Training) error {
|
|||
defer cancel()
|
||||
|
||||
if training.Slug == "" {
|
||||
training.Slug = slug.NewString(training.Name)
|
||||
training.Slug = slugpkg.NewString(training.Name)
|
||||
} else {
|
||||
slugValidateErr := slug.Validate(training.Slug)
|
||||
slugValidateErr := slugpkg.Validate(training.Slug)
|
||||
if slugValidateErr != nil {
|
||||
return slugValidateErr
|
||||
}
|
||||
|
|
|
|||
Reference in a new issue