summaryrefslogtreecommitdiffstats
path: root/plugin/rpcplugin
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2017-11-27 17:23:35 -0500
committerGitHub <noreply@github.com>2017-11-27 17:23:35 -0500
commit6176bcff6977bda71f4fde10a52dde6d7d7ceb9a (patch)
treeb4a4a22879f4b88ffc4fb59f46ca69d441569ddd /plugin/rpcplugin
parente85ec3830164ffdfbe8fd5696ab99446b38a01ef (diff)
downloadchat-6176bcff6977bda71f4fde10a52dde6d7d7ceb9a.tar.gz
chat-6176bcff6977bda71f4fde10a52dde6d7d7ceb9a.tar.bz2
chat-6176bcff6977bda71f4fde10a52dde6d7d7ceb9a.zip
PLT-8131 (part2) Add plugin key value store support (#7902)
* Add plugin key value store support * Add localization strings * Updates per feedback
Diffstat (limited to 'plugin/rpcplugin')
-rw-r--r--plugin/rpcplugin/api.go85
-rw-r--r--plugin/rpcplugin/api_test.go18
2 files changed, 97 insertions, 6 deletions
diff --git a/plugin/rpcplugin/api.go b/plugin/rpcplugin/api.go
index 98333b1d9..f2068e815 100644
--- a/plugin/rpcplugin/api.go
+++ b/plugin/rpcplugin/api.go
@@ -259,6 +259,41 @@ func (api *LocalAPI) UpdatePost(args *model.Post, reply *APIPostReply) error {
return nil
}
+type APIKeyValueStoreReply struct {
+ Value []byte
+ Error *model.AppError
+}
+
+type APIKeyValueStoreSetArgs struct {
+ Key string
+ Value []byte
+}
+
+func (api *LocalAPI) KeyValueStoreSet(args *APIKeyValueStoreSetArgs, reply *APIErrorReply) error {
+ err := api.api.KeyValueStore().Set(args.Key, args.Value)
+ *reply = APIErrorReply{
+ Error: err,
+ }
+ return nil
+}
+
+func (api *LocalAPI) KeyValueStoreGet(args string, reply *APIKeyValueStoreReply) error {
+ v, err := api.api.KeyValueStore().Get(args)
+ *reply = APIKeyValueStoreReply{
+ Value: v,
+ Error: err,
+ }
+ return nil
+}
+
+func (api *LocalAPI) KeyValueStoreDelete(args string, reply *APIErrorReply) error {
+ err := api.api.KeyValueStore().Delete(args)
+ *reply = APIErrorReply{
+ Error: err,
+ }
+ return nil
+}
+
func ServeAPI(api plugin.API, conn io.ReadWriteCloser, muxer *Muxer) {
server := rpc.NewServer()
server.Register(&LocalAPI{
@@ -269,11 +304,17 @@ func ServeAPI(api plugin.API, conn io.ReadWriteCloser, muxer *Muxer) {
}
type RemoteAPI struct {
- client *rpc.Client
- muxer *Muxer
+ client *rpc.Client
+ muxer *Muxer
+ keyValueStore *RemoteKeyValueStore
+}
+
+type RemoteKeyValueStore struct {
+ api *RemoteAPI
}
var _ plugin.API = (*RemoteAPI)(nil)
+var _ plugin.KeyValueStore = (*RemoteKeyValueStore)(nil)
func (api *RemoteAPI) LoadPluginConfiguration(dest interface{}) error {
var config []byte
@@ -467,13 +508,47 @@ func (api *RemoteAPI) UpdatePost(post *model.Post) (*model.Post, *model.AppError
return reply.Post, reply.Error
}
+func (api *RemoteAPI) KeyValueStore() plugin.KeyValueStore {
+ return api.keyValueStore
+}
+
+func (s *RemoteKeyValueStore) Set(key string, value []byte) *model.AppError {
+ var reply APIErrorReply
+ if err := s.api.client.Call("LocalAPI.KeyValueStoreSet", &APIKeyValueStoreSetArgs{Key: key, Value: value}, &reply); err != nil {
+ return model.NewAppError("RemoteAPI.KeyValueStoreSet", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
+ }
+ return reply.Error
+}
+
+func (s *RemoteKeyValueStore) Get(key string) ([]byte, *model.AppError) {
+ var reply APIKeyValueStoreReply
+ if err := s.api.client.Call("LocalAPI.KeyValueStoreGet", key, &reply); err != nil {
+ return nil, model.NewAppError("RemoteAPI.KeyValueStoreGet", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
+ }
+ return reply.Value, reply.Error
+}
+
+func (s *RemoteKeyValueStore) Delete(key string) *model.AppError {
+ var reply APIErrorReply
+ if err := s.api.client.Call("LocalAPI.KeyValueStoreDelete", key, &reply); err != nil {
+ return model.NewAppError("RemoteAPI.KeyValueStoreDelete", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
+ }
+ return reply.Error
+}
+
func (h *RemoteAPI) Close() error {
return h.client.Close()
}
func ConnectAPI(conn io.ReadWriteCloser, muxer *Muxer) *RemoteAPI {
- return &RemoteAPI{
- client: rpc.NewClient(conn),
- muxer: muxer,
+ remoteKeyValueStore := &RemoteKeyValueStore{}
+ remoteApi := &RemoteAPI{
+ client: rpc.NewClient(conn),
+ muxer: muxer,
+ keyValueStore: remoteKeyValueStore,
}
+
+ remoteKeyValueStore.api = remoteApi
+
+ return remoteApi
}
diff --git a/plugin/rpcplugin/api_test.go b/plugin/rpcplugin/api_test.go
index 080f2825f..0c7321162 100644
--- a/plugin/rpcplugin/api_test.go
+++ b/plugin/rpcplugin/api_test.go
@@ -34,7 +34,8 @@ func testAPIRPC(api plugin.API, f func(plugin.API)) {
}
func TestAPI(t *testing.T) {
- var api plugintest.API
+ keyValueStore := &plugintest.KeyValueStore{}
+ api := plugintest.API{Store: keyValueStore}
defer api.AssertExpectations(t)
type Config struct {
@@ -199,5 +200,20 @@ func TestAPI(t *testing.T) {
post, err = remote.UpdatePost(testPost)
assert.Equal(t, testPost, post)
assert.Nil(t, err)
+
+ api.KeyValueStore().(*plugintest.KeyValueStore).On("Set", "thekey", []byte("thevalue")).Return(nil).Once()
+ err = remote.KeyValueStore().Set("thekey", []byte("thevalue"))
+ assert.Nil(t, err)
+
+ api.KeyValueStore().(*plugintest.KeyValueStore).On("Get", "thekey").Return(func(key string) ([]byte, *model.AppError) {
+ return []byte("thevalue"), nil
+ }).Once()
+ ret, err := remote.KeyValueStore().Get("thekey")
+ assert.Nil(t, err)
+ assert.Equal(t, []byte("thevalue"), ret)
+
+ api.KeyValueStore().(*plugintest.KeyValueStore).On("Delete", "thekey").Return(nil).Once()
+ err = remote.KeyValueStore().Delete("thekey")
+ assert.Nil(t, err)
})
}