feat(training): add Repository.FindBySlug() method
This commit is contained in:
parent
fe38dd6683
commit
e0594892d5
4 changed files with 84 additions and 8 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Reference in a new issue