From 100544198b0e50bcca48b68f87be8d0ad01ffe2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Sun, 6 Dec 2020 00:21:09 +0100 Subject: [PATCH] add members database adapters interface. --- internal/session/database/dummy/adapter.go | 27 ++++++++ internal/session/database/manager.go | 68 ++++----------------- internal/session/database/object/adapter.go | 66 ++++++++++++++++++++ internal/session/manager.go | 6 +- internal/types/session.go | 7 +++ 5 files changed, 116 insertions(+), 58 deletions(-) create mode 100644 internal/session/database/dummy/adapter.go create mode 100644 internal/session/database/object/adapter.go diff --git a/internal/session/database/dummy/adapter.go b/internal/session/database/dummy/adapter.go new file mode 100644 index 00000000..5ad86231 --- /dev/null +++ b/internal/session/database/dummy/adapter.go @@ -0,0 +1,27 @@ +package dummy + +import ( + "demodesk/neko/internal/types" +) + +func New() types.MembersDatabase { + return &MembersDatabaseCtx{} +} + +type MembersDatabaseCtx struct {} + +func (manager *MembersDatabaseCtx) Insert(id string, profile types.MemberProfile) error { + return nil +} + +func (manager *MembersDatabaseCtx) Update(id string, profile types.MemberProfile) error { + return nil +} + +func (manager *MembersDatabaseCtx) Delete(id string) error { + return nil +} + +func (manager *MembersDatabaseCtx) Select() map[string]types.MemberProfile { + return map[string]types.MemberProfile{} +} diff --git a/internal/session/database/manager.go b/internal/session/database/manager.go index e066ace6..29797a87 100644 --- a/internal/session/database/manager.go +++ b/internal/session/database/manager.go @@ -1,66 +1,22 @@ package database import ( - "fmt" - "sync" - + "demodesk/neko/internal/session/database/dummy" + "demodesk/neko/internal/session/database/object" "demodesk/neko/internal/types" + "demodesk/neko/internal/config" ) -func New() *MembersDatabaseCtx { - return &MembersDatabaseCtx{ - profiles: make(map[string]types.MemberProfile), - mu: sync.Mutex{}, - } -} +func New(config *config.Session) types.MembersDatabase { + // TODO: Load from config. + adapter := "object" -type MembersDatabaseCtx struct { - profiles map[string]types.MemberProfile - mu sync.Mutex -} - -func (manager *MembersDatabaseCtx) Insert(id string, profile types.MemberProfile) error { - manager.mu.Lock() - defer manager.mu.Unlock() - - _, ok := manager.profiles[id] - if ok { - return fmt.Errorf("Member ID already exists.") + switch adapter { + case "object": + return object.New() + case "dummy": + return dummy.New() } - manager.profiles[id] = profile - return nil -} - -func (manager *MembersDatabaseCtx) Update(id string, profile types.MemberProfile) error { - manager.mu.Lock() - defer manager.mu.Unlock() - - _, ok := manager.profiles[id] - if !ok { - return fmt.Errorf("Member ID does not exist.") - } - - manager.profiles[id] = profile - return nil -} - -func (manager *MembersDatabaseCtx) Delete(id string) error { - manager.mu.Lock() - defer manager.mu.Unlock() - - _, ok := manager.profiles[id] - if !ok { - return fmt.Errorf("Member ID does not exist.") - } - - delete(manager.profiles, id) - return nil -} - -func (manager *MembersDatabaseCtx) Select() map[string]types.MemberProfile { - manager.mu.Lock() - defer manager.mu.Unlock() - - return manager.profiles + return dummy.New() } diff --git a/internal/session/database/object/adapter.go b/internal/session/database/object/adapter.go new file mode 100644 index 00000000..c69cc143 --- /dev/null +++ b/internal/session/database/object/adapter.go @@ -0,0 +1,66 @@ +package object + +import ( + "fmt" + "sync" + + "demodesk/neko/internal/types" +) + +func New() types.MembersDatabase { + return &MembersDatabaseCtx{ + profiles: make(map[string]types.MemberProfile), + mu: sync.Mutex{}, + } +} + +type MembersDatabaseCtx struct { + profiles map[string]types.MemberProfile + mu sync.Mutex +} + +func (manager *MembersDatabaseCtx) Insert(id string, profile types.MemberProfile) error { + manager.mu.Lock() + defer manager.mu.Unlock() + + _, ok := manager.profiles[id] + if ok { + return fmt.Errorf("Member ID already exists.") + } + + manager.profiles[id] = profile + return nil +} + +func (manager *MembersDatabaseCtx) Update(id string, profile types.MemberProfile) error { + manager.mu.Lock() + defer manager.mu.Unlock() + + _, ok := manager.profiles[id] + if !ok { + return fmt.Errorf("Member ID does not exist.") + } + + manager.profiles[id] = profile + return nil +} + +func (manager *MembersDatabaseCtx) Delete(id string) error { + manager.mu.Lock() + defer manager.mu.Unlock() + + _, ok := manager.profiles[id] + if !ok { + return fmt.Errorf("Member ID does not exist.") + } + + delete(manager.profiles, id) + return nil +} + +func (manager *MembersDatabaseCtx) Select() map[string]types.MemberProfile { + manager.mu.Lock() + defer manager.mu.Unlock() + + return manager.profiles +} diff --git a/internal/session/manager.go b/internal/session/manager.go index a064e297..7eed56d1 100644 --- a/internal/session/manager.go +++ b/internal/session/manager.go @@ -20,7 +20,7 @@ func New(config *config.Session) *SessionManagerCtx { host: nil, hostMu: sync.Mutex{}, config: config, - database: database.New(), + database: database.New(config), members: make(map[string]*SessionCtx), membersMu: sync.Mutex{}, emmiter: events.New(), @@ -31,6 +31,8 @@ func New(config *config.Session) *SessionManagerCtx { _ = manager.add(id, profile) } + // TODO: Move to Database, or make `admin` as reserved user. + // create default admin account at startup _ = manager.add("admin", types.MemberProfile{ Secret: config.AdminPassword, @@ -53,7 +55,7 @@ type SessionManagerCtx struct { host types.Session hostMu sync.Mutex config *config.Session - database *database.MembersDatabaseCtx + database types.MembersDatabase members map[string]*SessionCtx membersMu sync.Mutex emmiter events.EventEmmiter diff --git a/internal/types/session.go b/internal/types/session.go index d5b2688d..76275a85 100644 --- a/internal/types/session.go +++ b/internal/types/session.go @@ -14,6 +14,13 @@ type MemberProfile struct { CanAccessClipboard bool } +type MembersDatabase interface { + Insert(id string, profile MemberProfile) error + Update(id string, profile MemberProfile) error + Delete(id string) error + Select() map[string]MemberProfile +} + type Session interface { ID() string