added member provider.

This commit is contained in:
Miroslav Šedivý
2021-03-14 01:08:50 +01:00
parent 594404824f
commit 7c79b48750
10 changed files with 141 additions and 78 deletions

View File

@ -0,0 +1,128 @@
package file
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"sync"
"demodesk/neko/internal/types"
)
func New(file string) types.MemberManager {
return &MemberManagerCtx{
file: file,
mu: sync.Mutex{},
}
}
type MemberManagerCtx struct {
file string
mu sync.Mutex
}
func (manager *MemberManagerCtx) Connect() error {
return nil
}
func (manager *MemberManagerCtx) Disconnect() error {
return nil
}
func (manager *MemberManagerCtx) Insert(id string, profile types.MemberProfile) error {
manager.mu.Lock()
defer manager.mu.Unlock()
profiles, err := manager.deserialize()
if err != nil {
return err
}
_, ok := profiles[id]
if ok {
return fmt.Errorf("Member ID already exists.")
}
profiles[id] = profile
return manager.serialize(profiles)
}
func (manager *MemberManagerCtx) Update(id string, profile types.MemberProfile) error {
manager.mu.Lock()
defer manager.mu.Unlock()
profiles, err := manager.deserialize()
if err != nil {
return err
}
_, ok := profiles[id]
if !ok {
return fmt.Errorf("Member ID does not exist.")
}
profiles[id] = profile
return manager.serialize(profiles)
}
func (manager *MemberManagerCtx) Delete(id string) error {
manager.mu.Lock()
defer manager.mu.Unlock()
profiles, err := manager.deserialize()
if err != nil {
return err
}
_, ok := profiles[id]
if !ok {
return fmt.Errorf("Member ID does not exist.")
}
delete(profiles, id)
return manager.serialize(profiles)
}
func (manager *MemberManagerCtx) Select() (map[string]types.MemberProfile, error) {
manager.mu.Lock()
defer manager.mu.Unlock()
profiles, err := manager.deserialize()
return profiles, err
}
func (manager *MemberManagerCtx) deserialize() (map[string]types.MemberProfile, error) {
file, err := os.OpenFile(manager.file, os.O_RDONLY|os.O_CREATE, os.ModePerm)
if err != nil {
return nil, err
}
raw, err := ioutil.ReadAll(file)
if err != nil {
return nil, err
}
if len(raw) == 0 {
return map[string]types.MemberProfile{}, nil
}
var profiles map[string]types.MemberProfile
if err := json.Unmarshal([]byte(raw), &profiles); err != nil {
return nil, err
}
return profiles, nil
}
func (manager *MemberManagerCtx) serialize(data map[string]types.MemberProfile) error {
raw, err := json.Marshal(data)
if err != nil {
return err
}
return ioutil.WriteFile(manager.file, raw, os.ModePerm)
}