diff options
author | Joram Wilander <jwawilander@gmail.com> | 2017-11-27 17:23:35 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-27 17:23:35 -0500 |
commit | 6176bcff6977bda71f4fde10a52dde6d7d7ceb9a (patch) | |
tree | b4a4a22879f4b88ffc4fb59f46ca69d441569ddd /plugin/rpcplugin | |
parent | e85ec3830164ffdfbe8fd5696ab99446b38a01ef (diff) | |
download | chat-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.go | 85 | ||||
-rw-r--r-- | plugin/rpcplugin/api_test.go | 18 |
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) }) } |