-
Notifications
You must be signed in to change notification settings - Fork 1
/
developer.go
140 lines (117 loc) · 4.34 KB
/
developer.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package service
import (
"fmt"
"strings"
"github.com/dchest/uniuri"
"github.com/erikbos/gatekeeper/cmd/managementserver/audit"
"github.com/erikbos/gatekeeper/pkg/db"
"github.com/erikbos/gatekeeper/pkg/shared"
"github.com/erikbos/gatekeeper/pkg/types"
)
// DeveloperService is
type DeveloperService struct {
db *db.Database
audit *audit.Audit
}
// NewDeveloper returns a new developer instance
func NewDeveloper(database *db.Database, a *audit.Audit) *DeveloperService {
return &DeveloperService{
db: database,
audit: a,
}
}
// GetAll returns all developers
func (ds *DeveloperService) GetAll(organizationName string) (developers types.Developers, err types.Error) {
return ds.db.Developer.GetAll(organizationName)
}
// Get returns details of an developer, in case name contains a @ assumption is developerId was provided
func (ds *DeveloperService) Get(organizationName, developerName string) (developer *types.Developer, err types.Error) {
if strings.Contains(developerName, "@") {
return ds.db.Developer.GetByEmail(organizationName, developerName)
}
return ds.db.Developer.GetByID(organizationName, developerName)
}
// Create creates a new developer
func (ds *DeveloperService) Create(organizationName string, newDeveloper types.Developer,
who audit.Requester) (*types.Developer, types.Error) {
if _, err := ds.Get(organizationName, newDeveloper.Email); err == nil {
return nil, types.NewBadRequestError(
fmt.Errorf("developer '%s' already exists", newDeveloper.Email))
}
// Automatically set default fields
newDeveloper.DeveloperID = generateDeveloperID(newDeveloper.Email)
newDeveloper.CreatedAt = shared.GetCurrentTimeMilliseconds()
newDeveloper.CreatedBy = who.User
newDeveloper.Activate()
if err := ds.updateDeveloper(organizationName, &newDeveloper, who); err != nil {
return nil, err
}
env := &audit.Environment{
Organization: organizationName,
DeveloperID: newDeveloper.DeveloperID,
}
ds.audit.Create(newDeveloper, env, who)
return &newDeveloper, nil
}
// Update updates an existing developer
func (ds *DeveloperService) Update(organizationName, developerEmail string, updatedDeveloper types.Developer, who audit.Requester) (
*types.Developer, types.Error) {
currentDeveloper, err := ds.db.Developer.GetByEmail(organizationName, developerEmail)
if err != nil {
return nil, err
}
// Copy over fields we do not allow to be updated
updatedDeveloper.Apps = currentDeveloper.Apps
updatedDeveloper.DeveloperID = currentDeveloper.DeveloperID
updatedDeveloper.CreatedAt = currentDeveloper.CreatedAt
updatedDeveloper.CreatedBy = currentDeveloper.CreatedBy
if err = ds.updateDeveloper(organizationName, &updatedDeveloper, who); err != nil {
return nil, err
}
env := &audit.Environment{
Organization: organizationName,
DeveloperID: updatedDeveloper.DeveloperID,
}
ds.audit.Update(currentDeveloper, updatedDeveloper, env, who)
return &updatedDeveloper, nil
}
// updateDeveloper updates last-modified field(s) and updates developer in database
func (ds *DeveloperService) updateDeveloper(organizationName string,
updatedDeveloper *types.Developer, who audit.Requester) types.Error {
updatedDeveloper.Attributes.Tidy()
updatedDeveloper.LastModifiedAt = shared.GetCurrentTimeMilliseconds()
updatedDeveloper.LastModifiedBy = who.User
if err := updatedDeveloper.Validate(); err != nil {
return types.NewBadRequestError(err)
}
return ds.db.Developer.Update(organizationName, updatedDeveloper)
}
// Delete deletes an developer
func (ds *DeveloperService) Delete(organizationName, developerName string, who audit.Requester) (e types.Error) {
developer, err := ds.Get(organizationName, developerName)
if err != nil {
return err
}
appCountOfDeveloper, err := ds.db.DeveloperApp.GetCountByDeveloperID(organizationName, developer.DeveloperID)
if err != nil {
return err
}
if appCountOfDeveloper > 0 {
return types.NewBadRequestError(
fmt.Errorf("cannot delete developer '%s' with %d active applications",
developer.Email, appCountOfDeveloper))
}
if err := ds.db.Developer.DeleteByID(organizationName, developer.DeveloperID); err != nil {
return err
}
env := &audit.Environment{
Organization: organizationName,
DeveloperID: developer.DeveloperID,
}
ds.audit.Delete(developer, env, who)
return nil
}
// generateDeveloperID generates a DeveloperID
func generateDeveloperID(developer string) string {
return uniuri.New()
}