forked from evergreen-ci/evergreen
/
aliases.go
99 lines (88 loc) · 3.19 KB
/
aliases.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
package data
import (
"github.com/evergreen-ci/evergreen/model"
restModel "github.com/evergreen-ci/evergreen/rest/model"
"github.com/mongodb/grip"
"github.com/pkg/errors"
)
// DBAliasConnector is a struct that implements the Alias related methods
// from the Connector through interactions with the backing database.
type DBAliasConnector struct{}
// FindProjectAliases queries the database to find all aliases.
func (d *DBAliasConnector) FindProjectAliases(projectId string) ([]restModel.APIProjectAlias, error) {
aliases, err := model.FindAliasesForProject(projectId)
if err != nil {
return nil, err
}
if aliases == nil {
return nil, nil
}
aliasModels := []restModel.APIProjectAlias{}
for _, alias := range aliases {
aliasModel := restModel.APIProjectAlias{}
if err := aliasModel.BuildFromService(alias); err != nil {
return nil, err
}
aliasModels = append(aliasModels, aliasModel)
}
return aliasModels, nil
}
// CopyProjectAliases finds the aliases for a given project and inserts them for the new project.
func (d *DBAliasConnector) CopyProjectAliases(oldProjectId, newProjectId string) error {
aliases, err := model.FindAliasesForProject(oldProjectId)
if err != nil {
return errors.Wrapf(err, "error finding aliases for project '%s'", oldProjectId)
}
if aliases != nil {
if err = model.UpsertAliasesForProject(aliases, newProjectId); err != nil {
return errors.Wrapf(err, "error inserting aliases for project '%s'", newProjectId)
}
}
return nil
}
func (d *DBAliasConnector) UpdateProjectAliases(projectId string, aliases []restModel.APIProjectAlias) error {
aliasesToUpsert := []model.ProjectAlias{}
aliasesToDelete := []string{}
catcher := grip.NewBasicCatcher()
for _, aliasModel := range aliases {
if aliasModel.Delete {
aliasesToDelete = append(aliasesToDelete, restModel.FromAPIString(aliasModel.ID))
} else {
v, err := aliasModel.ToService()
catcher.Add(errors.Wrap(err, "problem converting to project variable model"))
alias, ok := v.(model.ProjectAlias)
if !ok {
catcher.Add(errors.New("problem converting to project alias"))
}
alias.ProjectID = projectId
aliasesToUpsert = append(aliasesToUpsert, alias)
}
}
errStrs := model.ValidateProjectAliases(aliasesToUpsert, "All Aliases")
for _, err := range errStrs {
catcher.Add(errors.Errorf("error validating project alias: %s", err))
}
if catcher.HasErrors() {
return catcher.Resolve()
}
if err := model.UpsertAliasesForProject(aliasesToUpsert, projectId); err != nil {
return errors.Wrap(err, "problem upserting aliases")
}
for _, aliasId := range aliasesToDelete {
catcher.Add(model.RemoveProjectAlias(aliasId))
}
return catcher.Resolve()
}
// MockAliasConnector is a struct that implements mock versions of
// Alias-related methods for testing.
type MockAliasConnector struct{}
// FindAllAliases is a mock implementation for testing.
func (d *MockAliasConnector) FindProjectAliases(projectId string) ([]restModel.APIProjectAlias, error) {
return nil, nil
}
func (d *MockAliasConnector) CopyProjectAliases(oldProjectId, newProjectId string) error {
return nil
}
func (d *MockAliasConnector) UpdateProjectAliases(projectId string, aliases []restModel.APIProjectAlias) error {
return nil
}