github.com/mad-app/mattermost-server@v5.11.1+incompatible/api4/group.go (about) 1 // Copyright (c) 2018-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package api4 5 6 import ( 7 "database/sql" 8 "encoding/json" 9 "fmt" 10 "io/ioutil" 11 "net/http" 12 13 "github.com/mattermost/mattermost-server/model" 14 ) 15 16 const ( 17 groupMemberActionCreate = iota 18 groupMemberActionDelete 19 ) 20 21 func (api *API) InitGroup() { 22 // GET /api/v4/groups/:group_id 23 api.BaseRoutes.Groups.Handle("/{group_id:[A-Za-z0-9]+}", 24 api.ApiSessionRequired(getGroup)).Methods("GET") 25 26 // PUT /api/v4/groups/:group_id/patch 27 api.BaseRoutes.Groups.Handle("/{group_id:[A-Za-z0-9]+}/patch", 28 api.ApiSessionRequired(patchGroup)).Methods("PUT") 29 30 // POST /api/v4/groups/:group_id/teams/:team_id/link 31 // POST /api/v4/groups/:group_id/channels/:channel_id/link 32 api.BaseRoutes.Groups.Handle("/{group_id:[A-Za-z0-9]+}/{syncable_type:teams|channels}/{syncable_id:[A-Za-z0-9]+}/link", 33 api.ApiSessionRequired(linkGroupSyncable)).Methods("POST") 34 35 // DELETE /api/v4/groups/:group_id/teams/:team_id/link 36 // DELETE /api/v4/groups/:group_id/channels/:channel_id/link 37 api.BaseRoutes.Groups.Handle("/{group_id:[A-Za-z0-9]+}/{syncable_type:teams|channels}/{syncable_id:[A-Za-z0-9]+}/link", 38 api.ApiSessionRequired(unlinkGroupSyncable)).Methods("DELETE") 39 40 // GET /api/v4/groups/:group_id/teams/:team_id 41 // GET /api/v4/groups/:group_id/channels/:channel_id 42 api.BaseRoutes.Groups.Handle("/{group_id:[A-Za-z0-9]+}/{syncable_type:teams|channels}/{syncable_id:[A-Za-z0-9]+}", 43 api.ApiSessionRequired(getGroupSyncable)).Methods("GET") 44 45 // GET /api/v4/groups/:group_id/teams 46 // GET /api/v4/groups/:group_id/channels 47 api.BaseRoutes.Groups.Handle("/{group_id:[A-Za-z0-9]+}/{syncable_type:teams|channels}", 48 api.ApiSessionRequired(getGroupSyncables)).Methods("GET") 49 50 // PUT /api/v4/groups/:group_id/teams/:team_id/patch 51 // PUT /api/v4/groups/:group_id/channels/:channel_id/patch 52 api.BaseRoutes.Groups.Handle("/{group_id:[A-Za-z0-9]+}/{syncable_type:teams|channels}/{syncable_id:[A-Za-z0-9]+}/patch", 53 api.ApiSessionRequired(patchGroupSyncable)).Methods("PUT") 54 55 // GET /api/v4/groups/:group_id/members?page=0&per_page=100 56 api.BaseRoutes.Groups.Handle("/{group_id:[A-Za-z0-9]+}/members", 57 api.ApiSessionRequired(getGroupMembers)).Methods("GET") 58 } 59 60 func getGroup(c *Context, w http.ResponseWriter, r *http.Request) { 61 c.RequireGroupId() 62 if c.Err != nil { 63 return 64 } 65 66 if c.App.License() == nil || !*c.App.License().Features.LDAPGroups { 67 c.Err = model.NewAppError("Api4.getGroup", "api.ldap_groups.license_error", nil, "", http.StatusNotImplemented) 68 return 69 } 70 71 if !c.App.SessionHasPermissionTo(c.App.Session, model.PERMISSION_MANAGE_SYSTEM) { 72 c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) 73 return 74 } 75 76 group, err := c.App.GetGroup(c.Params.GroupId) 77 if err != nil { 78 c.Err = err 79 return 80 } 81 82 b, marshalErr := json.Marshal(group) 83 if marshalErr != nil { 84 c.Err = model.NewAppError("Api4.getGroup", "api.marshal_error", nil, marshalErr.Error(), http.StatusInternalServerError) 85 return 86 } 87 88 w.Write(b) 89 } 90 91 func patchGroup(c *Context, w http.ResponseWriter, r *http.Request) { 92 c.RequireGroupId() 93 if c.Err != nil { 94 return 95 } 96 97 groupPatch := model.GroupPatchFromJson(r.Body) 98 if groupPatch == nil { 99 c.SetInvalidParam("group") 100 return 101 } 102 103 if c.App.License() == nil || !*c.App.License().Features.LDAPGroups { 104 c.Err = model.NewAppError("Api4.patchGroup", "api.ldap_groups.license_error", nil, "", http.StatusNotImplemented) 105 return 106 } 107 108 if !c.App.SessionHasPermissionTo(c.App.Session, model.PERMISSION_MANAGE_SYSTEM) { 109 c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) 110 return 111 } 112 113 group, err := c.App.GetGroup(c.Params.GroupId) 114 if err != nil { 115 c.Err = err 116 return 117 } 118 119 group.Patch(groupPatch) 120 121 group, err = c.App.UpdateGroup(group) 122 if err != nil { 123 c.Err = err 124 return 125 } 126 127 b, marshalErr := json.Marshal(group) 128 if marshalErr != nil { 129 c.Err = model.NewAppError("Api4.patchGroup", "api.marshal_error", nil, marshalErr.Error(), http.StatusInternalServerError) 130 return 131 } 132 133 w.Write(b) 134 } 135 136 func linkGroupSyncable(c *Context, w http.ResponseWriter, r *http.Request) { 137 c.RequireGroupId() 138 if c.Err != nil { 139 return 140 } 141 142 c.RequireSyncableId() 143 if c.Err != nil { 144 return 145 } 146 syncableID := c.Params.SyncableId 147 148 c.RequireSyncableType() 149 if c.Err != nil { 150 return 151 } 152 syncableType := c.Params.SyncableType 153 154 body, err := ioutil.ReadAll(r.Body) 155 if err != nil { 156 c.Err = model.NewAppError("Api4.createGroupSyncable", "api.io_error", nil, err.Error(), http.StatusBadRequest) 157 return 158 } 159 160 var patch *model.GroupSyncablePatch 161 err = json.Unmarshal(body, &patch) 162 if err != nil || patch == nil { 163 c.SetInvalidParam(fmt.Sprintf("Group%s", syncableType.String())) 164 return 165 } 166 167 if c.App.License() == nil || !*c.App.License().Features.LDAPGroups { 168 c.Err = model.NewAppError("Api4.createGroupSyncable", "api.ldap_groups.license_error", nil, "", http.StatusNotImplemented) 169 return 170 } 171 172 if !c.App.SessionHasPermissionTo(c.App.Session, model.PERMISSION_MANAGE_SYSTEM) { 173 c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) 174 return 175 } 176 177 groupSyncable, appErr := c.App.GetGroupSyncable(c.Params.GroupId, syncableID, syncableType) 178 if appErr != nil && appErr.DetailedError != sql.ErrNoRows.Error() { 179 c.Err = appErr 180 return 181 } 182 183 if groupSyncable == nil { 184 groupSyncable = &model.GroupSyncable{ 185 GroupId: c.Params.GroupId, 186 SyncableId: syncableID, 187 Type: syncableType, 188 } 189 groupSyncable.Patch(patch) 190 groupSyncable, appErr = c.App.CreateGroupSyncable(groupSyncable) 191 if appErr != nil { 192 c.Err = appErr 193 return 194 } 195 } else { 196 groupSyncable.DeleteAt = 0 197 groupSyncable.Patch(patch) 198 groupSyncable, appErr = c.App.UpdateGroupSyncable(groupSyncable) 199 if appErr != nil { 200 c.Err = appErr 201 return 202 } 203 } 204 205 w.WriteHeader(http.StatusCreated) 206 207 b, marshalErr := json.Marshal(groupSyncable) 208 if marshalErr != nil { 209 c.Err = model.NewAppError("Api4.createGroupSyncable", "api.marshal_error", nil, marshalErr.Error(), http.StatusInternalServerError) 210 return 211 } 212 213 w.Write(b) 214 } 215 216 func getGroupSyncable(c *Context, w http.ResponseWriter, r *http.Request) { 217 c.RequireGroupId() 218 if c.Err != nil { 219 return 220 } 221 222 c.RequireSyncableId() 223 if c.Err != nil { 224 return 225 } 226 syncableID := c.Params.SyncableId 227 228 c.RequireSyncableType() 229 if c.Err != nil { 230 return 231 } 232 syncableType := c.Params.SyncableType 233 234 if c.App.License() == nil || !*c.App.License().Features.LDAPGroups { 235 c.Err = model.NewAppError("Api4.getGroupSyncable", "api.ldap_groups.license_error", nil, "", http.StatusNotImplemented) 236 return 237 } 238 239 if !c.App.SessionHasPermissionTo(c.App.Session, model.PERMISSION_MANAGE_SYSTEM) { 240 c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) 241 return 242 } 243 244 groupSyncable, err := c.App.GetGroupSyncable(c.Params.GroupId, syncableID, syncableType) 245 if err != nil { 246 c.Err = err 247 return 248 } 249 250 b, marshalErr := json.Marshal(groupSyncable) 251 if marshalErr != nil { 252 c.Err = model.NewAppError("Api4.getGroupSyncable", "api.marshal_error", nil, marshalErr.Error(), http.StatusInternalServerError) 253 return 254 } 255 256 w.Write(b) 257 } 258 259 func getGroupSyncables(c *Context, w http.ResponseWriter, r *http.Request) { 260 c.RequireGroupId() 261 if c.Err != nil { 262 return 263 } 264 265 c.RequireSyncableType() 266 if c.Err != nil { 267 return 268 } 269 syncableType := c.Params.SyncableType 270 271 if c.App.License() == nil || !*c.App.License().Features.LDAPGroups { 272 c.Err = model.NewAppError("Api4.getGroupSyncables", "api.ldap_groups.license_error", nil, "", http.StatusNotImplemented) 273 return 274 } 275 276 if !c.App.SessionHasPermissionTo(c.App.Session, model.PERMISSION_MANAGE_SYSTEM) { 277 c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) 278 return 279 } 280 281 groupSyncables, err := c.App.GetGroupSyncables(c.Params.GroupId, syncableType) 282 if err != nil { 283 c.Err = err 284 return 285 } 286 287 b, marshalErr := json.Marshal(groupSyncables) 288 if marshalErr != nil { 289 c.Err = model.NewAppError("Api4.getGroupSyncables", "api.marshal_error", nil, marshalErr.Error(), http.StatusInternalServerError) 290 return 291 } 292 293 w.Write(b) 294 } 295 296 func patchGroupSyncable(c *Context, w http.ResponseWriter, r *http.Request) { 297 c.RequireGroupId() 298 if c.Err != nil { 299 return 300 } 301 302 c.RequireSyncableId() 303 if c.Err != nil { 304 return 305 } 306 syncableID := c.Params.SyncableId 307 308 c.RequireSyncableType() 309 if c.Err != nil { 310 return 311 } 312 syncableType := c.Params.SyncableType 313 314 body, err := ioutil.ReadAll(r.Body) 315 if err != nil { 316 c.Err = model.NewAppError("Api4.patchGroupSyncable", "api.io_error", nil, err.Error(), http.StatusBadRequest) 317 return 318 } 319 320 var patch *model.GroupSyncablePatch 321 err = json.Unmarshal(body, &patch) 322 if err != nil || patch == nil { 323 c.SetInvalidParam(fmt.Sprintf("Group[%s]Patch", syncableType.String())) 324 return 325 } 326 327 if c.App.License() == nil || !*c.App.License().Features.LDAPGroups { 328 c.Err = model.NewAppError("Api4.patchGroupSyncable", "api.ldap_groups.license_error", nil, "", 329 http.StatusNotImplemented) 330 return 331 } 332 333 if !c.App.SessionHasPermissionTo(c.App.Session, model.PERMISSION_MANAGE_SYSTEM) { 334 c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) 335 return 336 } 337 338 groupSyncable, appErr := c.App.GetGroupSyncable(c.Params.GroupId, syncableID, syncableType) 339 if appErr != nil { 340 c.Err = appErr 341 return 342 } 343 344 groupSyncable.Patch(patch) 345 346 groupSyncable, appErr = c.App.UpdateGroupSyncable(groupSyncable) 347 if appErr != nil { 348 c.Err = appErr 349 return 350 } 351 352 b, marshalErr := json.Marshal(groupSyncable) 353 if marshalErr != nil { 354 c.Err = model.NewAppError("Api4.patchGroupSyncable", "api.marshal_error", nil, marshalErr.Error(), http.StatusInternalServerError) 355 return 356 } 357 358 w.Write(b) 359 } 360 361 func unlinkGroupSyncable(c *Context, w http.ResponseWriter, r *http.Request) { 362 c.RequireGroupId() 363 if c.Err != nil { 364 return 365 } 366 367 c.RequireSyncableId() 368 if c.Err != nil { 369 return 370 } 371 syncableID := c.Params.SyncableId 372 373 c.RequireSyncableType() 374 if c.Err != nil { 375 return 376 } 377 syncableType := c.Params.SyncableType 378 379 if c.App.License() == nil || !*c.App.License().Features.LDAPGroups { 380 c.Err = model.NewAppError("Api4.unlinkGroupSyncable", "api.ldap_groups.license_error", nil, "", http.StatusNotImplemented) 381 return 382 } 383 384 if !c.App.SessionHasPermissionTo(c.App.Session, model.PERMISSION_MANAGE_SYSTEM) { 385 c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) 386 return 387 } 388 389 _, err := c.App.DeleteGroupSyncable(c.Params.GroupId, syncableID, syncableType) 390 if err != nil { 391 c.Err = err 392 return 393 } 394 395 ReturnStatusOK(w) 396 } 397 398 func getGroupMembers(c *Context, w http.ResponseWriter, r *http.Request) { 399 c.RequireGroupId() 400 if c.Err != nil { 401 return 402 } 403 404 if c.App.License() == nil || !*c.App.License().Features.LDAPGroups { 405 c.Err = model.NewAppError("Api4.getGroupMembers", "api.ldap_groups.license_error", nil, "", http.StatusNotImplemented) 406 return 407 } 408 409 if !c.App.SessionHasPermissionTo(c.App.Session, model.PERMISSION_MANAGE_SYSTEM) { 410 c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) 411 return 412 } 413 414 members, count, err := c.App.GetGroupMemberUsersPage(c.Params.GroupId, c.Params.Page, c.Params.PerPage) 415 if err != nil { 416 c.Err = err 417 return 418 } 419 420 b, marshalErr := json.Marshal(struct { 421 Members []*model.User `json:"members"` 422 Count int `json:"total_member_count"` 423 }{ 424 Members: members, 425 Count: count, 426 }) 427 if marshalErr != nil { 428 c.Err = model.NewAppError("Api4.getGroupMembers", "api.marshal_error", nil, marshalErr.Error(), http.StatusInternalServerError) 429 return 430 } 431 432 w.Write(b) 433 }