@@ -15,9 +15,9 @@ import (
15
15
16
16
// Scope targets identifiers to pull parameters from.
17
17
type Scope struct {
18
- OrganizationID string
19
- ProjectID uuid.UUID
20
18
ImportJobID uuid.UUID
19
+ OrganizationID sql.NullString
20
+ ProjectID uuid.NullUUID
21
21
UserID sql.NullString
22
22
WorkspaceID uuid.NullUUID
23
23
}
@@ -35,38 +35,40 @@ type Value struct {
35
35
// Compute accepts a scope in which parameter values are sourced.
36
36
// These sources are iterated in a hierarchical fashion to determine
37
37
// the runtime parameter values for a project.
38
- func Compute (ctx context.Context , db database.Store , scope Scope ) ([]Value , error ) {
38
+ func Compute (ctx context.Context , db database.Store , scope Scope , additional ... database. ParameterValue ) ([]Value , error ) {
39
39
compute := & compute {
40
40
db : db ,
41
41
computedParameterByName : map [string ]Value {},
42
42
parameterSchemasByName : map [string ]database.ParameterSchema {},
43
43
}
44
44
45
45
// All parameters for the project version!
46
- projectVersionParameters , err := db .GetParameterSchemasByJobID (ctx , scope .ImportJobID )
46
+ parameterSchemas , err := db .GetParameterSchemasByJobID (ctx , scope .ImportJobID )
47
47
if errors .Is (err , sql .ErrNoRows ) {
48
- // This occurs when the project version has defined
49
- // no parameters, so we have nothing to compute!
48
+ // This occurs when the provided import job has
49
+ // defined no parameters, so we have nothing to compute!
50
50
return []Value {}, nil
51
51
}
52
52
if err != nil {
53
53
return nil , xerrors .Errorf ("get project parameters: %w" , err )
54
54
}
55
- for _ , projectVersionParameter := range projectVersionParameters {
55
+ for _ , projectVersionParameter := range parameterSchemas {
56
56
compute .parameterSchemasByName [projectVersionParameter .Name ] = projectVersionParameter
57
57
}
58
58
59
- // Organization parameters come first!
60
- err = compute .inject (ctx , database.GetParameterValuesByScopeParams {
61
- Scope : database .ParameterScopeOrganization ,
62
- ScopeID : scope .OrganizationID ,
63
- })
64
- if err != nil {
65
- return nil , err
59
+ if scope .OrganizationID .Valid {
60
+ // Organization parameters come first!
61
+ err = compute .injectScope (ctx , database.GetParameterValuesByScopeParams {
62
+ Scope : database .ParameterScopeOrganization ,
63
+ ScopeID : scope .OrganizationID .String ,
64
+ })
65
+ if err != nil {
66
+ return nil , err
67
+ }
66
68
}
67
69
68
70
// Default project parameter values come second!
69
- for _ , projectVersionParameter := range projectVersionParameters {
71
+ for _ , projectVersionParameter := range parameterSchemas {
70
72
if ! projectVersionParameter .DefaultSourceValue .Valid {
71
73
continue
72
74
}
@@ -89,25 +91,27 @@ func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, erro
89
91
},
90
92
DefaultValue : true ,
91
93
Scope : database .ParameterScopeProject ,
92
- ScopeID : scope .ProjectID .String (),
94
+ ScopeID : scope .ProjectID .UUID . String (),
93
95
}
94
96
default :
95
97
return nil , xerrors .Errorf ("unsupported source scheme for project version parameter %q: %q" , projectVersionParameter .Name , string (projectVersionParameter .DefaultSourceScheme ))
96
98
}
97
99
}
98
100
99
- // Project parameters come third!
100
- err = compute .inject (ctx , database.GetParameterValuesByScopeParams {
101
- Scope : database .ParameterScopeProject ,
102
- ScopeID : scope .ProjectID .String (),
103
- })
104
- if err != nil {
105
- return nil , err
101
+ if scope .ProjectID .Valid {
102
+ // Project parameters come third!
103
+ err = compute .injectScope (ctx , database.GetParameterValuesByScopeParams {
104
+ Scope : database .ParameterScopeProject ,
105
+ ScopeID : scope .ProjectID .UUID .String (),
106
+ })
107
+ if err != nil {
108
+ return nil , err
109
+ }
106
110
}
107
111
108
112
if scope .UserID .Valid {
109
113
// User parameters come fourth!
110
- err = compute .inject (ctx , database.GetParameterValuesByScopeParams {
114
+ err = compute .injectScope (ctx , database.GetParameterValuesByScopeParams {
111
115
Scope : database .ParameterScopeUser ,
112
116
ScopeID : scope .UserID .String ,
113
117
})
@@ -118,7 +122,7 @@ func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, erro
118
122
119
123
if scope .WorkspaceID .Valid {
120
124
// Workspace parameters come last!
121
- err = compute .inject (ctx , database.GetParameterValuesByScopeParams {
125
+ err = compute .injectScope (ctx , database.GetParameterValuesByScopeParams {
122
126
Scope : database .ParameterScopeWorkspace ,
123
127
ScopeID : scope .WorkspaceID .UUID .String (),
124
128
})
@@ -127,6 +131,13 @@ func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, erro
127
131
}
128
132
}
129
133
134
+ for _ , parameterValue := range additional {
135
+ err = compute .injectSingle (parameterValue )
136
+ if err != nil {
137
+ return nil , xerrors .Errorf ("inject %q: %w" , parameterValue .Name , err )
138
+ }
139
+ }
140
+
130
141
for _ , projectVersionParameter := range compute .parameterSchemasByName {
131
142
if _ , ok := compute .computedParameterByName [projectVersionParameter .Name ]; ok {
132
143
continue
@@ -151,7 +162,7 @@ type compute struct {
151
162
}
152
163
153
164
// Validates and computes the value for parameters; setting the value on "parameterByName".
154
- func (c * compute ) inject (ctx context.Context , scopeParams database.GetParameterValuesByScopeParams ) error {
165
+ func (c * compute ) injectScope (ctx context.Context , scopeParams database.GetParameterValuesByScopeParams ) error {
155
166
scopedParameters , err := c .db .GetParameterValuesByScope (ctx , scopeParams )
156
167
if errors .Is (err , sql .ErrNoRows ) {
157
168
err = nil
@@ -161,39 +172,47 @@ func (c *compute) inject(ctx context.Context, scopeParams database.GetParameterV
161
172
}
162
173
163
174
for _ , scopedParameter := range scopedParameters {
164
- projectVersionParameter , hasProjectVersionParameter := c .parameterSchemasByName [scopedParameter .Name ]
165
- if ! hasProjectVersionParameter {
166
- // Don't inject parameters that aren't defined by the project.
167
- continue
175
+ err = c .injectSingle (scopedParameter )
176
+ if err != nil {
177
+ return xerrors .Errorf ("inject single %q: %w" , scopedParameter .Name , err )
168
178
}
179
+ }
180
+ return nil
181
+ }
169
182
170
- _ , hasExistingParameter := c .computedParameterByName [scopedParameter .Name ]
171
- if hasExistingParameter {
172
- // If a parameter already exists, check if this variable can override it.
173
- // Injection hierarchy is the responsibility of the caller. This check ensures
174
- // project parameters cannot be overridden if already set.
175
- if ! projectVersionParameter .AllowOverrideSource && scopedParameter .Scope != database .ParameterScopeProject {
176
- continue
177
- }
178
- }
183
+ func (c * compute ) injectSingle (scopedParameter database.ParameterValue ) error {
184
+ parameterSchema , hasParameterSchema := c .parameterSchemasByName [scopedParameter .Name ]
185
+ if ! hasParameterSchema {
186
+ // Don't inject parameters that aren't defined by the project.
187
+ return nil
188
+ }
179
189
180
- destinationScheme , err := convertDestinationScheme (scopedParameter .DestinationScheme )
181
- if err != nil {
182
- return xerrors .Errorf ("convert destination scheme: %w" , err )
190
+ _ , hasExistingParameter := c .computedParameterByName [scopedParameter .Name ]
191
+ if hasExistingParameter {
192
+ // If a parameter already exists, check if this variable can override it.
193
+ // Injection hierarchy is the responsibility of the caller. This check ensures
194
+ // project parameters cannot be overridden if already set.
195
+ if ! parameterSchema .AllowOverrideSource && scopedParameter .Scope != database .ParameterScopeProject {
196
+ return nil
183
197
}
198
+ }
184
199
185
- switch scopedParameter .SourceScheme {
186
- case database .ParameterSourceSchemeData :
187
- c .computedParameterByName [projectVersionParameter .Name ] = Value {
188
- Proto : & proto.ParameterValue {
189
- DestinationScheme : destinationScheme ,
190
- Name : scopedParameter .SourceValue ,
191
- Value : scopedParameter .DestinationValue ,
192
- },
193
- }
194
- default :
195
- return xerrors .Errorf ("unsupported source scheme: %q" , string (projectVersionParameter .DefaultSourceScheme ))
200
+ destinationScheme , err := convertDestinationScheme (scopedParameter .DestinationScheme )
201
+ if err != nil {
202
+ return xerrors .Errorf ("convert destination scheme: %w" , err )
203
+ }
204
+
205
+ switch scopedParameter .SourceScheme {
206
+ case database .ParameterSourceSchemeData :
207
+ c .computedParameterByName [parameterSchema .Name ] = Value {
208
+ Proto : & proto.ParameterValue {
209
+ DestinationScheme : destinationScheme ,
210
+ Name : scopedParameter .SourceValue ,
211
+ Value : scopedParameter .DestinationValue ,
212
+ },
196
213
}
214
+ default :
215
+ return xerrors .Errorf ("unsupported source scheme: %q" , string (parameterSchema .DefaultSourceScheme ))
197
216
}
198
217
return nil
199
218
}
0 commit comments