github.com/moov-io/imagecashletter@v0.10.1/internal/storage/storage.go (about)

     1  // Copyright 2020 The Moov Authors
     2  // Use of this source code is governed by an Apache License
     3  // license that can be found in the LICENSE file.
     4  
     5  package storage
     6  
     7  import (
     8  	"errors"
     9  	"sync"
    10  
    11  	"github.com/moov-io/imagecashletter"
    12  )
    13  
    14  type ICLFileRepository interface {
    15  	GetFiles() ([]*imagecashletter.File, error)
    16  	GetFile(fileId string) (*imagecashletter.File, error)
    17  
    18  	SaveFile(file *imagecashletter.File) error
    19  	DeleteFile(fileId string) error
    20  }
    21  
    22  type memoryICLFileRepository struct {
    23  	mu    sync.Mutex
    24  	files map[string]*imagecashletter.File
    25  }
    26  
    27  func NewInMemoryRepo() ICLFileRepository {
    28  	return &memoryICLFileRepository{
    29  		files: make(map[string]*imagecashletter.File),
    30  	}
    31  }
    32  
    33  func (r *memoryICLFileRepository) GetFiles() ([]*imagecashletter.File, error) {
    34  	r.mu.Lock()
    35  	defer r.mu.Unlock()
    36  
    37  	var out []*imagecashletter.File
    38  	for _, v := range r.files {
    39  		f := *v
    40  		out = append(out, &f)
    41  	}
    42  	return out, nil
    43  }
    44  
    45  func (r *memoryICLFileRepository) GetFile(fileId string) (*imagecashletter.File, error) {
    46  	r.mu.Lock()
    47  	defer r.mu.Unlock()
    48  
    49  	for i := range r.files {
    50  		if r.files[i].ID == fileId {
    51  			f := *r.files[i]
    52  			return &f, nil
    53  		}
    54  	}
    55  	return nil, nil
    56  }
    57  
    58  func (r *memoryICLFileRepository) SaveFile(file *imagecashletter.File) error {
    59  	r.mu.Lock()
    60  	defer r.mu.Unlock()
    61  
    62  	if file.ID == "" {
    63  		return errors.New("empty ICL File ID")
    64  	}
    65  	r.files[file.ID] = file
    66  	return nil
    67  }
    68  
    69  func (r *memoryICLFileRepository) DeleteFile(fileId string) error {
    70  	r.mu.Lock()
    71  	defer r.mu.Unlock()
    72  
    73  	if fileId == "" {
    74  		return errors.New("empty ICL File Id")
    75  	}
    76  
    77  	delete(r.files, fileId)
    78  
    79  	return nil
    80  }