• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

goto / guardian / 17816287169

18 Sep 2025 02:37AM UTC coverage: 69.124% (-0.3%) from 69.44%
17816287169

push

github

web-flow
feat: introduce create resource API (#222)

* docs: add tips for generating proto from a local file

* feat: introduce create resource API

* chore: update proto

* chore: add more validations

* chore: wrap error with more message detail

* feat: validate resource conflict on creation

* chore: update proto

* chore: update proto

0 of 84 new or added lines in 5 files covered. (0.0%)

191 existing lines in 8 files now uncovered.

11373 of 16453 relevant lines covered (69.12%)

4.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

71.8
/api/handler/v1beta1/adapter.go
1
package v1beta1
2

3
import (
4
        "fmt"
5

6
        "github.com/mitchellh/mapstructure"
7
        "google.golang.org/protobuf/types/known/structpb"
8
        "google.golang.org/protobuf/types/known/timestamppb"
9

10
        guardianv1beta1 "github.com/goto/guardian/api/proto/gotocompany/guardian/v1beta1"
11
        "github.com/goto/guardian/domain"
12
)
13

14
type adapter struct{}
15

16
func NewAdapter() *adapter {
134✔
17
        return &adapter{}
134✔
18
}
134✔
19

20
func (a *adapter) FromProviderProto(p *guardianv1beta1.Provider) (*domain.Provider, error) {
×
21
        provider := &domain.Provider{
×
22
                ID:   p.GetId(),
×
23
                Type: p.GetType(),
×
24
                URN:  p.GetUrn(),
×
25
        }
×
26

×
27
        if p.GetConfig() != nil {
×
28
                provider.Config = a.FromProviderConfigProto(p.GetConfig())
×
29
        }
×
30

31
        if p.GetCreatedAt() != nil {
×
32
                provider.CreatedAt = p.GetCreatedAt().AsTime()
×
33
        }
×
34
        if p.GetUpdatedAt() != nil {
×
35
                provider.UpdatedAt = p.GetUpdatedAt().AsTime()
×
36
        }
×
37

38
        return provider, nil
×
39
}
40

41
func (a *adapter) FromProviderConfigProto(pc *guardianv1beta1.ProviderConfig) *domain.ProviderConfig {
6✔
42
        providerConfig := &domain.ProviderConfig{
6✔
43
                Type:        pc.GetType(),
6✔
44
                URN:         pc.GetUrn(),
6✔
45
                Labels:      pc.GetLabels(),
6✔
46
                Credentials: pc.GetCredentials().AsInterface(),
6✔
47
        }
6✔
48

6✔
49
        if pc.GetAppeal() != nil {
7✔
50
                appealConfig := &domain.AppealConfig{}
1✔
51
                appealConfig.AllowPermanentAccess = pc.GetAppeal().GetAllowPermanentAccess()
1✔
52
                appealConfig.AllowActiveAccessExtensionIn = pc.GetAppeal().GetAllowActiveAccessExtensionIn()
1✔
53
                providerConfig.Appeal = appealConfig
1✔
54
        }
1✔
55

56
        if pc.GetResources() != nil {
8✔
57
                resources := []*domain.ResourceConfig{}
2✔
58
                for _, r := range pc.GetResources() {
4✔
59
                        roles := []*domain.Role{}
2✔
60
                        for _, roleProto := range r.GetRoles() {
4✔
61
                                role := &domain.Role{
2✔
62
                                        ID:          roleProto.GetId(),
2✔
63
                                        Name:        roleProto.GetName(),
2✔
64
                                        Description: roleProto.GetDescription(),
2✔
65
                                }
2✔
66

2✔
67
                                if roleProto.Permissions != nil {
2✔
68
                                        permissions := []interface{}{}
×
69
                                        for _, p := range roleProto.GetPermissions() {
×
70
                                                permissions = append(permissions, p.AsInterface())
×
71
                                        }
×
72
                                        role.Permissions = permissions
×
73
                                }
74

75
                                roles = append(roles, role)
2✔
76
                        }
77

78
                        resources = append(resources, &domain.ResourceConfig{
2✔
79
                                Type:   r.GetType(),
2✔
80
                                Filter: r.GetFilter(),
2✔
81
                                Policy: a.fromPolicyConfigProto(r.GetPolicy()),
2✔
82
                                Roles:  roles,
2✔
83
                        })
2✔
84
                }
85
                providerConfig.Resources = resources
2✔
86
        }
87

88
        if pc.GetParameters() != nil {
7✔
89
                parameters := []*domain.ProviderParameter{}
1✔
90
                for _, p := range pc.GetParameters() {
2✔
91
                        parameters = append(parameters, &domain.ProviderParameter{
1✔
92
                                Key:         p.GetKey(),
1✔
93
                                Label:       p.GetLabel(),
1✔
94
                                Required:    p.GetRequired(),
1✔
95
                                Description: p.GetDescription(),
1✔
96
                        })
1✔
97
                }
1✔
98
                providerConfig.Parameters = parameters
1✔
99
        }
100

101
        if pc.GetAllowedAccountTypes() != nil {
8✔
102
                providerConfig.AllowedAccountTypes = pc.GetAllowedAccountTypes()
2✔
103
        }
2✔
104

105
        if pc.GetPolicies() != nil {
8✔
106
                policies := []*domain.ProviderPolicy{}
2✔
107
                for _, p := range pc.GetPolicies() {
4✔
108
                        policies = append(policies, &domain.ProviderPolicy{
2✔
109
                                When:   p.GetWhen(),
2✔
110
                                Policy: p.GetPolicy(),
2✔
111
                        })
2✔
112
                }
2✔
113
                providerConfig.Policies = policies
2✔
114
        }
115

116
        return providerConfig
6✔
117
}
118

119
func (a *adapter) ToProviderProto(p *domain.Provider) (*guardianv1beta1.Provider, error) {
8✔
120
        providerProto := &guardianv1beta1.Provider{
8✔
121
                Id:   p.ID,
8✔
122
                Type: p.Type,
8✔
123
                Urn:  p.URN,
8✔
124
        }
8✔
125

8✔
126
        if p.Config != nil {
16✔
127
                config, err := a.ToProviderConfigProto(p.Config)
8✔
128
                if err != nil {
12✔
129
                        return nil, err
4✔
130
                }
4✔
131
                providerProto.Config = config
4✔
132
        }
133

134
        if !p.CreatedAt.IsZero() {
8✔
135
                providerProto.CreatedAt = timestamppb.New(p.CreatedAt)
4✔
136
        }
4✔
137
        if !p.UpdatedAt.IsZero() {
8✔
138
                providerProto.UpdatedAt = timestamppb.New(p.UpdatedAt)
4✔
139
        }
4✔
140

141
        return providerProto, nil
4✔
142
}
143

144
func (a *adapter) ToProviderConfigProto(pc *domain.ProviderConfig) (*guardianv1beta1.ProviderConfig, error) {
8✔
145
        providerConfigProto := &guardianv1beta1.ProviderConfig{
8✔
146
                Type:   pc.Type,
8✔
147
                Urn:    pc.URN,
8✔
148
                Labels: pc.Labels,
8✔
149
        }
8✔
150

8✔
151
        if pc.Credentials != nil {
11✔
152
                credentials, err := structpb.NewValue(pc.Credentials)
3✔
153
                if err != nil {
6✔
154
                        return nil, err
3✔
155
                }
3✔
156
                providerConfigProto.Credentials = credentials
×
157
        }
158

159
        if pc.Appeal != nil {
7✔
160
                providerConfigProto.Appeal = &guardianv1beta1.ProviderConfig_AppealConfig{
2✔
161
                        AllowPermanentAccess:         pc.Appeal.AllowPermanentAccess,
2✔
162
                        AllowActiveAccessExtensionIn: pc.Appeal.AllowActiveAccessExtensionIn,
2✔
163
                }
2✔
164
        }
2✔
165

166
        if pc.Resources != nil {
10✔
167
                resources := []*guardianv1beta1.ProviderConfig_ResourceConfig{}
5✔
168
                for _, rc := range pc.Resources {
10✔
169
                        roles := []*guardianv1beta1.Role{}
5✔
170
                        for _, role := range rc.Roles {
10✔
171
                                roleProto, err := a.ToRole(role)
5✔
172
                                if err != nil {
6✔
173
                                        return nil, err
1✔
174
                                }
1✔
175
                                roles = append(roles, roleProto)
4✔
176
                        }
177

178
                        resources = append(resources, &guardianv1beta1.ProviderConfig_ResourceConfig{
4✔
179
                                Type:   rc.Type,
4✔
180
                                Policy: a.toPolicyConfigProto(rc.Policy),
4✔
181
                                Roles:  roles,
4✔
182
                        })
4✔
183
                }
184
                providerConfigProto.Resources = resources
4✔
185
        }
186

187
        if pc.Parameters != nil {
5✔
188
                parameters := []*guardianv1beta1.ProviderConfig_ProviderParameter{}
1✔
189
                for _, p := range pc.Parameters {
2✔
190
                        parameters = append(parameters, &guardianv1beta1.ProviderConfig_ProviderParameter{
1✔
191
                                Key:         p.Key,
1✔
192
                                Label:       p.Label,
1✔
193
                                Required:    p.Required,
1✔
194
                                Description: p.Description,
1✔
195
                        })
1✔
196
                }
1✔
197
                providerConfigProto.Parameters = parameters
1✔
198
        }
199

200
        if pc.AllowedAccountTypes != nil {
8✔
201
                providerConfigProto.AllowedAccountTypes = pc.AllowedAccountTypes
4✔
202
        }
4✔
203

204
        if pc.Policies != nil {
8✔
205
                policies := []*guardianv1beta1.ProviderPolicy{}
4✔
206
                for _, p := range pc.Policies {
8✔
207
                        policies = append(policies, &guardianv1beta1.ProviderPolicy{
4✔
208
                                Policy: p.Policy,
4✔
209
                                When:   p.When,
4✔
210
                        })
4✔
211
                }
4✔
212
                providerConfigProto.Policies = policies
4✔
213
        }
214

215
        return providerConfigProto, nil
4✔
216
}
217

218
func (a *adapter) ToProviderTypeProto(pt domain.ProviderType) *guardianv1beta1.ProviderType {
1✔
219
        return &guardianv1beta1.ProviderType{
1✔
220
                Name:          pt.Name,
1✔
221
                ResourceTypes: pt.ResourceTypes,
1✔
222
        }
1✔
223
}
1✔
224

225
func (a *adapter) ToRole(role *domain.Role) (*guardianv1beta1.Role, error) {
7✔
226
        roleProto := &guardianv1beta1.Role{
7✔
227
                Id:          role.ID,
7✔
228
                Name:        role.Name,
7✔
229
                Description: role.Description,
7✔
230
        }
7✔
231

7✔
232
        if role.Permissions != nil {
10✔
233
                permissions := []*structpb.Value{}
3✔
234
                for _, p := range role.Permissions {
6✔
235
                        permission, err := structpb.NewValue(p)
3✔
236
                        if err != nil {
5✔
237
                                return nil, err
2✔
238
                        }
2✔
239
                        permissions = append(permissions, permission)
1✔
240
                }
241
                roleProto.Permissions = permissions
1✔
242
        }
243

244
        return roleProto, nil
5✔
245
}
246

247
func (a *adapter) FromPolicyProto(p *guardianv1beta1.Policy) *domain.Policy {
8✔
248
        policy := &domain.Policy{
8✔
249
                ID:          p.GetId(),
8✔
250
                Version:     uint(p.GetVersion()),
8✔
251
                Description: p.GetDescription(),
8✔
252
                Labels:      p.GetLabels(),
8✔
253
        }
8✔
254

8✔
255
        if p.GetSteps() != nil {
10✔
256
                var steps []*domain.Step
2✔
257
                for _, s := range p.GetSteps() {
4✔
258
                        steps = append(steps, &domain.Step{
2✔
259
                                Name:                  s.GetName(),
2✔
260
                                Description:           s.GetDescription(),
2✔
261
                                When:                  s.GetWhen(),
2✔
262
                                Strategy:              domain.ApprovalStepStrategy(s.GetStrategy()),
2✔
263
                                RejectionReason:       s.GetRejectionReason(),
2✔
264
                                ApproveIf:             s.GetApproveIf(),
2✔
265
                                AllowFailed:           s.GetAllowFailed(),
2✔
266
                                Approvers:             s.GetApprovers(),
2✔
267
                                DontAllowSelfApproval: s.GetDontAllowSelfApproval(),
2✔
268
                        })
2✔
269
                }
2✔
270
                policy.Steps = steps
2✔
271
        }
272

273
        if p.GetRequirements() != nil {
10✔
274
                var requirements []*domain.Requirement
2✔
275
                for _, r := range p.GetRequirements() {
4✔
276
                        var on *domain.RequirementTrigger
2✔
277
                        if r.GetOn() != nil {
4✔
278
                                var conditions []*domain.Condition
2✔
279
                                if r.GetOn().GetConditions() != nil {
2✔
280
                                        for _, c := range r.GetOn().GetConditions() {
×
281
                                                conditions = append(conditions, a.fromConditionProto(c))
×
282
                                        }
×
283
                                }
284

285
                                on = &domain.RequirementTrigger{
2✔
286
                                        ProviderType: r.GetOn().GetProviderType(),
2✔
287
                                        ProviderURN:  r.GetOn().GetProviderUrn(),
2✔
288
                                        ResourceType: r.GetOn().GetResourceType(),
2✔
289
                                        ResourceURN:  r.GetOn().GetResourceUrn(),
2✔
290
                                        Role:         r.GetOn().GetRole(),
2✔
291
                                        Conditions:   conditions,
2✔
292
                                        Expression:   r.GetOn().GetExpression(),
2✔
293
                                }
2✔
294
                        }
295

296
                        var additionalAppeals []*domain.AdditionalAppeal
2✔
297
                        if r.GetAppeals() != nil {
4✔
298
                                for _, aa := range r.GetAppeals() {
4✔
299
                                        var resource *domain.ResourceIdentifier
2✔
300
                                        if aa.GetResource() != nil {
4✔
301
                                                resource = &domain.ResourceIdentifier{
2✔
302
                                                        ProviderType: aa.GetResource().GetProviderType(),
2✔
303
                                                        ProviderURN:  aa.GetResource().GetProviderUrn(),
2✔
304
                                                        Type:         aa.GetResource().GetType(),
2✔
305
                                                        URN:          aa.GetResource().GetUrn(),
2✔
306
                                                        ID:           aa.GetResource().GetId(),
2✔
307
                                                }
2✔
308
                                        }
2✔
309

310
                                        additionalAppeals = append(additionalAppeals, &domain.AdditionalAppeal{
2✔
311
                                                Resource:    resource,
2✔
312
                                                Role:        aa.GetRole(),
2✔
313
                                                Options:     a.fromAppealOptionsProto(aa.GetOptions()),
2✔
314
                                                Policy:      a.fromPolicyConfigProto(aa.GetPolicy()),
2✔
315
                                                AccountType: aa.GetAccountType(),
2✔
316
                                        })
2✔
317
                                }
318
                        }
319

320
                        requirements = append(requirements, &domain.Requirement{
2✔
321
                                On:      on,
2✔
322
                                Appeals: additionalAppeals,
2✔
323
                        })
2✔
324
                        policy.Requirements = requirements
2✔
325
                }
326
        }
327

328
        if p.GetIam() != nil {
10✔
329
                policy.IAM = &domain.IAMConfig{
2✔
330
                        Provider: domain.IAMProviderType(p.GetIam().GetProvider()),
2✔
331
                        Config:   p.GetIam().GetConfig().AsInterface(),
2✔
332
                        Schema:   p.GetIam().GetSchema(),
2✔
333
                }
2✔
334
        }
2✔
335

336
        if p.GetAppeal() != nil {
10✔
337
                var durationOptions []domain.AppealDurationOption
2✔
338
                var questions []domain.Question
2✔
339
                var metadataSources map[string]*domain.AppealMetadataSource
2✔
340
                for _, d := range p.GetAppeal().GetDurationOptions() {
6✔
341
                        option := domain.AppealDurationOption{
4✔
342
                                Name:  d.GetName(),
4✔
343
                                Value: d.GetValue(),
4✔
344
                        }
4✔
345
                        durationOptions = append(durationOptions, option)
4✔
346
                }
4✔
347
                for _, q := range p.GetAppeal().GetQuestions() {
3✔
348
                        question := domain.Question{
1✔
349
                                Key:         q.GetKey(),
1✔
350
                                Question:    q.GetQuestion(),
1✔
351
                                Required:    q.GetRequired(),
1✔
352
                                Description: q.GetDescription(),
1✔
353
                        }
1✔
354
                        questions = append(questions, question)
1✔
355
                }
1✔
356

357
                if mds := p.GetAppeal().GetMetadataSources(); mds != nil {
3✔
358
                        metadataSources = make(map[string]*domain.AppealMetadataSource)
1✔
359
                        for key, metadataCfg := range mds {
2✔
360
                                metadataSources[key] = &domain.AppealMetadataSource{
1✔
361
                                        Name:        metadataCfg.GetName(),
1✔
362
                                        Description: metadataCfg.GetDescription(),
1✔
363
                                        Type:        metadataCfg.GetType(),
1✔
364
                                        Config:      metadataCfg.GetConfig().AsInterface(),
1✔
365
                                        Value:       metadataCfg.GetValue().AsInterface(),
1✔
366
                                }
1✔
367
                        }
1✔
368
                }
369

370
                policy.AppealConfig = &domain.PolicyAppealConfig{
2✔
371
                        DurationOptions:              durationOptions,
2✔
372
                        AllowOnBehalf:                p.GetAppeal().GetAllowOnBehalf(),
2✔
373
                        Questions:                    questions,
2✔
374
                        AllowPermanentAccess:         p.GetAppeal().GetAllowPermanentAccess(),
2✔
375
                        AllowActiveAccessExtensionIn: p.GetAppeal().GetAllowActiveAccessExtensionIn(),
2✔
376
                        AllowCreatorDetailsFailure:   p.GetAppeal().GetAllowCreatorDetailsFailure(),
2✔
377
                        MetadataSources:              metadataSources,
2✔
378
                }
2✔
379
        }
380

381
        if p.GetCreatedAt() != nil {
8✔
382
                policy.CreatedAt = p.GetCreatedAt().AsTime()
×
383
        }
×
384
        if p.GetUpdatedAt() != nil {
8✔
385
                policy.UpdatedAt = p.GetUpdatedAt().AsTime()
×
386
        }
×
387

388
        return policy
8✔
389
}
390

391
func (a *adapter) ToPolicyProto(p *domain.Policy) (*guardianv1beta1.Policy, error) {
8✔
392
        policyProto := &guardianv1beta1.Policy{
8✔
393
                Id:          p.ID,
8✔
394
                Version:     uint32(p.Version),
8✔
395
                Description: p.Description,
8✔
396
                Labels:      p.Labels,
8✔
397
        }
8✔
398

8✔
399
        if p.Steps != nil {
12✔
400
                var steps []*guardianv1beta1.Policy_ApprovalStep
4✔
401
                for _, s := range p.Steps {
8✔
402
                        steps = append(steps, &guardianv1beta1.Policy_ApprovalStep{
4✔
403
                                Name:                  s.Name,
4✔
404
                                Description:           s.Description,
4✔
405
                                When:                  s.When,
4✔
406
                                Strategy:              string(s.Strategy),
4✔
407
                                RejectionReason:       s.RejectionReason,
4✔
408
                                ApproveIf:             s.ApproveIf,
4✔
409
                                AllowFailed:           s.AllowFailed,
4✔
410
                                Approvers:             s.Approvers,
4✔
411
                                DontAllowSelfApproval: s.DontAllowSelfApproval,
4✔
412
                        })
4✔
413
                }
4✔
414
                policyProto.Steps = steps
4✔
415
        }
416

417
        if p.Requirements != nil {
12✔
418
                var requirements []*guardianv1beta1.Policy_Requirement
4✔
419
                for _, r := range p.Requirements {
8✔
420
                        var on *guardianv1beta1.Policy_Requirement_RequirementTrigger
4✔
421
                        if r.On != nil {
8✔
422
                                var conditions []*guardianv1beta1.Condition
4✔
423
                                if r.On.Conditions != nil {
4✔
424
                                        for _, c := range r.On.Conditions {
×
425
                                                condition, err := a.toConditionProto(c)
×
426
                                                if err != nil {
×
427
                                                        return nil, err
×
428
                                                }
×
429
                                                conditions = append(conditions, condition)
×
430
                                        }
431
                                }
432

433
                                on = &guardianv1beta1.Policy_Requirement_RequirementTrigger{
4✔
434
                                        ProviderType: r.On.ProviderType,
4✔
435
                                        ProviderUrn:  r.On.ProviderURN,
4✔
436
                                        ResourceType: r.On.ResourceType,
4✔
437
                                        ResourceUrn:  r.On.ResourceURN,
4✔
438
                                        Role:         r.On.Role,
4✔
439
                                        Conditions:   conditions,
4✔
440
                                        Expression:   r.On.Expression,
4✔
441
                                }
4✔
442
                        }
443

444
                        var additionalAppeals []*guardianv1beta1.Policy_Requirement_AdditionalAppeal
4✔
445
                        if r.Appeals != nil {
8✔
446
                                for _, aa := range r.Appeals {
8✔
447
                                        var resource *guardianv1beta1.Policy_Requirement_AdditionalAppeal_ResourceIdentifier
4✔
448
                                        if aa.Resource != nil {
8✔
449
                                                resource = &guardianv1beta1.Policy_Requirement_AdditionalAppeal_ResourceIdentifier{
4✔
450
                                                        ProviderType: aa.Resource.ProviderType,
4✔
451
                                                        ProviderUrn:  aa.Resource.ProviderURN,
4✔
452
                                                        Type:         aa.Resource.Type,
4✔
453
                                                        Urn:          aa.Resource.URN,
4✔
454
                                                        Id:           aa.Resource.ID,
4✔
455
                                                }
4✔
456
                                        }
4✔
457

458
                                        additionalAppeals = append(additionalAppeals, &guardianv1beta1.Policy_Requirement_AdditionalAppeal{
4✔
459
                                                Resource: resource,
4✔
460
                                                Role:     aa.Role,
4✔
461
                                                Options:  a.toAppealOptionsProto(aa.Options),
4✔
462
                                                Policy:   a.toPolicyConfigProto(aa.Policy),
4✔
463
                                        })
4✔
464
                                }
465
                        }
466

467
                        requirements = append(requirements, &guardianv1beta1.Policy_Requirement{
4✔
468
                                On:      on,
4✔
469
                                Appeals: additionalAppeals,
4✔
470
                        })
4✔
471
                        policyProto.Requirements = requirements
4✔
472
                }
473
        }
474

475
        if p.HasIAMConfig() {
15✔
476
                config, err := structpb.NewValue(p.IAM.Config)
7✔
477
                if err != nil {
9✔
478
                        return nil, err
2✔
479
                }
2✔
480

481
                policyProto.Iam = &guardianv1beta1.Policy_IAM{
5✔
482
                        Provider: string(p.IAM.Provider),
5✔
483
                        Config:   config,
5✔
484
                        Schema:   p.IAM.Schema,
5✔
485
                }
5✔
486
        }
487

488
        appealConfig, err := a.ToPolicyAppealConfigProto(p)
6✔
489
        if err != nil {
6✔
490
                return nil, fmt.Errorf("failed to convert appeal config to proto: %w", err)
×
491
        }
×
492
        policyProto.Appeal = appealConfig
6✔
493

6✔
494
        if !p.CreatedAt.IsZero() {
10✔
495
                policyProto.CreatedAt = timestamppb.New(p.CreatedAt)
4✔
496
        }
4✔
497
        if !p.UpdatedAt.IsZero() {
10✔
498
                policyProto.UpdatedAt = timestamppb.New(p.UpdatedAt)
4✔
499
        }
4✔
500

501
        return policyProto, nil
6✔
502
}
503

504
func (a *adapter) ToPolicyAppealConfigProto(p *domain.Policy) (*guardianv1beta1.PolicyAppealConfig, error) {
7✔
505
        if p.AppealConfig == nil {
8✔
506
                return nil, nil
1✔
507
        }
1✔
508

509
        policyAppealConfigProto := &guardianv1beta1.PolicyAppealConfig{}
6✔
510
        var durationOptions []*guardianv1beta1.PolicyAppealConfig_DurationOptions
6✔
511
        if p.AppealConfig.DurationOptions != nil {
10✔
512
                for _, d := range p.AppealConfig.DurationOptions {
12✔
513
                        durationOptions = append(durationOptions, &guardianv1beta1.PolicyAppealConfig_DurationOptions{
8✔
514
                                Name:  d.Name,
8✔
515
                                Value: d.Value,
8✔
516
                        })
8✔
517
                }
8✔
518
        }
519
        policyAppealConfigProto.DurationOptions = durationOptions
6✔
520
        policyAppealConfigProto.AllowOnBehalf = p.AppealConfig.AllowOnBehalf
6✔
521
        policyAppealConfigProto.AllowPermanentAccess = p.AppealConfig.AllowPermanentAccess
6✔
522
        policyAppealConfigProto.AllowActiveAccessExtensionIn = p.AppealConfig.AllowActiveAccessExtensionIn
6✔
523
        policyAppealConfigProto.AllowCreatorDetailsFailure = p.AppealConfig.AllowCreatorDetailsFailure
6✔
524

6✔
525
        for _, q := range p.AppealConfig.Questions {
7✔
526
                policyAppealConfigProto.Questions = append(policyAppealConfigProto.Questions, &guardianv1beta1.PolicyAppealConfig_Question{
1✔
527
                        Key:         q.Key,
1✔
528
                        Question:    q.Question,
1✔
529
                        Required:    q.Required,
1✔
530
                        Description: q.Description,
1✔
531
                })
1✔
532
        }
1✔
533

534
        for key, metadataSource := range p.AppealConfig.MetadataSources {
9✔
535
                if policyAppealConfigProto.MetadataSources == nil {
6✔
536
                        policyAppealConfigProto.MetadataSources = make(map[string]*guardianv1beta1.PolicyAppealConfig_MetadataSource)
3✔
537
                }
3✔
538
                policyAppealConfigProto.MetadataSources[key] = &guardianv1beta1.PolicyAppealConfig_MetadataSource{
3✔
539
                        Name:        metadataSource.Name,
3✔
540
                        Description: metadataSource.Description,
3✔
541
                        Type:        metadataSource.Type,
3✔
542
                }
3✔
543

3✔
544
                if metadataSource.Config != nil {
4✔
545
                        cfg, err := structpb.NewValue(metadataSource.Config)
1✔
546
                        if err != nil {
1✔
547
                                return nil, err
×
548
                        }
×
549
                        policyAppealConfigProto.MetadataSources[key].Config = cfg
1✔
550
                }
551
                if metadataSource.Value != nil {
4✔
552
                        value, err := structpb.NewValue(metadataSource.Value)
1✔
553
                        if err != nil {
1✔
554
                                return nil, err
×
555
                        }
×
556
                        policyAppealConfigProto.MetadataSources[key].Value = value
1✔
557
                }
558
        }
559

560
        return policyAppealConfigProto, nil
6✔
561
}
562

563
func (a *adapter) FromResourceProto(r *guardianv1beta1.Resource) *domain.Resource {
4✔
564
        resource := &domain.Resource{
4✔
565
                ID:           r.GetId(),
4✔
566
                ProviderType: r.GetProviderType(),
4✔
567
                ProviderURN:  r.GetProviderUrn(),
4✔
568
                Type:         r.GetType(),
4✔
569
                URN:          r.GetUrn(),
4✔
570
                Name:         r.GetName(),
4✔
571
                Labels:       r.GetLabels(),
4✔
572
                IsDeleted:    r.GetIsDeleted(),
4✔
573
        }
4✔
574

4✔
575
        if r.GetParentId() != "" {
4✔
576
                id := r.GetParentId()
×
577
                resource.ParentID = &id
×
578
        }
×
579

580
        if r.GetChildren() != nil {
4✔
581
                for _, c := range r.GetChildren() {
×
582
                        resource.Children = append(resource.Children, a.FromResourceProto(c))
×
583
                }
×
584
        }
585

586
        if r.GetDetails() != nil {
4✔
587
                resource.Details = r.GetDetails().AsMap()
×
588
        }
×
589

590
        if r.GetCreatedAt() != nil {
4✔
591
                resource.CreatedAt = r.GetCreatedAt().AsTime()
×
592
        }
×
593
        if r.GetUpdatedAt() != nil {
4✔
594
                resource.UpdatedAt = r.GetUpdatedAt().AsTime()
×
595
        }
×
596

597
        return resource
4✔
598
}
599

600
func (a *adapter) ToResourceProto(r *domain.Resource) (*guardianv1beta1.Resource, error) {
26✔
601
        resourceProto := &guardianv1beta1.Resource{
26✔
602
                Id:           r.ID,
26✔
603
                ProviderType: r.ProviderType,
26✔
604
                ProviderUrn:  r.ProviderURN,
26✔
605
                Type:         r.Type,
26✔
606
                Urn:          r.URN,
26✔
607
                Name:         r.Name,
26✔
608
                Labels:       r.Labels,
26✔
609
                IsDeleted:    r.IsDeleted,
26✔
610
        }
26✔
611

26✔
612
        if r.ParentID != nil {
26✔
613
                resourceProto.ParentId = *r.ParentID
×
614
        }
×
615

616
        if r.GlobalURN != "" {
27✔
617
                resourceProto.GlobalUrn = r.GlobalURN
1✔
618
        }
1✔
619

620
        if r.Children != nil {
26✔
621
                for _, c := range r.Children {
×
622
                        childProto, err := a.ToResourceProto(c)
×
623
                        if err != nil {
×
624
                                return nil, fmt.Errorf("failed to convert child resource to proto %q: %w", c.ID, err)
×
625
                        }
×
626
                        resourceProto.Children = append(resourceProto.Children, childProto)
×
627
                }
628
        }
629

630
        if r.Details != nil {
32✔
631
                details, err := structpb.NewStruct(r.Details)
6✔
632
                if err != nil {
11✔
633
                        return nil, err
5✔
634
                }
5✔
635
                resourceProto.Details = details
1✔
636
        }
637

638
        if !r.CreatedAt.IsZero() {
24✔
639
                resourceProto.CreatedAt = timestamppb.New(r.CreatedAt)
3✔
640
        }
3✔
641
        if !r.UpdatedAt.IsZero() {
24✔
642
                resourceProto.UpdatedAt = timestamppb.New(r.UpdatedAt)
3✔
643
        }
3✔
644

645
        return resourceProto, nil
21✔
646
}
647

648
func (a *adapter) ToAppealProto(appeal *domain.Appeal) (*guardianv1beta1.Appeal, error) {
28✔
649
        appealProto := &guardianv1beta1.Appeal{
28✔
650
                Id:            appeal.ID,
28✔
651
                ResourceId:    appeal.ResourceID,
28✔
652
                PolicyId:      appeal.PolicyID,
28✔
653
                PolicyVersion: uint32(appeal.PolicyVersion),
28✔
654
                Status:        appeal.Status,
28✔
655
                AccountId:     appeal.AccountID,
28✔
656
                AccountType:   appeal.AccountType,
28✔
657
                GroupId:       appeal.GroupID,
28✔
658
                GroupType:     appeal.GroupType,
28✔
659
                CreatedBy:     appeal.CreatedBy,
28✔
660
                Role:          appeal.Role,
28✔
661
                Permissions:   appeal.Permissions,
28✔
662
                Options:       a.toAppealOptionsProto(appeal.Options),
28✔
663
                Labels:        appeal.Labels,
28✔
664
                Description:   appeal.Description,
28✔
665
                Revision:      uint32(appeal.Revision),
28✔
666
        }
28✔
667

28✔
668
        if appeal.Resource != nil {
42✔
669
                r, err := a.ToResourceProto(appeal.Resource)
14✔
670
                if err != nil {
14✔
UNCOV
671
                        return nil, err
×
UNCOV
672
                }
×
673
                appealProto.Resource = r
14✔
674
        }
675

676
        if appeal.Creator != nil {
47✔
677
                creator, err := structpb.NewValue(appeal.Creator)
19✔
678
                if err != nil {
29✔
679
                        return nil, err
10✔
680
                }
10✔
681
                appealProto.Creator = creator
9✔
682
        }
683

684
        if appeal.Approvals != nil {
27✔
685
                approvals := []*guardianv1beta1.Approval{}
9✔
686
                for _, approval := range appeal.Approvals {
18✔
687
                        approvalProto, err := a.ToApprovalProto(approval)
9✔
688
                        if err != nil {
9✔
UNCOV
689
                                return nil, err
×
UNCOV
690
                        }
×
691

692
                        approvals = append(approvals, approvalProto)
9✔
693
                }
694
                appealProto.Approvals = approvals
9✔
695
        }
696

697
        if appeal.Details != nil {
30✔
698
                details, err := structpb.NewStruct(appeal.Details)
12✔
699
                if err != nil {
12✔
UNCOV
700
                        return nil, err
×
UNCOV
701
                }
×
702
                appealProto.Details = details
12✔
703
        }
704

705
        if !appeal.CreatedAt.IsZero() {
31✔
706
                appealProto.CreatedAt = timestamppb.New(appeal.CreatedAt)
13✔
707
        }
13✔
708
        if !appeal.UpdatedAt.IsZero() {
31✔
709
                appealProto.UpdatedAt = timestamppb.New(appeal.UpdatedAt)
13✔
710
        }
13✔
711

712
        grantProto, err := a.ToGrantProto(appeal.Grant)
18✔
713
        if err != nil {
18✔
UNCOV
714
                return nil, fmt.Errorf("parsing grant: %w", err)
×
UNCOV
715
        }
×
716
        appealProto.Grant = grantProto
18✔
717

18✔
718
        return appealProto, nil
18✔
719
}
720

721
func (a *adapter) FromCreateAppealProto(ca *guardianv1beta1.CreateAppealRequest, authenticatedUser string) ([]*domain.Appeal, error) {
5✔
722
        var appeals []*domain.Appeal
5✔
723

5✔
724
        for _, r := range ca.GetResources() {
8✔
725
                appeal := &domain.Appeal{
3✔
726
                        AccountID:   ca.GetAccountId(),
3✔
727
                        AccountType: ca.GetAccountType(),
3✔
728
                        GroupID:     r.GetGroupId(),
3✔
729
                        GroupType:   r.GetGroupType(),
3✔
730
                        CreatedBy:   authenticatedUser,
3✔
731
                        ResourceID:  r.GetId(),
3✔
732
                        Role:        r.GetRole(),
3✔
733
                        Description: ca.GetDescription(),
3✔
734
                }
3✔
735

3✔
736
                if r.GetOptions() != nil {
5✔
737
                        var options *domain.AppealOptions
2✔
738
                        if err := mapstructure.Decode(r.GetOptions().AsMap(), &options); err != nil {
2✔
UNCOV
739
                                return nil, err
×
UNCOV
740
                        }
×
741
                        appeal.Options = options
2✔
742
                }
743

744
                if r.GetDetails() != nil {
5✔
745
                        appeal.Details = r.GetDetails().AsMap()
2✔
746
                }
2✔
747

748
                appeals = append(appeals, appeal)
3✔
749
        }
750

751
        return appeals, nil
5✔
752
}
753

754
func (a *adapter) FromPatchAppealProto(ua *guardianv1beta1.PatchAppealRequest, authenticatedUser string) (*domain.Appeal, error) {
2✔
755
        appeal := &domain.Appeal{
2✔
756
                ID:          ua.GetId(),
2✔
757
                AccountID:   ua.GetAccountId(),
2✔
758
                AccountType: ua.GetAccountType(),
2✔
759
                CreatedBy:   authenticatedUser,
2✔
760
                ResourceID:  ua.GetResourceId(),
2✔
761
                Role:        ua.GetRole(),
2✔
762
                Description: ua.GetDescription(),
2✔
763
        }
2✔
764

2✔
765
        if ua.GetOptions() != nil {
3✔
766
                var options *domain.AppealOptions
1✔
767
                if err := mapstructure.Decode(ua.GetOptions().AsMap(), &options); err != nil {
1✔
UNCOV
768
                        return nil, err
×
UNCOV
769
                }
×
770
                appeal.Options = options
1✔
771
        }
772

773
        if ua.GetDetails() != nil {
3✔
774
                appeal.Details = ua.GetDetails().AsMap()
1✔
775
        }
1✔
776

777
        return appeal, nil
2✔
778
}
779

780
func (a *adapter) ToApprovalProto(approval *domain.Approval) (*guardianv1beta1.Approval, error) {
13✔
781
        approvalProto := &guardianv1beta1.Approval{
13✔
782
                Id:             approval.ID,
13✔
783
                Name:           approval.Name,
13✔
784
                AppealId:       approval.AppealID,
13✔
785
                Status:         approval.Status,
13✔
786
                Reason:         approval.Reason,
13✔
787
                PolicyId:       approval.PolicyID,
13✔
788
                PolicyVersion:  uint32(approval.PolicyVersion),
13✔
789
                Approvers:      approval.Approvers,
13✔
790
                CreatedAt:      timestamppb.New(approval.CreatedAt),
13✔
791
                UpdatedAt:      timestamppb.New(approval.UpdatedAt),
13✔
792
                IsStale:        approval.IsStale,
13✔
793
                AppealRevision: uint32(approval.AppealRevision),
13✔
794
        }
13✔
795

13✔
796
        if approval.Appeal != nil {
17✔
797
                appeal, err := a.ToAppealProto(approval.Appeal)
4✔
798
                if err != nil {
6✔
799
                        return nil, err
2✔
800
                }
2✔
801
                approvalProto.Appeal = appeal
2✔
802
        }
803

804
        if approval.Actor != nil {
12✔
805
                approvalProto.Actor = *approval.Actor
1✔
806
        }
1✔
807

808
        if !approval.CreatedAt.IsZero() {
22✔
809
                approvalProto.CreatedAt = timestamppb.New(approval.CreatedAt)
11✔
810
        }
11✔
811
        if !approval.UpdatedAt.IsZero() {
22✔
812
                approvalProto.UpdatedAt = timestamppb.New(approval.UpdatedAt)
11✔
813
        }
11✔
814

815
        return approvalProto, nil
11✔
816
}
817

UNCOV
818
func (a *adapter) FromGrantProto(g *guardianv1beta1.Grant) *domain.Grant {
×
819
        if g == nil {
×
820
                return nil
×
821
        }
×
822

823
        grant := &domain.Grant{
×
824
                ID:                   g.GetId(),
×
825
                Status:               domain.GrantStatus(g.GetStatus()),
×
826
                StatusInProvider:     domain.GrantStatus(g.GetStatusInProvider()),
×
827
                AccountID:            g.GetAccountId(),
×
828
                AccountType:          g.GetAccountType(),
×
829
                GroupID:              g.GetGroupId(),
×
830
                GroupType:            g.GetGroupType(),
×
831
                ResourceID:           g.GetResourceId(),
×
832
                Role:                 g.GetRole(),
×
833
                Permissions:          g.GetPermissions(),
×
834
                AppealID:             g.GetAppealId(),
×
835
                Source:               domain.GrantSource(g.Source),
×
836
                RevokedBy:            g.GetRevokedBy(),
×
837
                RevokeReason:         g.GetRevokeReason(),
×
838
                CreatedBy:            g.GetCreatedBy(),
×
839
                Owner:                g.GetOwner(),
×
840
                Resource:             a.FromResourceProto(g.GetResource()),
×
841
                ExpirationDateReason: g.GetExpirationDateReason(),
×
842
                RestoreReason:        g.GetRestoreReason(),
×
843
                RestoredBy:           g.GetRestoredBy(),
×
844
        }
×
845

×
846
        if g.GetExpirationDate() != nil {
×
847
                t := g.GetExpirationDate().AsTime()
×
848
                grant.ExpirationDate = &t
×
849
        }
×
850
        if g.GetRevokedAt() != nil {
×
851
                t := g.GetRevokedAt().AsTime()
×
852
                grant.RevokedAt = &t
×
853
        }
×
854
        if g.GetCreatedAt() != nil {
×
855
                grant.CreatedAt = g.GetCreatedAt().AsTime()
×
856
        }
×
857
        if g.GetUpdatedAt() != nil {
×
UNCOV
858
                grant.UpdatedAt = g.GetUpdatedAt().AsTime()
×
859
        }
×
UNCOV
860
        if g.GetRestoredAt() != nil {
×
UNCOV
861
                t := g.GetRestoredAt().AsTime()
×
UNCOV
862
                grant.RestoredAt = &t
×
UNCOV
863
        }
×
864

UNCOV
865
        return grant
×
866
}
867

868
func (a *adapter) ToGrantProto(grant *domain.Grant) (*guardianv1beta1.Grant, error) {
27✔
869
        if grant == nil {
45✔
870
                return nil, nil
18✔
871
        }
18✔
872

873
        grantProto := &guardianv1beta1.Grant{
9✔
874
                Id:                   grant.ID,
9✔
875
                Status:               string(grant.Status),
9✔
876
                StatusInProvider:     string(grant.StatusInProvider),
9✔
877
                AccountId:            grant.AccountID,
9✔
878
                AccountType:          grant.AccountType,
9✔
879
                GroupId:              grant.GroupID,
9✔
880
                GroupType:            grant.GroupType,
9✔
881
                ResourceId:           grant.ResourceID,
9✔
882
                Role:                 grant.Role,
9✔
883
                Permissions:          grant.Permissions,
9✔
884
                IsPermanent:          grant.IsPermanent,
9✔
885
                AppealId:             grant.AppealID,
9✔
886
                Source:               string(grant.Source),
9✔
887
                RevokedBy:            grant.RevokedBy,
9✔
888
                RevokeReason:         grant.RevokeReason,
9✔
889
                CreatedBy:            grant.CreatedBy,
9✔
890
                Owner:                grant.Owner,
9✔
891
                ExpirationDateReason: grant.ExpirationDateReason,
9✔
892
                RestoreReason:        grant.RestoreReason,
9✔
893
                RestoredBy:           grant.RestoredBy,
9✔
894
        }
9✔
895

9✔
896
        if grant.ExpirationDate != nil {
13✔
897
                grantProto.ExpirationDate = timestamppb.New(*grant.ExpirationDate)
4✔
898
        }
4✔
899
        if grant.RevokedAt != nil {
12✔
900
                grantProto.RevokedAt = timestamppb.New(*grant.RevokedAt)
3✔
901
        }
3✔
902
        if !grant.CreatedAt.IsZero() {
13✔
903
                grantProto.CreatedAt = timestamppb.New(grant.CreatedAt)
4✔
904
        }
4✔
905
        if !grant.UpdatedAt.IsZero() {
16✔
906
                grantProto.UpdatedAt = timestamppb.New(grant.UpdatedAt)
7✔
907
        }
7✔
908
        if grant.Resource != nil {
15✔
909
                resourceProto, err := a.ToResourceProto(grant.Resource)
6✔
910
                if err != nil {
8✔
911
                        return nil, fmt.Errorf("parsing resource: %w", err)
2✔
912
                }
2✔
913
                grantProto.Resource = resourceProto
4✔
914
        }
915
        if grant.Appeal != nil {
11✔
916
                appealProto, err := a.ToAppealProto(grant.Appeal)
4✔
917
                if err != nil {
4✔
UNCOV
918
                        return nil, fmt.Errorf("parsing appeal: %w", err)
×
UNCOV
919
                }
×
920
                grantProto.Appeal = appealProto
4✔
921
        }
922
        if grant.RestoredAt != nil {
7✔
923
                grantProto.RestoredAt = timestamppb.New(*grant.RestoredAt)
×
924
        }
×
925

926
        return grantProto, nil
7✔
927
}
928

929
func (a *adapter) FromUpdateGrantRequestProto(grantUpdate *guardianv1beta1.UpdateGrantRequest) *domain.GrantUpdate {
4✔
930
        if grantUpdate == nil {
4✔
UNCOV
931
                return nil
×
UNCOV
932
        }
×
933

934
        gu := &domain.GrantUpdate{
4✔
935
                ID:                   grantUpdate.GetId(),
4✔
936
                ExpirationDateReason: grantUpdate.ExpirationDateReason,
4✔
937
        }
4✔
938
        if grantUpdate.GetOwner() != "" {
8✔
939
                gu.Owner = &grantUpdate.Owner
4✔
940
        }
4✔
941

942
        if grantUpdate.ExpirationDate != nil {
4✔
943
                expDate := grantUpdate.GetExpirationDate().AsTime()
×
944
                gu.ExpirationDate = &expDate
×
945
        }
×
946

947
        return gu
4✔
948
}
949

950
func (a *adapter) ToActivityProto(activity *domain.Activity) (*guardianv1beta1.ProviderActivity, error) {
×
951
        if activity == nil {
×
952
                return nil, nil
×
953
        }
×
954

955
        activityProto := &guardianv1beta1.ProviderActivity{
×
956
                Id:                 activity.ID,
×
957
                ProviderId:         activity.ProviderID,
×
958
                ResourceId:         activity.ResourceID,
×
959
                ProviderActivityId: activity.ProviderActivityID,
×
960
                AccountType:        activity.AccountType,
×
961
                AccountId:          activity.AccountID,
×
UNCOV
962
                Authorizations:     activity.Authorizations,
×
963
                RelatedPermissions: activity.RelatedPermissions,
×
964
                Type:               activity.Type,
×
965
        }
×
966

×
967
        if !activity.Timestamp.IsZero() {
×
968
                activityProto.Timestamp = timestamppb.New(activity.Timestamp)
×
UNCOV
969
        }
×
970

971
        if activity.Metadata != nil {
×
972
                metadataStruct, err := structpb.NewStruct(activity.Metadata)
×
973
                if err != nil {
×
UNCOV
974
                        return nil, fmt.Errorf("parsing metadata: %w", err)
×
975
                }
×
976
                activityProto.Metadata = metadataStruct
×
977
        }
978

979
        if !activity.CreatedAt.IsZero() {
×
980
                activityProto.CreatedAt = timestamppb.New(activity.CreatedAt)
×
UNCOV
981
        }
×
982

983
        if activity.Provider != nil {
×
984
                providerProto, err := a.ToProviderProto(activity.Provider)
×
985
                if err != nil {
×
986
                        return nil, fmt.Errorf("parsing provider: %w", err)
×
987
                }
×
988
                activityProto.Provider = providerProto
×
989
        }
990

991
        if activity.Resource != nil {
×
UNCOV
992
                resourceProto, err := a.ToResourceProto(activity.Resource)
×
UNCOV
993
                if err != nil {
×
UNCOV
994
                        return nil, fmt.Errorf("parsing resource: %w", err)
×
UNCOV
995
                }
×
996
                activityProto.Resource = resourceProto
×
997
        }
998

UNCOV
999
        return activityProto, nil
×
1000
}
1001

1002
func (a *adapter) ToCommentProto(c *domain.Comment) *guardianv1beta1.AppealComment {
3✔
1003
        if c == nil {
3✔
UNCOV
1004
                return nil
×
UNCOV
1005
        }
×
1006

1007
        commentProto := &guardianv1beta1.AppealComment{
3✔
1008
                Id:        c.ID,
3✔
1009
                AppealId:  c.ParentID,
3✔
1010
                CreatedBy: c.CreatedBy,
3✔
1011
                Body:      c.Body,
3✔
1012
        }
3✔
1013

3✔
1014
        if !c.CreatedAt.IsZero() {
6✔
1015
                commentProto.CreatedAt = timestamppb.New(c.CreatedAt)
3✔
1016
        }
3✔
1017
        if !c.UpdatedAt.IsZero() {
6✔
1018
                commentProto.UpdatedAt = timestamppb.New(c.UpdatedAt)
3✔
1019
        }
3✔
1020

1021
        return commentProto
3✔
1022
}
1023

1024
func (a *adapter) fromConditionProto(c *guardianv1beta1.Condition) *domain.Condition {
×
1025
        if c == nil {
×
1026
                return nil
×
UNCOV
1027
        }
×
1028

1029
        var match *domain.MatchCondition
×
1030
        if c.GetMatch() != nil {
×
1031
                match = &domain.MatchCondition{
×
UNCOV
1032
                        Eq: c.GetMatch().GetEq(),
×
UNCOV
1033
                }
×
1034
        }
×
1035

1036
        return &domain.Condition{
×
1037
                Field: c.GetField(),
×
UNCOV
1038
                Match: match,
×
1039
        }
×
1040
}
1041

1042
func (a *adapter) ToAppealActivityProto(e *domain.Event) (*guardianv1beta1.AppealActivity, error) {
×
1043
        if e == nil {
×
1044
                return nil, nil
×
1045
        }
×
1046

1047
        activityProto := &guardianv1beta1.AppealActivity{
×
1048
                AppealId:  e.ParentID,
×
1049
                Timestamp: timestamppb.New(e.Timestamp),
×
1050
                Type:      e.Type,
×
1051
                Actor:     e.Actor,
×
UNCOV
1052
        }
×
1053

×
UNCOV
1054
        if e.Data != nil {
×
UNCOV
1055
                data, err := structpb.NewStruct(e.Data)
×
1056
                if err != nil {
×
1057
                        return nil, err
×
1058
                }
×
1059
                activityProto.Data = data
×
1060
        }
1061
        return activityProto, nil
×
1062
}
1063

1064
func (a *adapter) ToSummaryProto(s *domain.SummaryResult) (*guardianv1beta1.SummaryResult, error) {
×
1065
        if s == nil {
×
1066
                return nil, nil
×
UNCOV
1067
        }
×
1068

1069
        var appliedParameters *guardianv1beta1.SummaryParameters
×
1070
        if s.AppliedParameters != nil {
×
1071
                filters, err := toProtoMap(s.AppliedParameters.Filters)
×
UNCOV
1072
                if err != nil {
×
UNCOV
1073
                        return nil, fmt.Errorf("parsing filters: %w", err)
×
1074
                }
×
1075

1076
                appliedParameters = &guardianv1beta1.SummaryParameters{
×
1077
                        GroupBys: s.AppliedParameters.GroupBys,
×
1078
                        Filters:  filters,
×
1079
                }
×
1080
        }
1081

1082
        summaryProto := &guardianv1beta1.SummaryResult{
×
1083
                AppliedParameters: appliedParameters,
×
1084
                Groups:            make([]*guardianv1beta1.SummaryResult_Group, len(s.SummaryGroups)),
×
UNCOV
1085
                Count:             s.Count,
×
1086
        }
×
1087

×
1088
        for i, group := range s.SummaryGroups {
×
1089
                groupFields, err := toProtoMap(group.GroupFields)
×
UNCOV
1090
                if err != nil {
×
UNCOV
1091
                        return nil, fmt.Errorf("parsing group fields: %w", err)
×
1092
                }
×
1093

UNCOV
1094
                summaryProto.Groups[i] = &guardianv1beta1.SummaryResult_Group{
×
1095
                        GroupFields: groupFields,
×
1096
                        Count:       group.Count,
×
1097
                }
×
1098
        }
1099

1100
        return summaryProto, nil
×
1101
}
1102

1103
func (a *adapter) toConditionProto(c *domain.Condition) (*guardianv1beta1.Condition, error) {
×
1104
        if c == nil {
×
1105
                return nil, nil
×
UNCOV
1106
        }
×
1107

1108
        var match *guardianv1beta1.Condition_MatchCondition
×
1109
        if c.Match != nil {
×
UNCOV
1110
                eq, err := structpb.NewValue(c.Match.Eq)
×
UNCOV
1111
                if err != nil {
×
1112
                        return nil, err
×
1113
                }
×
1114

1115
                match = &guardianv1beta1.Condition_MatchCondition{
×
UNCOV
1116
                        Eq: eq,
×
UNCOV
1117
                }
×
1118
        }
1119

UNCOV
1120
        return &guardianv1beta1.Condition{
×
UNCOV
1121
                Field: c.Field,
×
UNCOV
1122
                Match: match,
×
UNCOV
1123
        }, nil
×
1124
}
1125

1126
func (a *adapter) fromAppealOptionsProto(o *guardianv1beta1.AppealOptions) *domain.AppealOptions {
2✔
1127
        if o == nil {
3✔
1128
                return nil
1✔
1129
        }
1✔
1130

1131
        options := &domain.AppealOptions{
1✔
1132
                Duration: o.GetDuration(),
1✔
1133
        }
1✔
1134

1✔
1135
        if o.GetExpirationDate() != nil {
1✔
UNCOV
1136
                expDate := o.GetExpirationDate().AsTime()
×
UNCOV
1137
                options.ExpirationDate = &expDate
×
UNCOV
1138
        }
×
1139

1140
        return options
1✔
1141
}
1142

1143
func (a *adapter) toAppealOptionsProto(o *domain.AppealOptions) *guardianv1beta1.AppealOptions {
32✔
1144
        if o == nil {
49✔
1145
                return nil
17✔
1146
        }
17✔
1147

1148
        optionsProto := &guardianv1beta1.AppealOptions{
15✔
1149
                Duration: o.Duration,
15✔
1150
        }
15✔
1151

15✔
1152
        if o.ExpirationDate != nil {
26✔
1153
                optionsProto.ExpirationDate = timestamppb.New(*o.ExpirationDate)
11✔
1154
        }
11✔
1155

1156
        return optionsProto
15✔
1157
}
1158

1159
func (a *adapter) fromPolicyConfigProto(c *guardianv1beta1.PolicyConfig) *domain.PolicyConfig {
4✔
1160
        if c == nil {
4✔
UNCOV
1161
                return nil
×
UNCOV
1162
        }
×
1163

1164
        return &domain.PolicyConfig{
4✔
1165
                ID:      c.GetId(),
4✔
1166
                Version: int(c.GetVersion()),
4✔
1167
        }
4✔
1168
}
1169

1170
func (a *adapter) toPolicyConfigProto(c *domain.PolicyConfig) *guardianv1beta1.PolicyConfig {
8✔
1171
        if c == nil {
8✔
UNCOV
1172
                return nil
×
1173
        }
×
1174

1175
        return &guardianv1beta1.PolicyConfig{
8✔
1176
                Id:      c.ID,
8✔
1177
                Version: int32(c.Version),
8✔
1178
        }
8✔
1179
}
1180

1181
func toGoMap(in map[string]*structpb.Value) map[string]any {
×
1182
        out := make(map[string]any, len(in))
×
1183
        for k, v := range in {
×
1184
                out[k] = v.AsInterface()
×
1185
        }
×
1186
        return out
×
1187
}
1188

UNCOV
1189
func toProtoMap(in map[string]any) (map[string]*structpb.Value, error) {
×
1190
        out := make(map[string]*structpb.Value, len(in))
×
UNCOV
1191
        for k, v := range in {
×
UNCOV
1192
                val, err := structpb.NewValue(v)
×
UNCOV
1193
                if err != nil {
×
UNCOV
1194
                        return nil, err
×
UNCOV
1195
                }
×
UNCOV
1196
                out[k] = val
×
1197
        }
UNCOV
1198
        return out, nil
×
1199
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc