summaryrefslogtreecommitdiffstats
path: root/plugin/rpcplugin/api.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/rpcplugin/api.go')
-rw-r--r--plugin/rpcplugin/api.go85
1 files changed, 80 insertions, 5 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
}