Add memory store
diff --git a/core/kg/model/user.go b/core/kg/model/user.go
index 6feb948..156f4fa 100644
--- a/core/kg/model/user.go
+++ b/core/kg/model/user.go
@@ -46,6 +46,11 @@
return nil
}
+func (u *User) Clone() *User {
+ user := *u
+ return &user
+}
+
func isValidID(value string) bool {
if len(value) != 26 {
return false
diff --git a/core/kg/store/memory/store.go b/core/kg/store/memory/store.go
new file mode 100644
index 0000000..d15dfbf
--- /dev/null
+++ b/core/kg/store/memory/store.go
@@ -0,0 +1,24 @@
+package memory
+
+import "github.com/giolekva/pcloud/core/kg/store"
+
+type MemoryStore struct {
+ stores memoryStoreStores
+}
+
+var _ store.Store = &MemoryStore{}
+
+type memoryStoreStores struct {
+ user store.UserStore
+}
+
+func New() *MemoryStore {
+ store := &MemoryStore{}
+ store.stores.user = newMemoryUserStore(store)
+
+ return store
+}
+
+func (ms *MemoryStore) User() store.UserStore {
+ return ms.stores.user
+}
diff --git a/core/kg/store/memory/user_store.go b/core/kg/store/memory/user_store.go
new file mode 100644
index 0000000..97bab6d
--- /dev/null
+++ b/core/kg/store/memory/user_store.go
@@ -0,0 +1,65 @@
+package memory
+
+import (
+ "errors"
+ "strconv"
+ "sync"
+ "time"
+
+ "github.com/giolekva/pcloud/core/kg/model"
+ "github.com/giolekva/pcloud/core/kg/store"
+)
+
+type memoryUserStore struct {
+ *MemoryStore
+
+ users map[string]*model.User
+ maxID int
+ mutex sync.RWMutex
+}
+
+var _ store.UserStore = &memoryUserStore{}
+
+func newMemoryUserStore(mStore *MemoryStore) store.UserStore {
+ us := &memoryUserStore{
+ MemoryStore: mStore,
+ users: map[string]*model.User{},
+ maxID: 1,
+ }
+ return us
+}
+
+func (us *memoryUserStore) Save(user *model.User) (*model.User, error) {
+ us.mutex.Lock()
+ us.mutex.Unlock()
+ if user.ID == "" {
+ user.ID = strconv.Itoa(us.maxID)
+ us.maxID++
+ user.CreateAt = time.Now().Unix()
+ user.DeleteAt = 0
+ } else {
+ user.UpdateAt = time.Now().Unix()
+ }
+ us.users[user.ID] = user
+ return user, nil
+}
+
+func (us *memoryUserStore) Get(id string) (*model.User, error) {
+ us.mutex.RLock()
+ us.mutex.RUnlock()
+ user, ok := us.users[id]
+ if !ok {
+ return nil, errors.New("User not found")
+ }
+ return user.Clone(), nil
+}
+
+func (us *memoryUserStore) GetAll() ([]*model.User, error) {
+ us.mutex.RLock()
+ us.mutex.RUnlock()
+ users := make([]*model.User, 0, len(us.users))
+ for _, user := range us.users {
+ users = append(users, user.Clone())
+ }
+ return users, nil
+}