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

mindersec / minder / 14376078638

10 Apr 2025 08:39AM UTC coverage: 56.857%. First build
14376078638

Pull #5515

github

web-flow
Merge ea220ae51 into 0f5ecd80e
Pull Request #5515: Don't return errors when getting properties

27 of 49 new or added lines in 22 files covered. (55.1%)

18305 of 32195 relevant lines covered (56.86%)

37.04 hits per line

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

0.0
/internal/providers/github/webhook/handlers_releases.go
1
// SPDX-FileCopyrightText: Copyright 2024 The Minder Authors
2
// SPDX-License-Identifier: Apache-2.0
3

4
package webhook
5

6
import (
7
        "context"
8
        "encoding/json"
9
        "errors"
10
        "fmt"
11

12
        "github.com/mindersec/minder/internal/db"
13
        entityMessage "github.com/mindersec/minder/internal/entities/handlers/message"
14
        ghprop "github.com/mindersec/minder/internal/providers/github/properties"
15
        pb "github.com/mindersec/minder/pkg/api/protobuf/go/minder/v1"
16
        "github.com/mindersec/minder/pkg/entities/properties"
17
        "github.com/mindersec/minder/pkg/eventer/constants"
18
)
19

20
type releaseEvent struct {
21
        Action  *string  `json:"action,omitempty"`
22
        Release *release `json:"release,omitempty"`
23
        Repo    *repo    `json:"repository,omitempty"`
24
}
25

26
func (r *releaseEvent) GetAction() string {
×
27
        if r.Action != nil {
×
28
                return *r.Action
×
29
        }
×
30
        return ""
×
31
}
32

33
func (r *releaseEvent) GetRelease() *release {
×
34
        return r.Release
×
35
}
×
36

37
func (r *releaseEvent) GetRepo() *repo {
×
38
        return r.Repo
×
39
}
×
40

41
type release struct {
42
        ID      *int64  `json:"id,omitempty"`
43
        TagName *string `json:"tag_name,omitempty"`
44
        Target  *string `json:"target_commitish,omitempty"`
45
}
46

47
func (r *release) GetID() int64 {
×
48
        if r.ID != nil {
×
49
                return *r.ID
×
50
        }
×
51
        return 0
×
52
}
53

54
func (r *release) GetTagName() string {
×
55
        if r.TagName != nil {
×
56
                return *r.TagName
×
57
        }
×
58
        return ""
×
59
}
60

61
func (r *release) GetTarget() string {
×
62
        if r.Target != nil {
×
63
                return *r.Target
×
64
        }
×
65
        return ""
×
66
}
67

68
func processReleaseEvent(
69
        ctx context.Context,
70
        payload []byte,
71
) (*processingResult, error) {
×
72
        var event *releaseEvent
×
73
        if err := json.Unmarshal(payload, &event); err != nil {
×
74
                return nil, fmt.Errorf("failed to unmarshal release event: %w", err)
×
75
        }
×
76

77
        if event.GetAction() == "" {
×
78
                return nil, errors.New("release event action not found")
×
79
        }
×
80

81
        if event.GetRelease() == nil {
×
82
                return nil, errors.New("release event release not found")
×
83
        }
×
84

85
        if event.GetRepo() == nil {
×
86
                return nil, errors.New("release event repository not found")
×
87
        }
×
88

89
        if event.GetRelease().GetTagName() == "" {
×
90
                return nil, errors.New("release event tag name not found")
×
91
        }
×
92

93
        if event.GetRelease().GetTarget() == "" {
×
94
                return nil, errors.New("release event target not found")
×
95
        }
×
96

NEW
97
        return sendReleaseEvent(ctx, event), nil
×
98
}
99

100
func sendReleaseEvent(
101
        _ context.Context,
102
        event *releaseEvent,
NEW
103
) *processingResult {
×
NEW
104
        lookByProps := properties.NewProperties(map[string]any{
×
105
                properties.PropertyUpstreamID: properties.NumericalValueToUpstreamID(event.GetRelease().GetID()),
×
106
                ghprop.ReleasePropertyOwner:   event.GetRepo().GetOwner(),
×
107
                ghprop.ReleasePropertyRepo:    event.GetRepo().GetName(),
×
108
        })
×
109

×
NEW
110
        originatorProps := properties.NewProperties(map[string]any{
×
111
                properties.PropertyUpstreamID: properties.NumericalValueToUpstreamID(event.GetRepo().GetID()),
×
112
        })
×
113

×
114
        switch event.GetAction() {
×
115
        case "published":
×
116
                return &processingResult{
×
117
                        topic: constants.TopicQueueOriginatingEntityAdd,
×
118
                        wrapper: entityMessage.NewEntityRefreshAndDoMessage().
×
119
                                WithEntity(pb.Entity_ENTITY_RELEASE, lookByProps).
×
120
                                WithProviderImplementsHint(string(db.ProviderTypeGithub)).
×
121
                                WithOriginator(pb.Entity_ENTITY_REPOSITORIES, originatorProps),
×
NEW
122
                }
×
123
        case "unpublished", "deleted":
×
124
                return &processingResult{
×
125
                        topic: constants.TopicQueueOriginatingEntityDelete,
×
126
                        wrapper: entityMessage.NewEntityRefreshAndDoMessage().
×
127
                                WithEntity(pb.Entity_ENTITY_RELEASE, lookByProps).
×
128
                                WithProviderImplementsHint(string(db.ProviderTypeGithub)).
×
129
                                WithOriginator(pb.Entity_ENTITY_REPOSITORIES, originatorProps),
×
NEW
130
                }
×
131
        case "edited":
×
132
                return &processingResult{
×
133
                        topic: constants.TopicQueueRefreshEntityAndEvaluate,
×
134
                        wrapper: entityMessage.NewEntityRefreshAndDoMessage().
×
135
                                WithEntity(pb.Entity_ENTITY_RELEASE, lookByProps).
×
136
                                WithProviderImplementsHint(string(db.ProviderTypeGithub)).
×
137
                                WithOriginator(pb.Entity_ENTITY_REPOSITORIES, originatorProps),
×
NEW
138
                }
×
139
        }
NEW
140
        return nil
×
141
}
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

© 2025 Coveralls, Inc