/
node_group.go
89 lines (78 loc) · 2.8 KB
/
node_group.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package group
import (
"database/sql"
"strings"
"github.com/go-gorp/gorp"
"github.com/lib/pq"
"github.com/ovh/cds/sdk"
)
// LoadGroupsByNode retrieves all groups related to a node
func LoadGroupsByNode(db gorp.SqlExecutor, nodeID []int64) (map[int64][]sdk.GroupPermission, error) {
query := `SELECT workflow_node_id, "group".id,"group".name,workflow_node_group.role
FROM "group"
JOIN project_group ON "group".id = project_group.group_id
JOIN workflow_perm ON workflow_perm.project_group_id = project_group.id
JOIN workflow_node_group ON workflow_node_group.workflow_group_id = workflow_perm.id
WHERE workflow_node_group.workflow_node_id = ANY($1)
ORDER BY "group".name ASC`
rows, err := db.Query(query, pq.Int64Array(nodeID))
if err != nil {
if err == sql.ErrNoRows {
return nil, nil
}
return nil, sdk.WithStack(err)
}
defer rows.Close()
var mapGroups = make(map[int64][]sdk.GroupPermission)
for rows.Next() {
var group sdk.Group
var perm int
var nodeID int64
if err := rows.Scan(&nodeID, &group.ID, &group.Name, &perm); err != nil {
return nil, sdk.WithStack(err)
}
var groups = mapGroups[nodeID]
groups = append(groups, sdk.GroupPermission{
Group: group,
Permission: perm,
})
mapGroups[nodeID] = groups
}
return mapGroups, nil
}
// InsertGroupsInNode Link the given groups and the given environment
func InsertGroupsInNode(db gorp.SqlExecutor, groupPermission []sdk.GroupPermission, nodeID int64) error {
for _, g := range groupPermission {
if err := insertGroupInNode(db, nodeID, g.Group.ID, g.Permission); err != nil {
return sdk.WrapError(err, "unable to insert group %d %s on node %d ", g.Group.ID, g.Group.Name, nodeID)
}
}
return nil
}
// insertGroupInNode add permissions on Node to Group
func insertGroupInNode(db gorp.SqlExecutor, nodeID, groupID int64, role int) error {
query := `INSERT INTO workflow_node_group (workflow_node_id, workflow_group_id, role)
VALUES(
$1,
(SELECT workflow_perm.id
FROM workflow_perm
JOIN project_group ON project_group.id = workflow_perm.project_group_id
JOIN w_node ON w_node.workflow_id = workflow_perm.workflow_id
WHERE w_node.id = $1 AND project_group.group_id = $2),
$3
)`
if _, err := db.Exec(query, nodeID, groupID, role); err != nil {
if strings.Contains(err.Error(), `null value in column "workflow_group_id"`) {
return sdk.NewErrorFrom(sdk.ErrNotFound, "cannot add this group on workflow node because it isn't in the workflow groups : %v", err)
}
return sdk.WithStack(err)
}
return nil
}
// DeleteAllGroupFromNode remove all groups from the given node id
func DeleteAllGroupFromNode(db gorp.SqlExecutor, nodeID int64) error {
//Delete association
query := "DELETE FROM workflow_node_group WHERE workflow_node_id = $1"
_, err := db.Exec(query, nodeID)
return sdk.WithStack(err)
}