1
0
Fork 0

feat(training): add Repository.FindBySlug() method

This commit is contained in:
Vojtěch Mareš 2024-06-27 09:07:33 +02:00
parent fe38dd6683
commit e0594892d5
Signed by: vojtech.mares
GPG key ID: C6827B976F17240D
4 changed files with 84 additions and 8 deletions

View file

@ -8,6 +8,7 @@ import (
type InMemoryTrainingRepository struct {
trainings map[ID]Training
slugToID map[string]ID
lock sync.RWMutex
ai int
}
@ -15,6 +16,7 @@ type InMemoryTrainingRepository struct {
func NewInMemoryTrainingRepository() *InMemoryTrainingRepository {
return &InMemoryTrainingRepository{
trainings: make(map[ID]Training),
slugToID: make(map[string]ID),
ai: 1,
}
}
@ -35,7 +37,12 @@ func (r *InMemoryTrainingRepository) Create(training *Training) error {
}
}
if _, ok := r.slugToID[training.Slug]; ok {
return ErrTrainingWithSlugAlreadyExists
}
r.trainings[training.ID] = *training
r.slugToID[training.Slug] = training.ID
return nil
}
@ -50,6 +57,18 @@ func (r *InMemoryTrainingRepository) FindByID(id ID) (*Training, error) {
return &training, nil
}
func (r *InMemoryTrainingRepository) FindBySlug(slug string) (*Training, error) {
r.lock.RLock()
defer r.lock.RUnlock()
id, ok := r.slugToID[slug]
if !ok {
return nil, ErrTrainingNotFound
}
return r.FindByID(id)
}
func (r *InMemoryTrainingRepository) FindAll() ([]Training, error) {
r.lock.RLock()
defer r.lock.RUnlock()
@ -74,7 +93,16 @@ func (r *InMemoryTrainingRepository) Update(training *Training) error {
}
}
if _, ok := r.slugToID[training.Slug]; ok {
return ErrTrainingWithSlugAlreadyExists
}
r.trainings[training.ID] = *training
if r.trainings[training.ID].Slug != training.Slug {
delete(r.slugToID, r.trainings[training.ID].Slug)
r.slugToID[training.Slug] = training.ID
}
return nil
}
@ -87,6 +115,7 @@ func (r *InMemoryTrainingRepository) Delete(id ID) error {
return ErrTrainingNotFound
}
delete(r.slugToID, r.trainings[id].Slug)
delete(r.trainings, id)
return nil
}