github.com/coincircle/mattermost-server@v4.8.1-0.20180321182714-9d701c704416+incompatible/plugin/rpcplugin/api.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package rpcplugin
     5  
     6  import (
     7  	"encoding/gob"
     8  	"encoding/json"
     9  	"io"
    10  	"net/http"
    11  	"net/rpc"
    12  
    13  	"github.com/mattermost/mattermost-server/model"
    14  	"github.com/mattermost/mattermost-server/plugin"
    15  )
    16  
    17  type LocalAPI struct {
    18  	api   plugin.API
    19  	muxer *Muxer
    20  }
    21  
    22  func (api *LocalAPI) LoadPluginConfiguration(args struct{}, reply *[]byte) error {
    23  	var config interface{}
    24  	if err := api.api.LoadPluginConfiguration(&config); err != nil {
    25  		return err
    26  	}
    27  	b, err := json.Marshal(config)
    28  	if err != nil {
    29  		return err
    30  	}
    31  	*reply = b
    32  	return nil
    33  }
    34  
    35  func (api *LocalAPI) RegisterCommand(args *model.Command, reply *APITeamReply) error {
    36  	return api.api.RegisterCommand(args)
    37  }
    38  
    39  func (api *LocalAPI) UnregisterCommand(args *APIUnregisterCommandArgs, reply *APITeamReply) error {
    40  	return api.api.UnregisterCommand(args.TeamId, args.Trigger)
    41  }
    42  
    43  type APIErrorReply struct {
    44  	Error *model.AppError
    45  }
    46  
    47  type APITeamReply struct {
    48  	Team  *model.Team
    49  	Error *model.AppError
    50  }
    51  
    52  func (api *LocalAPI) CreateTeam(args *model.Team, reply *APITeamReply) error {
    53  	team, err := api.api.CreateTeam(args)
    54  	*reply = APITeamReply{
    55  		Team:  team,
    56  		Error: err,
    57  	}
    58  	return nil
    59  }
    60  
    61  func (api *LocalAPI) DeleteTeam(args string, reply *APIErrorReply) error {
    62  	*reply = APIErrorReply{
    63  		Error: api.api.DeleteTeam(args),
    64  	}
    65  	return nil
    66  }
    67  
    68  func (api *LocalAPI) GetTeam(args string, reply *APITeamReply) error {
    69  	team, err := api.api.GetTeam(args)
    70  	*reply = APITeamReply{
    71  		Team:  team,
    72  		Error: err,
    73  	}
    74  	return nil
    75  }
    76  
    77  func (api *LocalAPI) GetTeamByName(args string, reply *APITeamReply) error {
    78  	team, err := api.api.GetTeamByName(args)
    79  	*reply = APITeamReply{
    80  		Team:  team,
    81  		Error: err,
    82  	}
    83  	return nil
    84  }
    85  
    86  func (api *LocalAPI) UpdateTeam(args *model.Team, reply *APITeamReply) error {
    87  	team, err := api.api.UpdateTeam(args)
    88  	*reply = APITeamReply{
    89  		Team:  team,
    90  		Error: err,
    91  	}
    92  	return nil
    93  }
    94  
    95  type APIUserReply struct {
    96  	User  *model.User
    97  	Error *model.AppError
    98  }
    99  
   100  func (api *LocalAPI) CreateUser(args *model.User, reply *APIUserReply) error {
   101  	user, err := api.api.CreateUser(args)
   102  	*reply = APIUserReply{
   103  		User:  user,
   104  		Error: err,
   105  	}
   106  	return nil
   107  }
   108  
   109  func (api *LocalAPI) DeleteUser(args string, reply *APIErrorReply) error {
   110  	*reply = APIErrorReply{
   111  		Error: api.api.DeleteUser(args),
   112  	}
   113  	return nil
   114  }
   115  
   116  func (api *LocalAPI) GetUser(args string, reply *APIUserReply) error {
   117  	user, err := api.api.GetUser(args)
   118  	*reply = APIUserReply{
   119  		User:  user,
   120  		Error: err,
   121  	}
   122  	return nil
   123  }
   124  
   125  func (api *LocalAPI) GetUserByEmail(args string, reply *APIUserReply) error {
   126  	user, err := api.api.GetUserByEmail(args)
   127  	*reply = APIUserReply{
   128  		User:  user,
   129  		Error: err,
   130  	}
   131  	return nil
   132  }
   133  
   134  func (api *LocalAPI) GetUserByUsername(args string, reply *APIUserReply) error {
   135  	user, err := api.api.GetUserByUsername(args)
   136  	*reply = APIUserReply{
   137  		User:  user,
   138  		Error: err,
   139  	}
   140  	return nil
   141  }
   142  
   143  func (api *LocalAPI) UpdateUser(args *model.User, reply *APIUserReply) error {
   144  	user, err := api.api.UpdateUser(args)
   145  	*reply = APIUserReply{
   146  		User:  user,
   147  		Error: err,
   148  	}
   149  	return nil
   150  }
   151  
   152  type APIGetChannelByNameArgs struct {
   153  	Name   string
   154  	TeamId string
   155  }
   156  
   157  type APIGetDirectChannelArgs struct {
   158  	UserId1 string
   159  	UserId2 string
   160  }
   161  
   162  type APIGetGroupChannelArgs struct {
   163  	UserIds []string
   164  }
   165  
   166  type APIGetChannelMemberArgs struct {
   167  	ChannelId string
   168  	UserId    string
   169  }
   170  
   171  type APIChannelReply struct {
   172  	Channel *model.Channel
   173  	Error   *model.AppError
   174  }
   175  
   176  type APIChannelMemberReply struct {
   177  	ChannelMember *model.ChannelMember
   178  	Error         *model.AppError
   179  }
   180  
   181  func (api *LocalAPI) CreateChannel(args *model.Channel, reply *APIChannelReply) error {
   182  	channel, err := api.api.CreateChannel(args)
   183  	*reply = APIChannelReply{
   184  		Channel: channel,
   185  		Error:   err,
   186  	}
   187  	return nil
   188  }
   189  
   190  func (api *LocalAPI) DeleteChannel(args string, reply *APIErrorReply) error {
   191  	*reply = APIErrorReply{
   192  		Error: api.api.DeleteChannel(args),
   193  	}
   194  	return nil
   195  }
   196  
   197  func (api *LocalAPI) GetChannel(args string, reply *APIChannelReply) error {
   198  	channel, err := api.api.GetChannel(args)
   199  	*reply = APIChannelReply{
   200  		Channel: channel,
   201  		Error:   err,
   202  	}
   203  	return nil
   204  }
   205  
   206  func (api *LocalAPI) GetChannelByName(args *APIGetChannelByNameArgs, reply *APIChannelReply) error {
   207  	channel, err := api.api.GetChannelByName(args.Name, args.TeamId)
   208  	*reply = APIChannelReply{
   209  		Channel: channel,
   210  		Error:   err,
   211  	}
   212  	return nil
   213  }
   214  
   215  func (api *LocalAPI) GetDirectChannel(args *APIGetDirectChannelArgs, reply *APIChannelReply) error {
   216  	channel, err := api.api.GetDirectChannel(args.UserId1, args.UserId2)
   217  	*reply = APIChannelReply{
   218  		Channel: channel,
   219  		Error:   err,
   220  	}
   221  	return nil
   222  }
   223  
   224  func (api *LocalAPI) GetGroupChannel(args *APIGetGroupChannelArgs, reply *APIChannelReply) error {
   225  	channel, err := api.api.GetGroupChannel(args.UserIds)
   226  	*reply = APIChannelReply{
   227  		Channel: channel,
   228  		Error:   err,
   229  	}
   230  	return nil
   231  }
   232  
   233  func (api *LocalAPI) UpdateChannel(args *model.Channel, reply *APIChannelReply) error {
   234  	channel, err := api.api.UpdateChannel(args)
   235  	*reply = APIChannelReply{
   236  		Channel: channel,
   237  		Error:   err,
   238  	}
   239  	return nil
   240  }
   241  
   242  func (api *LocalAPI) GetChannelMember(args *APIGetChannelMemberArgs, reply *APIChannelMemberReply) error {
   243  	member, err := api.api.GetChannelMember(args.ChannelId, args.UserId)
   244  	*reply = APIChannelMemberReply{
   245  		ChannelMember: member,
   246  		Error:         err,
   247  	}
   248  	return nil
   249  }
   250  
   251  type APIPostReply struct {
   252  	Post  *model.Post
   253  	Error *model.AppError
   254  }
   255  
   256  func (api *LocalAPI) CreatePost(args *model.Post, reply *APIPostReply) error {
   257  	post, err := api.api.CreatePost(args)
   258  	*reply = APIPostReply{
   259  		Post:  post,
   260  		Error: err,
   261  	}
   262  	return nil
   263  }
   264  
   265  func (api *LocalAPI) DeletePost(args string, reply *APIErrorReply) error {
   266  	*reply = APIErrorReply{
   267  		Error: api.api.DeletePost(args),
   268  	}
   269  	return nil
   270  }
   271  
   272  func (api *LocalAPI) GetPost(args string, reply *APIPostReply) error {
   273  	post, err := api.api.GetPost(args)
   274  	*reply = APIPostReply{
   275  		Post:  post,
   276  		Error: err,
   277  	}
   278  	return nil
   279  }
   280  
   281  func (api *LocalAPI) UpdatePost(args *model.Post, reply *APIPostReply) error {
   282  	post, err := api.api.UpdatePost(args)
   283  	*reply = APIPostReply{
   284  		Post:  post,
   285  		Error: err,
   286  	}
   287  	return nil
   288  }
   289  
   290  type APIKeyValueStoreReply struct {
   291  	Value []byte
   292  	Error *model.AppError
   293  }
   294  
   295  type APIKeyValueStoreSetArgs struct {
   296  	Key   string
   297  	Value []byte
   298  }
   299  
   300  func (api *LocalAPI) KeyValueStoreSet(args *APIKeyValueStoreSetArgs, reply *APIErrorReply) error {
   301  	err := api.api.KeyValueStore().Set(args.Key, args.Value)
   302  	*reply = APIErrorReply{
   303  		Error: err,
   304  	}
   305  	return nil
   306  }
   307  
   308  func (api *LocalAPI) KeyValueStoreGet(args string, reply *APIKeyValueStoreReply) error {
   309  	v, err := api.api.KeyValueStore().Get(args)
   310  	*reply = APIKeyValueStoreReply{
   311  		Value: v,
   312  		Error: err,
   313  	}
   314  	return nil
   315  }
   316  
   317  func (api *LocalAPI) KeyValueStoreDelete(args string, reply *APIErrorReply) error {
   318  	err := api.api.KeyValueStore().Delete(args)
   319  	*reply = APIErrorReply{
   320  		Error: err,
   321  	}
   322  	return nil
   323  }
   324  
   325  func ServeAPI(api plugin.API, conn io.ReadWriteCloser, muxer *Muxer) {
   326  	server := rpc.NewServer()
   327  	server.Register(&LocalAPI{
   328  		api:   api,
   329  		muxer: muxer,
   330  	})
   331  	server.ServeConn(conn)
   332  }
   333  
   334  type RemoteAPI struct {
   335  	client        *rpc.Client
   336  	muxer         *Muxer
   337  	keyValueStore *RemoteKeyValueStore
   338  }
   339  
   340  type RemoteKeyValueStore struct {
   341  	api *RemoteAPI
   342  }
   343  
   344  var _ plugin.API = (*RemoteAPI)(nil)
   345  var _ plugin.KeyValueStore = (*RemoteKeyValueStore)(nil)
   346  
   347  func (api *RemoteAPI) LoadPluginConfiguration(dest interface{}) error {
   348  	var config []byte
   349  	if err := api.client.Call("LocalAPI.LoadPluginConfiguration", struct{}{}, &config); err != nil {
   350  		return err
   351  	}
   352  	return json.Unmarshal(config, dest)
   353  }
   354  
   355  func (api *RemoteAPI) RegisterCommand(command *model.Command) error {
   356  	return api.client.Call("LocalAPI.RegisterCommand", command, nil)
   357  }
   358  
   359  type APIUnregisterCommandArgs struct {
   360  	TeamId  string
   361  	Trigger string
   362  }
   363  
   364  func (api *RemoteAPI) UnregisterCommand(teamId, trigger string) error {
   365  	return api.client.Call("LocalAPI.UnregisterCommand", &APIUnregisterCommandArgs{
   366  		TeamId:  teamId,
   367  		Trigger: trigger,
   368  	}, nil)
   369  }
   370  
   371  func (api *RemoteAPI) CreateUser(user *model.User) (*model.User, *model.AppError) {
   372  	var reply APIUserReply
   373  	if err := api.client.Call("LocalAPI.CreateUser", user, &reply); err != nil {
   374  		return nil, model.NewAppError("RemoteAPI.CreateUser", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   375  	}
   376  	return reply.User, reply.Error
   377  }
   378  
   379  func (api *RemoteAPI) DeleteUser(userId string) *model.AppError {
   380  	var reply APIErrorReply
   381  	if err := api.client.Call("LocalAPI.DeleteUser", userId, &reply); err != nil {
   382  		return model.NewAppError("RemoteAPI.DeleteUser", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   383  	}
   384  	return reply.Error
   385  }
   386  
   387  func (api *RemoteAPI) GetUser(userId string) (*model.User, *model.AppError) {
   388  	var reply APIUserReply
   389  	if err := api.client.Call("LocalAPI.GetUser", userId, &reply); err != nil {
   390  		return nil, model.NewAppError("RemoteAPI.GetUser", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   391  	}
   392  	return reply.User, reply.Error
   393  }
   394  
   395  func (api *RemoteAPI) GetUserByEmail(email string) (*model.User, *model.AppError) {
   396  	var reply APIUserReply
   397  	if err := api.client.Call("LocalAPI.GetUserByEmail", email, &reply); err != nil {
   398  		return nil, model.NewAppError("RemoteAPI.GetUserByEmail", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   399  	}
   400  	return reply.User, reply.Error
   401  }
   402  
   403  func (api *RemoteAPI) GetUserByUsername(name string) (*model.User, *model.AppError) {
   404  	var reply APIUserReply
   405  	if err := api.client.Call("LocalAPI.GetUserByUsername", name, &reply); err != nil {
   406  		return nil, model.NewAppError("RemoteAPI.GetUserByUsername", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   407  	}
   408  	return reply.User, reply.Error
   409  }
   410  
   411  func (api *RemoteAPI) UpdateUser(user *model.User) (*model.User, *model.AppError) {
   412  	var reply APIUserReply
   413  	if err := api.client.Call("LocalAPI.UpdateUser", user, &reply); err != nil {
   414  		return nil, model.NewAppError("RemoteAPI.UpdateUser", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   415  	}
   416  	return reply.User, reply.Error
   417  }
   418  
   419  func (api *RemoteAPI) CreateTeam(team *model.Team) (*model.Team, *model.AppError) {
   420  	var reply APITeamReply
   421  	if err := api.client.Call("LocalAPI.CreateTeam", team, &reply); err != nil {
   422  		return nil, model.NewAppError("RemoteAPI.CreateTeam", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   423  	}
   424  	return reply.Team, reply.Error
   425  }
   426  
   427  func (api *RemoteAPI) DeleteTeam(teamId string) *model.AppError {
   428  	var reply APIErrorReply
   429  	if err := api.client.Call("LocalAPI.DeleteTeam", teamId, &reply); err != nil {
   430  		return model.NewAppError("RemoteAPI.DeleteTeam", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   431  	}
   432  	return reply.Error
   433  }
   434  
   435  func (api *RemoteAPI) GetTeam(teamId string) (*model.Team, *model.AppError) {
   436  	var reply APITeamReply
   437  	if err := api.client.Call("LocalAPI.GetTeam", teamId, &reply); err != nil {
   438  		return nil, model.NewAppError("RemoteAPI.GetTeam", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   439  	}
   440  	return reply.Team, reply.Error
   441  }
   442  
   443  func (api *RemoteAPI) GetTeamByName(name string) (*model.Team, *model.AppError) {
   444  	var reply APITeamReply
   445  	if err := api.client.Call("LocalAPI.GetTeamByName", name, &reply); err != nil {
   446  		return nil, model.NewAppError("RemoteAPI.GetTeamByName", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   447  	}
   448  	return reply.Team, reply.Error
   449  }
   450  
   451  func (api *RemoteAPI) UpdateTeam(team *model.Team) (*model.Team, *model.AppError) {
   452  	var reply APITeamReply
   453  	if err := api.client.Call("LocalAPI.UpdateTeam", team, &reply); err != nil {
   454  		return nil, model.NewAppError("RemoteAPI.UpdateTeam", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   455  	}
   456  	return reply.Team, reply.Error
   457  }
   458  
   459  func (api *RemoteAPI) CreateChannel(channel *model.Channel) (*model.Channel, *model.AppError) {
   460  	var reply APIChannelReply
   461  	if err := api.client.Call("LocalAPI.CreateChannel", channel, &reply); err != nil {
   462  		return nil, model.NewAppError("RemoteAPI.CreateChannel", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   463  	}
   464  	return reply.Channel, reply.Error
   465  }
   466  
   467  func (api *RemoteAPI) DeleteChannel(channelId string) *model.AppError {
   468  	var reply APIErrorReply
   469  	if err := api.client.Call("LocalAPI.DeleteChannel", channelId, &reply); err != nil {
   470  		return model.NewAppError("RemoteAPI.DeleteChannel", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   471  	}
   472  	return reply.Error
   473  }
   474  
   475  func (api *RemoteAPI) GetChannel(channelId string) (*model.Channel, *model.AppError) {
   476  	var reply APIChannelReply
   477  	if err := api.client.Call("LocalAPI.GetChannel", channelId, &reply); err != nil {
   478  		return nil, model.NewAppError("RemoteAPI.GetChannel", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   479  	}
   480  	return reply.Channel, reply.Error
   481  }
   482  
   483  func (api *RemoteAPI) GetChannelByName(name, teamId string) (*model.Channel, *model.AppError) {
   484  	var reply APIChannelReply
   485  	if err := api.client.Call("LocalAPI.GetChannelByName", &APIGetChannelByNameArgs{
   486  		Name:   name,
   487  		TeamId: teamId,
   488  	}, &reply); err != nil {
   489  		return nil, model.NewAppError("RemoteAPI.GetChannelByName", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   490  	}
   491  	return reply.Channel, reply.Error
   492  }
   493  
   494  func (api *RemoteAPI) GetDirectChannel(userId1, userId2 string) (*model.Channel, *model.AppError) {
   495  	var reply APIChannelReply
   496  	if err := api.client.Call("LocalAPI.GetDirectChannel", &APIGetDirectChannelArgs{
   497  		UserId1: userId1,
   498  		UserId2: userId2,
   499  	}, &reply); err != nil {
   500  		return nil, model.NewAppError("RemoteAPI.GetDirectChannel", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   501  	}
   502  	return reply.Channel, reply.Error
   503  }
   504  
   505  func (api *RemoteAPI) GetGroupChannel(userIds []string) (*model.Channel, *model.AppError) {
   506  	var reply APIChannelReply
   507  	if err := api.client.Call("LocalAPI.GetGroupChannel", &APIGetGroupChannelArgs{
   508  		UserIds: userIds,
   509  	}, &reply); err != nil {
   510  		return nil, model.NewAppError("RemoteAPI.GetGroupChannel", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   511  	}
   512  	return reply.Channel, reply.Error
   513  }
   514  
   515  func (api *RemoteAPI) UpdateChannel(channel *model.Channel) (*model.Channel, *model.AppError) {
   516  	var reply APIChannelReply
   517  	if err := api.client.Call("LocalAPI.UpdateChannel", channel, &reply); err != nil {
   518  		return nil, model.NewAppError("RemoteAPI.UpdateChannel", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   519  	}
   520  	return reply.Channel, reply.Error
   521  }
   522  
   523  func (api *RemoteAPI) GetChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError) {
   524  	var reply APIChannelMemberReply
   525  	if err := api.client.Call("LocalAPI.GetChannelMember", &APIGetChannelMemberArgs{
   526  		ChannelId: channelId,
   527  		UserId:    userId,
   528  	}, &reply); err != nil {
   529  		return nil, model.NewAppError("RemoteAPI.GetChannelMember", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   530  	}
   531  	return reply.ChannelMember, reply.Error
   532  }
   533  
   534  func (api *RemoteAPI) CreatePost(post *model.Post) (*model.Post, *model.AppError) {
   535  	var reply APIPostReply
   536  	if err := api.client.Call("LocalAPI.CreatePost", post, &reply); err != nil {
   537  		return nil, model.NewAppError("RemoteAPI.CreatePost", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   538  	}
   539  	return reply.Post, reply.Error
   540  }
   541  
   542  func (api *RemoteAPI) DeletePost(postId string) *model.AppError {
   543  	var reply APIErrorReply
   544  	if err := api.client.Call("LocalAPI.DeletePost", postId, &reply); err != nil {
   545  		return model.NewAppError("RemoteAPI.DeletePost", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   546  	}
   547  	return reply.Error
   548  }
   549  
   550  func (api *RemoteAPI) GetPost(postId string) (*model.Post, *model.AppError) {
   551  	var reply APIPostReply
   552  	if err := api.client.Call("LocalAPI.GetPost", postId, &reply); err != nil {
   553  		return nil, model.NewAppError("RemoteAPI.GetPost", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   554  	}
   555  	return reply.Post, reply.Error
   556  }
   557  
   558  func (api *RemoteAPI) UpdatePost(post *model.Post) (*model.Post, *model.AppError) {
   559  	var reply APIPostReply
   560  	if err := api.client.Call("LocalAPI.UpdatePost", post, &reply); err != nil {
   561  		return nil, model.NewAppError("RemoteAPI.UpdatePost", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   562  	}
   563  	return reply.Post, reply.Error
   564  }
   565  
   566  func (api *RemoteAPI) KeyValueStore() plugin.KeyValueStore {
   567  	return api.keyValueStore
   568  }
   569  
   570  func (s *RemoteKeyValueStore) Set(key string, value []byte) *model.AppError {
   571  	var reply APIErrorReply
   572  	if err := s.api.client.Call("LocalAPI.KeyValueStoreSet", &APIKeyValueStoreSetArgs{Key: key, Value: value}, &reply); err != nil {
   573  		return model.NewAppError("RemoteAPI.KeyValueStoreSet", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   574  	}
   575  	return reply.Error
   576  }
   577  
   578  func (s *RemoteKeyValueStore) Get(key string) ([]byte, *model.AppError) {
   579  	var reply APIKeyValueStoreReply
   580  	if err := s.api.client.Call("LocalAPI.KeyValueStoreGet", key, &reply); err != nil {
   581  		return nil, model.NewAppError("RemoteAPI.KeyValueStoreGet", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   582  	}
   583  	return reply.Value, reply.Error
   584  }
   585  
   586  func (s *RemoteKeyValueStore) Delete(key string) *model.AppError {
   587  	var reply APIErrorReply
   588  	if err := s.api.client.Call("LocalAPI.KeyValueStoreDelete", key, &reply); err != nil {
   589  		return model.NewAppError("RemoteAPI.KeyValueStoreDelete", "plugin.rpcplugin.invocation.error", nil, "err="+err.Error(), http.StatusInternalServerError)
   590  	}
   591  	return reply.Error
   592  }
   593  
   594  func (h *RemoteAPI) Close() error {
   595  	return h.client.Close()
   596  }
   597  
   598  func ConnectAPI(conn io.ReadWriteCloser, muxer *Muxer) *RemoteAPI {
   599  	remoteKeyValueStore := &RemoteKeyValueStore{}
   600  	remoteApi := &RemoteAPI{
   601  		client:        rpc.NewClient(conn),
   602  		muxer:         muxer,
   603  		keyValueStore: remoteKeyValueStore,
   604  	}
   605  
   606  	remoteKeyValueStore.api = remoteApi
   607  
   608  	return remoteApi
   609  }
   610  
   611  func init() {
   612  	gob.Register([]*model.SlackAttachment{})
   613  	gob.Register([]interface{}{})
   614  	gob.Register(map[string]interface{}{})
   615  }