3
0

Fix role membership management endpoints & ctrls

This commit is contained in:
Denis Arh 2019-02-23 20:16:36 +01:00
parent 518efe9c5c
commit e2c2c9df4a
11 changed files with 163 additions and 51 deletions

View File

@ -334,10 +334,10 @@
}
},
{
"name": "memberAdd",
"method": "POST",
"title": "Add member to a role",
"path": "/{roleID}/memberAdd",
"name": "memberList",
"method": "GET",
"title": "Returns all role members",
"path": "/{roleID}/members",
"parameters": {
"path": [
{
@ -346,8 +346,22 @@
"required": true,
"title": "Source Role ID"
}
],
"post": [
]
}
},
{
"name": "memberAdd",
"method": "POST",
"title": "Add member to a role",
"path": "/{roleID}/member/{userID}",
"parameters": {
"path": [
{
"type": "uint64",
"name": "roleID",
"required": true,
"title": "Source Role ID"
},
{
"type": "uint64",
"name": "userID",
@ -359,9 +373,9 @@
},
{
"name": "memberRemove",
"method": "POST",
"method": "DELETE",
"title": "Remove member from a role",
"path": "/{roleID}/memberRemove",
"path": "/{roleID}/member/{userID}",
"parameters": {
"path": [
{
@ -369,9 +383,7 @@
"name": "roleID",
"required": true,
"title": "Source Role ID"
}
],
"post": [
},
{
"type": "uint64",
"name": "userID",

View File

@ -176,10 +176,10 @@
}
},
{
"Name": "memberAdd",
"Method": "POST",
"Title": "Add member to a role",
"Path": "/{roleID}/memberAdd",
"Name": "memberList",
"Method": "GET",
"Title": "Returns all role members",
"Path": "/{roleID}/members",
"Parameters": {
"path": [
{
@ -188,8 +188,22 @@
"title": "Source Role ID",
"type": "uint64"
}
],
"post": [
]
}
},
{
"Name": "memberAdd",
"Method": "POST",
"Title": "Add member to a role",
"Path": "/{roleID}/member/{userID}",
"Parameters": {
"path": [
{
"name": "roleID",
"required": true,
"title": "Source Role ID",
"type": "uint64"
},
{
"name": "userID",
"required": true,
@ -201,9 +215,9 @@
},
{
"Name": "memberRemove",
"Method": "POST",
"Method": "DELETE",
"Title": "Remove member from a role",
"Path": "/{roleID}/memberRemove",
"Path": "/{roleID}/member/{userID}",
"Parameters": {
"path": [
{
@ -211,9 +225,7 @@
"required": true,
"title": "Source Role ID",
"type": "uint64"
}
],
"post": [
},
{
"name": "userID",
"required": true,

View File

@ -318,20 +318,34 @@ An organisation may have many roles. Roles may have many channels available. Acc
| roleID | uint64 | PATH | Source Role ID | N/A | YES |
| destination | uint64 | POST | Destination Role ID | N/A | YES |
## Add member to a role
## Returns all role members
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/roles/{roleID}/memberAdd` | HTTP/S | POST | Client ID, Session ID |
| `/roles/{roleID}/members` | HTTP/S | GET | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| roleID | uint64 | PATH | Source Role ID | N/A | YES |
| userID | uint64 | POST | User ID | N/A | YES |
## Add member to a role
#### Method
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/roles/{roleID}/member/{userID}` | HTTP/S | POST | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| roleID | uint64 | PATH | Source Role ID | N/A | YES |
| userID | uint64 | PATH | User ID | N/A | YES |
## Remove member from a role
@ -339,14 +353,14 @@ An organisation may have many roles. Roles may have many channels available. Acc
| URI | Protocol | Method | Authentication |
| --- | -------- | ------ | -------------- |
| `/roles/{roleID}/memberRemove` | HTTP/S | POST | Client ID, Session ID |
| `/roles/{roleID}/member/{userID}` | HTTP/S | DELETE | Client ID, Session ID |
#### Request parameters
| Parameter | Type | Method | Description | Default | Required? |
| --------- | ---- | ------ | ----------- | ------- | --------- |
| roleID | uint64 | PATH | Source Role ID | N/A | YES |
| userID | uint64 | POST | User ID | N/A | YES |
| userID | uint64 | PATH | User ID | N/A | YES |

View File

@ -64,13 +64,13 @@ func (*Channel) Permissions() []rules.OperationGroup {
func (*Channel) PermissionDefault(key string) rules.Access {
values := map[string]rules.Access{
"message.embed": rules.Inherit,
"message.attach": rules.Inherit,
"message.update_own": rules.Inherit,
"message.update_all": rules.Inherit,
"message.react": rules.Inherit,
"manage.webhooks": rules.Inherit,
"message.send": rules.Inherit,
"message.embed": rules.Inherit,
}
if value, ok := values[key]; ok {
return value

View File

@ -94,18 +94,18 @@ func (*Organisation) Permissions() []rules.OperationGroup {
func (*Organisation) PermissionDefault(key string) rules.Access {
values := map[string]rules.Access{
"audit": rules.Deny,
"manage.organisation": rules.Deny,
"manage.roles": rules.Deny,
"manage.channels": rules.Deny,
"manage.webhooks": rules.Deny,
"message.attach": rules.Allow,
"message.send": rules.Allow,
"message.update_own": rules.Allow,
"message.update_all": rules.Deny,
"message.react": rules.Allow,
"admin": rules.Deny,
"message.send": rules.Allow,
"manage.organisation": rules.Deny,
"manage.channels": rules.Deny,
"message.embed": rules.Allow,
"message.update_own": rules.Allow,
"message.attach": rules.Allow,
"audit": rules.Deny,
"manage.roles": rules.Deny,
"manage.webhooks": rules.Deny,
}
if value, ok := values[key]; ok {
return value

View File

@ -64,13 +64,13 @@ func (*Role) Permissions() []rules.OperationGroup {
func (*Role) PermissionDefault(key string) rules.Access {
values := map[string]rules.Access{
"message.embed": rules.Inherit,
"message.attach": rules.Inherit,
"message.update_own": rules.Inherit,
"message.update_all": rules.Inherit,
"message.react": rules.Inherit,
"manage.webhooks": rules.Inherit,
"message.send": rules.Inherit,
"message.embed": rules.Inherit,
}
if value, ok := values[key]; ok {
return value

View File

@ -27,6 +27,7 @@ type (
MergeByID(id, targetRoleID uint64) error
MoveByID(id, targetOrganisationID uint64) error
MemberFindByRoleID(roleID uint64) ([]*types.RoleMember, error)
MemberAddByID(id, userID uint64) error
MemberRemoveByID(id, userID uint64) error
}
@ -140,6 +141,12 @@ func (r *role) MoveByID(id, targetOrganisationID uint64) error {
return ErrNotImplemented
}
func (r *role) MemberFindByRoleID(roleID uint64) (mm []*types.RoleMember, err error) {
rval := make([]*types.RoleMember, 0)
sql := "SELECT * FROM " + r.members + " WHERE rel_role = ?"
return rval, r.db().Select(&rval, sql, roleID)
}
func (r *role) MemberAddByID(id, userID uint64) error {
mod := &types.RoleMember{
RoleID: id,

View File

@ -35,6 +35,7 @@ type RoleAPI interface {
Archive(context.Context, *request.RoleArchive) (interface{}, error)
Move(context.Context, *request.RoleMove) (interface{}, error)
Merge(context.Context, *request.RoleMerge) (interface{}, error)
MemberList(context.Context, *request.RoleMemberList) (interface{}, error)
MemberAdd(context.Context, *request.RoleMemberAdd) (interface{}, error)
MemberRemove(context.Context, *request.RoleMemberRemove) (interface{}, error)
}
@ -49,6 +50,7 @@ type Role struct {
Archive func(http.ResponseWriter, *http.Request)
Move func(http.ResponseWriter, *http.Request)
Merge func(http.ResponseWriter, *http.Request)
MemberList func(http.ResponseWriter, *http.Request)
MemberAdd func(http.ResponseWriter, *http.Request)
MemberRemove func(http.ResponseWriter, *http.Request)
}
@ -111,6 +113,13 @@ func NewRole(rh RoleAPI) *Role {
return rh.Merge(r.Context(), params)
})
},
MemberList: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewRoleMemberList()
resputil.JSON(w, params.Fill(r), func() (interface{}, error) {
return rh.MemberList(r.Context(), params)
})
},
MemberAdd: func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
params := request.NewRoleMemberAdd()
@ -140,8 +149,9 @@ func (rh *Role) MountRoutes(r chi.Router, middlewares ...func(http.Handler) http
r.Post("/{roleID}/archive", rh.Archive)
r.Post("/{roleID}/move", rh.Move)
r.Post("/{roleID}/merge", rh.Merge)
r.Post("/{roleID}/memberAdd", rh.MemberAdd)
r.Post("/{roleID}/memberRemove", rh.MemberRemove)
r.Get("/{roleID}/members", rh.MemberList)
r.Post("/{roleID}/member/{userID}", rh.MemberAdd)
r.Delete("/{roleID}/member/{userID}", rh.MemberRemove)
})
})
}

View File

@ -398,6 +398,49 @@ func (ro *RoleMerge) Fill(r *http.Request) (err error) {
var _ RequestFiller = NewRoleMerge()
// Role memberList request parameters
type RoleMemberList struct {
RoleID uint64 `json:",string"`
}
func NewRoleMemberList() *RoleMemberList {
return &RoleMemberList{}
}
func (ro *RoleMemberList) Fill(r *http.Request) (err error) {
if strings.ToLower(r.Header.Get("content-type")) == "application/json" {
err = json.NewDecoder(r.Body).Decode(ro)
switch {
case err == io.EOF:
err = nil
case err != nil:
return errors.Wrap(err, "error parsing http request body")
}
}
if err = r.ParseForm(); err != nil {
return err
}
get := map[string]string{}
post := map[string]string{}
urlQuery := r.URL.Query()
for name, param := range urlQuery {
get[name] = string(param[0])
}
postVars := r.Form
for name, param := range postVars {
post[name] = string(param[0])
}
ro.RoleID = parseUInt64(chi.URLParam(r, "roleID"))
return err
}
var _ RequestFiller = NewRoleMemberList()
// Role memberAdd request parameters
type RoleMemberAdd struct {
RoleID uint64 `json:",string"`
@ -436,10 +479,7 @@ func (ro *RoleMemberAdd) Fill(r *http.Request) (err error) {
}
ro.RoleID = parseUInt64(chi.URLParam(r, "roleID"))
if val, ok := post["userID"]; ok {
ro.UserID = parseUInt64(val)
}
ro.UserID = parseUInt64(chi.URLParam(r, "userID"))
return err
}
@ -484,10 +524,7 @@ func (ro *RoleMemberRemove) Fill(r *http.Request) (err error) {
}
ro.RoleID = parseUInt64(chi.URLParam(r, "roleID"))
if val, ok := post["userID"]; ok {
ro.UserID = parseUInt64(val)
}
ro.UserID = parseUInt64(chi.URLParam(r, "userID"))
return err
}

View File

@ -3,6 +3,7 @@ package rest
import (
"context"
"github.com/davecgh/go-spew/spew"
"github.com/pkg/errors"
"github.com/crusttech/crust/system/rest/request"
@ -35,20 +36,20 @@ func (ctrl *Role) List(ctx context.Context, r *request.RoleList) (interface{}, e
}
func (ctrl *Role) Create(ctx context.Context, r *request.RoleCreate) (interface{}, error) {
org := &types.Role{
role := &types.Role{
Name: r.Name,
}
return ctrl.svc.role.With(ctx).Create(org)
return ctrl.svc.role.With(ctx).Create(role)
}
func (ctrl *Role) Update(ctx context.Context, r *request.RoleUpdate) (interface{}, error) {
org := &types.Role{
role := &types.Role{
ID: r.RoleID,
Name: r.Name,
}
return ctrl.svc.role.With(ctx).Update(org)
return ctrl.svc.role.With(ctx).Update(role)
}
func (ctrl *Role) Remove(ctx context.Context, r *request.RoleRemove) (interface{}, error) {
@ -67,6 +68,19 @@ func (ctrl *Role) Move(ctx context.Context, r *request.RoleMove) (interface{}, e
return nil, ctrl.svc.role.With(ctx).Move(r.RoleID, r.OrganisationID)
}
func (ctrl *Role) MemberList(ctx context.Context, r *request.RoleMemberList) (interface{}, error) {
if mm, err := ctrl.svc.role.With(ctx).MemberList(r.RoleID); err != nil {
return nil, err
} else {
rval := make([]uint64, len(mm))
for i := range mm {
rval[i] = mm[i].UserID
}
spew.Dump(rval)
return rval, nil
}
}
func (ctrl *Role) MemberAdd(ctx context.Context, r *request.RoleMemberAdd) (interface{}, error) {
return nil, ctrl.svc.role.With(ctx).MemberAdd(r.RoleID, r.UserID)
}

View File

@ -32,6 +32,7 @@ type (
Unarchive(ID uint64) error
Delete(ID uint64) error
MemberList(roleID uint64) ([]*types.RoleMember, error)
MemberAdd(roleID, userID uint64) error
MemberRemove(roleID, userID uint64) error
}
@ -118,6 +119,11 @@ func (svc *role) Move(id, targetOrganisationID uint64) error {
return svc.role.MoveByID(id, targetOrganisationID)
}
func (svc *role) MemberList(roleID uint64) ([]*types.RoleMember, error) {
// @todo: permission check if current user can read role members
return svc.role.MemberFindByRoleID(roleID)
}
func (svc *role) MemberAdd(id, userID uint64) error {
// @todo: permission check if current user can add user in to a role
return svc.role.MemberAddByID(id, userID)