/
dao_project_link.go
113 lines (94 loc) · 3.73 KB
/
dao_project_link.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package group
import (
"context"
"github.com/go-gorp/gorp"
"github.com/rockbears/log"
"github.com/ovh/cds/engine/api/database/gorpmapping"
"github.com/ovh/cds/engine/gorpmapper"
"github.com/ovh/cds/sdk"
)
func getLinksGroupProject(ctx context.Context, db gorp.SqlExecutor, q gorpmapping.Query, opts ...LoadLinkGroupProjectOptionFunc) (LinksGroupProject, error) {
gps := []*LinkGroupProject{}
if err := gorpmapping.GetAll(ctx, db, q, &gps); err != nil {
return nil, sdk.WrapError(err, "cannot links group project")
}
var pgps []*LinkGroupProject
for i := range gps {
isValid, err := gorpmapping.CheckSignature(gps[i], gps[i].Signature)
if err != nil {
return nil, err
}
if !isValid {
log.Error(ctx, "project_group %d data corrupted", gps[i].ID)
continue
}
pgps = append(pgps, gps[i])
}
if len(pgps) > 0 {
for i := range opts {
if err := opts[i](ctx, db, pgps...); err != nil {
return nil, err
}
}
}
var result = make([]LinkGroupProject, len(pgps))
for i := range pgps {
result[i] = *pgps[i]
}
return result, nil
}
// LoadLinksGroupProjectForGroupID returns data from project_group table for given group id.
func LoadLinksGroupProjectForGroupID(ctx context.Context, db gorp.SqlExecutor, groupID int64, opts ...LoadLinkGroupProjectOptionFunc) (LinksGroupProject, error) {
query := gorpmapping.NewQuery(`
SELECT *
FROM project_group
WHERE group_id = $1
`).Args(groupID)
return getLinksGroupProject(ctx, db, query, opts...)
}
// LoadLinksGroupProjectForProjectIDs returns data from project_group table for given group id.
func LoadLinksGroupProjectForProjectIDs(ctx context.Context, db gorp.SqlExecutor, projectIDs []int64, opts ...LoadLinkGroupProjectOptionFunc) (LinksGroupProject, error) {
query := gorpmapping.NewQuery(`
SELECT *
FROM project_group
WHERE project_id = ANY(string_to_array($1, ',')::int[])
`).Args(gorpmapping.IDsToQueryString(projectIDs))
return getLinksGroupProject(ctx, db, query, opts...)
}
// LoadLinkGroupProjectForGroupIDAndProjectID returns a link from project_group if exists for given group and project ids.
func LoadLinkGroupProjectForGroupIDAndProjectID(ctx context.Context, db gorp.SqlExecutor, groupID, projectID int64) (*LinkGroupProject, error) {
var l LinkGroupProject
query := gorpmapping.NewQuery(`
SELECT *
FROM project_group
WHERE group_id = $1 AND project_id = $2
`).Args(groupID, projectID)
found, err := gorpmapping.Get(ctx, db, query, &l)
if err != nil {
return nil, sdk.WrapError(err, "cannot get link between group and project")
}
if !found {
return nil, sdk.WithStack(sdk.ErrNotFound)
}
isValid, err := gorpmapping.CheckSignature(l, l.Signature)
if err != nil {
return nil, err
}
if !isValid {
log.Error(ctx, "group.LoadLinkGroupProjectForGroupIDAndProjectID> project_group %d data corrupted", l.ID)
return nil, sdk.WithStack(sdk.ErrNotFound)
}
return &l, nil
}
// InsertLinkGroupProject inserts given link group-project into database.
func InsertLinkGroupProject(ctx context.Context, db gorpmapper.SqlExecutorWithTx, l *LinkGroupProject) error {
return sdk.WrapError(gorpmapping.InsertAndSign(ctx, db, l), "unable to insert link between group and project")
}
// updateDBLinkGroupProject updates given link group-project into database.
func updateDBLinkGroupProject(ctx context.Context, db gorpmapper.SqlExecutorWithTx, l *LinkGroupProject) error {
return sdk.WrapError(gorpmapping.UpdateAndSign(ctx, db, l), "unable to update link between group and project")
}
// deleteDBLinkGroupProject deletes given link group-project into database.
func deleteDBLinkGroupProject(ctx context.Context, db gorp.SqlExecutor, l *LinkGroupProject) error {
return sdk.WrapError(gorpmapping.Delete(db, l), "unable to delete link between group and project")
}