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
+}