github.com/hellofresh/janus@v0.0.0-20230925145208-ce8de8183c67/pkg/api/in_memory_repository.go (about)

     1  package api
     2  
     3  import (
     4  	"context"
     5  	"sync"
     6  
     7  	log "github.com/sirupsen/logrus"
     8  )
     9  
    10  // InMemoryRepository represents a in memory repository
    11  type InMemoryRepository struct {
    12  	sync.RWMutex
    13  	definitions map[string]*Definition
    14  }
    15  
    16  // NewInMemoryRepository creates a in memory repository
    17  func NewInMemoryRepository() *InMemoryRepository {
    18  	return &InMemoryRepository{definitions: make(map[string]*Definition)}
    19  }
    20  
    21  // Close terminates the session.  It's a runtime error to use a session
    22  // after it has been closed.
    23  func (r *InMemoryRepository) Close() error {
    24  	return nil
    25  }
    26  
    27  // Watch watches for changes on the database
    28  func (r *InMemoryRepository) Watch(ctx context.Context, cfgChan chan<- ConfigurationChanged) {
    29  
    30  }
    31  
    32  // FindAll fetches all the api definitions available
    33  func (r *InMemoryRepository) FindAll() ([]*Definition, error) {
    34  	r.RLock()
    35  	defer r.RUnlock()
    36  
    37  	var definitions []*Definition
    38  	for _, definition := range r.definitions {
    39  		definitions = append(definitions, definition)
    40  	}
    41  
    42  	return definitions, nil
    43  }
    44  
    45  func (r *InMemoryRepository) findByName(name string) (*Definition, error) {
    46  	definition, ok := r.definitions[name]
    47  	if false == ok {
    48  		return nil, ErrAPIDefinitionNotFound
    49  	}
    50  
    51  	return definition, nil
    52  }
    53  
    54  // Add adds an api definition to the repository
    55  func (r *InMemoryRepository) add(definition *Definition) error {
    56  	r.Lock()
    57  	defer r.Unlock()
    58  
    59  	isValid, err := definition.Validate()
    60  	if false == isValid && err != nil {
    61  		log.WithError(err).Error("Validation errors")
    62  		return err
    63  	}
    64  
    65  	r.definitions[definition.Name] = definition
    66  
    67  	return nil
    68  }
    69  
    70  // Remove removes an api definition from the repository
    71  func (r *InMemoryRepository) remove(name string) error {
    72  	r.Lock()
    73  	defer r.Unlock()
    74  
    75  	if _, err := r.findByName(name); err != nil {
    76  		return err
    77  	}
    78  
    79  	delete(r.definitions, name)
    80  
    81  	return nil
    82  }