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 }