diff --git a/internal/data/FileDatastore.go b/internal/data/FileDatastore.go index b461ad5..fbcf6a0 100644 --- a/internal/data/FileDatastore.go +++ b/internal/data/FileDatastore.go @@ -7,17 +7,16 @@ import ( "encoding/json" ) +// A very simple datastructure, implementing the IDatastore interface. It uses +// a simple text file to the data as json. type FileDatastore struct { - /* A very simple datastructure, implementing the IDatastore interface. It - * uses a simple text file to the data as json. */ path string } +// Creates a new FileDatastore object, creating the storage file in the +// process. func NewFileDatastore(path string) (*FileDatastore, error) { - /* Creates a new FileDatastore object, creating the storage file in the - * process. */ - fds := &FileDatastore{ path: path } if _, err := fds.readMapObj(); err != nil { @@ -27,11 +26,10 @@ func NewFileDatastore(path string) (*FileDatastore, error) { return fds, nil } +// Read the contents of the storage file and convert to a map object. May throw +// an error, if the file does not exit or the file content can not be +// converted. func (fds *FileDatastore) readMapObj() (map[string]string, error) { - /* Read the contents of the storage file and convert to a map object. May - * throw an error, if the file does not exit or the file content can not be - * converted. */ - dat, err := os.ReadFile(fds.path) if err != nil { return nil, err } @@ -42,11 +40,9 @@ func (fds *FileDatastore) readMapObj() (map[string]string, error) { return mapobj, nil } +// Write the map object to the storage file. Will overwrite the content of the +// file. May throw an error, if the file cannot be created or written to. func (fds *FileDatastore) writeMapObj(m map[string]string) error { - /* Write the map object to the storage file. Will overwrite the content of - * the file. May throw an error, if the file cannot be created or written - * to. */ - file, err := os.Create(fds.path) if err != nil { return err } defer file.Close() @@ -57,13 +53,13 @@ func (fds *FileDatastore) writeMapObj(m map[string]string) error { return nil } + // --- implement IDatastore interface --- +// Sets the key value pair given, overwriting if the key already exists. May +// through an error if the file cannot be opened or the contents cannot be +// decoded correctly. func (fds *FileDatastore) Set(key string, val string) error { - /* Sets the key value pair given, overwriting if the key already exists. - * May through an error if the file cannot be opened or the contents cannot - * be decoded correctly. */ - m, err := fds.readMapObj() if err != nil { return err } @@ -75,10 +71,9 @@ func (fds *FileDatastore) Set(key string, val string) error { return nil } +// Check if for the given key a entry does exit. May through an error if the +// file cannot be opened or the contents cannot be decoded correctly. func (fds *FileDatastore) KeyExists(key string) (bool, error) { - /* Check if for the given key a entry does exit. May through an error if - * the file cannot be opened or the contents cannot be decoded correctly. */ - m, err := fds.readMapObj() if err != nil { return false, err } @@ -87,11 +82,10 @@ func (fds *FileDatastore) KeyExists(key string) (bool, error) { return ok, nil } +// Gets the value for the given key. May through an error if the key does not +// exit, the file cannot be opened or the contents cannot be decoded +// correctly. func (fds *FileDatastore) Get(key string) (string, error) { - /* Gets the value for the given key. May through an error if the key does - * not exit, the file cannot be opened or the contents cannot be decoded - * correctly. */ - m, err := fds.readMapObj() if err != nil { return "", err } @@ -101,19 +95,17 @@ func (fds *FileDatastore) Get(key string) (string, error) { return val, nil } +// Gets all the key value pairs from the file and returns them as a map object. +// May through an error if the file cannot be opened or the contents cannot be +// decoded correctly. func (fds *FileDatastore) GetAll() (map[string]string, error) { - /* Gets all the key value pairs from the file and returns them as a map - * object. May through an error if the file cannot be opened or the contents - * cannot be decoded correctly. */ - return fds.readMapObj() } +// Gets all the key the file and returns them as a map object. May through an +// error if the file cannot be opened or the contents cannot be decoded +// correctly. func (fds *FileDatastore) GetAllKeys() (map[string]bool, error) { - /* Gets all the key the file and returns them as a map object. May through - * an error if the file cannot be opened or the contents cannot be decoded - * correctly. */ - m, err := fds.readMapObj() if err != nil { return nil, err } @@ -124,3 +116,18 @@ func (fds *FileDatastore) GetAllKeys() (map[string]bool, error) { return out, nil } + +// Deletes the entry with the given key. May through an error if the file +// cannot be opened or the contents cannot be decoded or encoded correctly. +func (fds *FileDatastore) Delete(key string) error { + + m, err := fds.readMapObj() + if err != nil { return err } + + delete(m, key) + + err = fds.writeMapObj(m) + if err != nil { return err } + + return nil +} diff --git a/internal/data/IDatastore.go b/internal/data/IDatastore.go index 26b047f..d735091 100644 --- a/internal/data/IDatastore.go +++ b/internal/data/IDatastore.go @@ -6,4 +6,5 @@ type IDatastore interface { Get(key string) (string, error) GetAll() (map[string]string, error) GetAllKeys() (map[string]bool, error) + Delete(key string) error } diff --git a/internal/data/IRepository.go b/internal/data/IRepository.go index 06857b9..3c9496f 100644 --- a/internal/data/IRepository.go +++ b/internal/data/IRepository.go @@ -7,10 +7,10 @@ import ( ) +// An interface to manage generic structure objects persistently. Should use an +// IDatastore as the interface that actually stores and retrieves the data from +// an external source. type IRepository[T IIdentifiable] interface { - /* An interface to manage generic structure objects persistently. Should - * use an IDatastore as the interface that actually stores and retrieves the - * data from an external source. */ Create(t T) error Update(t T) error Delete(t T) error @@ -19,6 +19,7 @@ type IRepository[T IIdentifiable] interface { GetByCriteria(c ISearchCriteria[T]) ([]T, error) } + // --- default implementation --- type DefaultRepository[T IIdentifiable] struct { @@ -30,10 +31,10 @@ func NewDefaultRepository[T IIdentifiable](ds IDatastore, prefix string) *Defaul return &DefaultRepository[T]{ ds: ds, prefix: prefix } } +// Creates a new entry in the repository with the given object t. Throws an +// error if there already exists an entry with the same id, the json encoding +// fails or the connection to the IDatastore fails. func (repo *DefaultRepository[T]) Create(t T) error { - /* Creates a new entry in the repository with the given object t. Throws an - * error if there already exists an entry with the same id, the json - * encoding fails or the connection to the IDatastore fails. */ key := repo.prefix + ":" + strconv.FormatUint(uint64(t.Id()), 10) exists, err := repo.ds.KeyExists(key) @@ -49,10 +50,10 @@ func (repo *DefaultRepository[T]) Create(t T) error { return nil } +// Updates the entry with the same id as t in the repository with the values of +// t. Trows an error if the json encoding fails or the connection to the +// IDatastore fails. func (repo *DefaultRepository[T]) Update(t T) error { - /* Updates the entry with the same id as t in the repository with the - * values of t. Trows an error if the json encoding fails or the connection - * to the IDatastore fails. */ key := repo.prefix + ":" + strconv.FormatUint(uint64(t.Id()), 10) exists, err := repo.ds.KeyExists(key)