|
package auth
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
xql "github.com/archsh/go.xql"
|
|
|
|
"cygnux.net/kepler/restlet"
|
|
)
|
|
|
|
func CheckGroupAvailableHandle(ctx restlet.RequestContext, params, queries restlet.Parameters, data []byte) (int, interface{}, error) {
|
|
name, b := params.GetString("name")
|
|
if !b || name == "" {
|
|
return restlet.ErrorInvalidParams, nil, fmt.Errorf("name required")
|
|
}
|
|
session := xql.MakeSession(ctx.SQL(), "postgres")
|
|
defer session.Close()
|
|
if n, e := session.Table(groupTable, "id").Where("name", name).Count(); nil != e {
|
|
return restlet.FatalDbReadFailed, nil, e
|
|
} else if n > 0 {
|
|
return restlet.ErrorConflict, nil, fmt.Errorf("name '%s' already exists", name)
|
|
}
|
|
return restlet.SuccessOk, map[string]interface{}{}, nil
|
|
}
|
|
|
|
|
|
func GroupListHandle(ctx restlet.RequestContext, params, queries restlet.Parameters, data []byte) (restlet.Result, error) {
|
|
//auth.GetGroup()
|
|
session := xql.MakeSession(ctx.SQL(), "postgres")
|
|
defer session.Close()
|
|
var groups []*Group
|
|
var groupMap = make(map[string]*Group)
|
|
if rows, e := session.Table(groupTable).All(); nil != e {
|
|
return restlet.FailureResult(restlet.FatalDbReadFailed, e.Error())
|
|
} else {
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
var group Group
|
|
if e := rows.Scan(&group); nil != e {
|
|
return restlet.FailureResult(restlet.FatalDbReadFailed, e.Error())
|
|
} else {
|
|
groups = append(groups, &group)
|
|
groupMap[group.Id] = &group
|
|
}
|
|
}
|
|
}
|
|
if rows, e := session.Table(groupPermissionTable, "group_id", "role").All(); nil != e {
|
|
return restlet.FailureResult(restlet.FatalDbReadFailed, e.Error())
|
|
} else {
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
var gid, role string
|
|
if e := rows.Scan(&gid, &role); nil != e {
|
|
return restlet.FailureResult(restlet.FatalDbReadFailed, e.Error())
|
|
} else {
|
|
if g, b := groupMap[gid]; b {
|
|
g.Permissions = append(g.Permissions, role)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return restlet.Result{
|
|
Control: &restlet.ControlResult{
|
|
Total: int64(len(groups)),
|
|
Count: int64(len(groups)),
|
|
},
|
|
Code: restlet.SuccessOk,
|
|
Data: groups,
|
|
}, nil
|
|
}
|
|
|
|
type groupAddReq struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
Permissions []string `json:"permissions"`
|
|
}
|
|
|
|
func GroupAddHandle(ctx restlet.RequestContext, params, queries restlet.Parameters, data []byte) (int, interface{}, error) {
|
|
var req groupAddReq
|
|
if e := json.Unmarshal(data, &req); nil != e {
|
|
logrus.Errorln("GroupAddHandle:> 1:", e)
|
|
return restlet.ErrorInvalidData, nil, e
|
|
} else if req.Name == "" {
|
|
logrus.Errorln("GroupAddHandle:> 2: empty name")
|
|
return restlet.ErrorInvalidData, nil, fmt.Errorf("name can not be empty")
|
|
}
|
|
session := xql.MakeSession(ctx.SQL(), "postgres")
|
|
defer session.Close()
|
|
if e := session.Begin(); nil != e {
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
if n, e := session.Table(groupTable, "id").Where("name", req.Name).Count(); nil != e {
|
|
return restlet.FatalDbReadFailed, nil, e
|
|
} else if n > 0 {
|
|
return restlet.ErrorConflict, nil, fmt.Errorf("groupname '%s' already exists", req.Name)
|
|
}
|
|
groupId, e := AddGroup(session, req.Name, req.Description, req.Permissions...)
|
|
if nil != e {
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
if e := session.Commit(); nil != e {
|
|
_ = session.Rollback()
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
return restlet.SuccessOk, map[string]interface{}{"groupId": groupId}, nil
|
|
}
|
|
|
|
func GroupUpdateHandle(ctx restlet.RequestContext, params, queries restlet.Parameters, data []byte) (int, interface{}, error) {
|
|
groupId, b := params.GetUUID("id")
|
|
if !b {
|
|
return restlet.ErrorInvalidParams, nil, fmt.Errorf("groupId required")
|
|
}
|
|
var updateMap = make(map[string]interface{})
|
|
var testMap = make(map[string]interface{})
|
|
var groupReq groupAddReq
|
|
var permissions []string
|
|
if e := json.Unmarshal(data, &groupReq); nil != e {
|
|
return restlet.ErrorInvalidData, nil, e
|
|
}
|
|
if e := json.Unmarshal(data, &testMap); nil != e {
|
|
return restlet.ErrorInvalidData, nil, e
|
|
}
|
|
//groups = groupReq.Groups
|
|
logrus.Debugln("GroupUpdateHandle:>testMap: ", testMap)
|
|
logrus.Debugln("GroupUpdateHandle:>groupReq: ", groupReq)
|
|
if _, b := testMap["name"]; b {
|
|
updateMap["name"] = groupReq.Name
|
|
}
|
|
if _, b := testMap["description"]; b {
|
|
updateMap["description"] = groupReq.Description
|
|
}
|
|
if _, b := testMap["permissions"]; b {
|
|
permissions = groupReq.Permissions
|
|
logrus.Debugln("GroupUpdateHandle:>permissions: ", permissions)
|
|
}
|
|
for _, k := range []string{"id", "created", "updated"} {
|
|
if _, b := updateMap[k]; b {
|
|
return restlet.ErrorInvalidData, nil, fmt.Errorf("not allowed to update '%s'", k)
|
|
}
|
|
}
|
|
|
|
session := xql.MakeSession(ctx.SQL(), "postgres")
|
|
defer session.Close()
|
|
if e := session.Begin(); nil != e {
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
if e := ModGroupProps(session, groupId.String(), updateMap); nil != e {
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
if e := ModGroupPermissions(session, groupId.String(), true, permissions...); nil != e {
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
|
|
if e := session.Commit(); nil != e {
|
|
_ = session.Rollback()
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
return restlet.SuccessOk, map[string]interface{}{
|
|
}, nil
|
|
}
|
|
|
|
func GroupDeleteHandle(ctx restlet.RequestContext, params, queries restlet.Parameters, data []byte) (int, interface{}, error) {
|
|
|
|
groupId, b := params.GetUUID("id")
|
|
if !b {
|
|
return restlet.ErrorInvalidParams, nil, fmt.Errorf("groupId required")
|
|
}
|
|
|
|
session := xql.MakeSession(ctx.SQL(), "postgres")
|
|
defer session.Close()
|
|
if e := session.Begin(); nil != e {
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
|
|
if _, e := session.Table(groupTable).Where("id", groupId.String()).Delete(); nil != e {
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
|
|
if e := session.Commit(); nil != e {
|
|
_ = session.Rollback()
|
|
return restlet.FatalDbWriteFailed, nil, e
|
|
}
|
|
return restlet.SuccessOk, map[string]interface{}{
|
|
}, nil
|
|
}
|