Skip to content

Commit 7f6c0af

Browse files
committed
simplifies conditions, minor changes
1 parent 0dddf96 commit 7f6c0af

11 files changed

Lines changed: 74 additions & 201 deletions

File tree

internal/core/asset/asset_controller.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@ import (
1212
)
1313

1414
type httpController struct {
15-
assetRepository core.AssetRepository
16-
assetService core.AssetService
15+
assetRepository core.AssetRepository
16+
assetService core.AssetService
17+
dependencyVulnService core.DependencyVulnService
1718
}
1819

19-
func NewHttpController(repository core.AssetRepository, assetService core.AssetService) *httpController {
20+
func NewHttpController(repository core.AssetRepository, assetService core.AssetService, dependencyVulnService core.DependencyVulnService) *httpController {
2021
return &httpController{
21-
assetRepository: repository,
22-
assetService: assetService,
22+
assetRepository: repository,
23+
assetService: assetService,
24+
dependencyVulnService: dependencyVulnService,
2325
}
2426
}
2527

@@ -151,7 +153,6 @@ func (c *httpController) Update(ctx core.Context) error {
151153
enableTicketRangeUpdated := false
152154

153155
if patchRequest.EnableTicketRange {
154-
155156
if patchRequest.CVSSAutomaticTicketThreshold != nil {
156157
if asset.CVSSAutomaticTicketThreshold != nil {
157158
if !utils.CompareFirstTwoDecimals(*patchRequest.CVSSAutomaticTicketThreshold, *asset.CVSSAutomaticTicketThreshold) {
@@ -192,8 +193,8 @@ func (c *httpController) Update(ctx core.Context) error {
192193
asset.RiskAutomaticTicketThreshold = nil
193194
}
194195

195-
if enableTicketRangeUpdated {
196-
err = c.assetService.UpdateAssetTickets(asset)
196+
if enableTicketRangeUpdated || justification != "" {
197+
err = c.dependencyVulnService.SyncTickets(asset)
197198
if err != nil {
198199
return fmt.Errorf("Error updating asset tickets: %v", err)
199200
}
@@ -204,7 +205,7 @@ func (c *httpController) Update(ctx core.Context) error {
204205
return echo.NewHTTPError(409, "assets with an empty name or an empty slug are not allowed").WithInternal(fmt.Errorf("assets with an empty name or an empty slug are not allowed"))
205206
}
206207

207-
if updated {
208+
if updated || enableTicketRangeUpdated {
208209
err = c.assetRepository.Update(nil, &asset)
209210
if err != nil {
210211
return fmt.Errorf("error updating asset: %v", err)

internal/core/asset/asset_service.go

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -66,34 +66,6 @@ func (s *service) UpdateAssetRequirements(asset models.Asset, responsible string
6666
return fmt.Errorf("could not update raw risk assessment: %v", err)
6767
}
6868

69-
err = s.dependencyVulnService.SyncTickets(asset)
70-
if err != nil {
71-
slog.Info("error syncing tickets", "err", err)
72-
return fmt.Errorf("could not sync tickets: %v", err)
73-
}
74-
75-
return nil
76-
})
77-
if err != nil {
78-
return fmt.Errorf("could not update asset: %v", err)
79-
}
80-
81-
return nil
82-
}
83-
84-
func (s *service) UpdateAssetTickets(asset models.Asset) error {
85-
err := s.dependencyVulnRepository.Transaction(func(tx core.DB) error {
86-
err := s.assetRepository.Save(tx, &asset)
87-
if err != nil {
88-
slog.Info("error saving asset", "err", err)
89-
return fmt.Errorf("could not save asset: %v", err)
90-
}
91-
92-
err = s.dependencyVulnService.SyncTickets(asset)
93-
if err != nil {
94-
slog.Info("error syncing tickets", "err", err)
95-
return fmt.Errorf("could not sync tickets: %v", err)
96-
}
9769
return nil
9870
})
9971
if err != nil {

internal/core/common_interfaces.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,6 @@ type OrganizationRepository interface {
154154
ReadBySlug(slug string) (models.Org, error)
155155
Update(tx DB, organization *models.Org) error
156156
ContentTree(orgID uuid.UUID, projects []string) []common.ContentTreeElement
157-
GetOrgByID(id uuid.UUID) (models.Org, error)
158157
}
159158

160159
type InvitationRepository interface {

internal/core/dependency_vuln/dependency_vuln_service.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,6 @@ func (s *service) SyncTicketsForAllAssets() error {
278278
}
279279

280280
func (s *service) SyncTickets(asset models.Asset) error {
281-
282281
for _, assetVersion := range asset.AssetVersions {
283282
if !s.ShouldCreateIssues(assetVersion) {
284283
continue
@@ -318,9 +317,7 @@ func (s *service) SyncTickets(asset models.Asset) error {
318317
}
319318

320319
errgroup := utils.ErrGroup[any](10)
321-
322320
for _, vulnerability := range vulnList {
323-
324321
if (cvssThreshold != nil && vulnerability.CVE.CVSS >= float32(*cvssThreshold)) || (riskThreshold != nil && *vulnerability.RawRiskAssessment >= *riskThreshold) {
325322

326323
if vulnerability.TicketID == nil {
@@ -332,14 +329,12 @@ func (s *service) SyncTickets(asset models.Asset) error {
332329
}
333330
} else {
334331
// there is already a ticket,
335-
//TODO: we need to update the ticket with the new information
336332
errgroup.Go(func() (any, error) {
337333
return nil, s.updateIssue(asset, vulnerability, repoID)
338334
})
339335
}
340336
// check if the ticket should be closed
341337
} else if (cvssThreshold != nil && vulnerability.CVE.CVSS < float32(*cvssThreshold)) || (riskThreshold != nil && *vulnerability.RawRiskAssessment < *riskThreshold) {
342-
343338
if vulnerability.TicketID != nil {
344339
errgroup.Go(func() (any, error) {
345340
return nil, s.closeIssue(vulnerability, repoID)

internal/core/integrations/github_integration.go

Lines changed: 27 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"time"
2626

2727
"github.com/google/go-github/v62/github"
28-
gitlab "gitlab.com/gitlab-org/api/client-go"
2928

3029
"github.com/l3montree-dev/devguard/internal/core"
3130
"github.com/l3montree-dev/devguard/internal/core/org"
@@ -66,8 +65,7 @@ type githubIntegration struct {
6665
assetRepository core.AssetRepository
6766
assetVersionRepository core.AssetVersionRepository
6867

69-
orgRepository core.OrganizationRepository
70-
68+
orgRepository core.OrganizationRepository
7169
projectRepository core.ProjectRepository
7270
githubClientFactory func(repoId string) (githubClientFacade, error)
7371
}
@@ -80,12 +78,9 @@ func NewGithubIntegration(db core.DB) *githubIntegration {
8078
githubAppInstallationRepository := repositories.NewGithubAppInstallationRepository(db)
8179

8280
aggregatedVulnRepository := repositories.NewAggregatedVulnRepository(db)
83-
8481
dependencyVulnRepository := repositories.NewDependencyVulnRepository(db)
8582
vulnEventRepository := repositories.NewVulnEventRepository(db)
86-
8783
projectRepository := repositories.NewProjectRepository(db)
88-
8984
orgRepository := repositories.NewOrgRepository(db)
9085

9186
frontendUrl := os.Getenv("FRONTEND_URL")
@@ -214,18 +209,18 @@ func (githubIntegration *githubIntegration) HandleWebhook(ctx core.Context) erro
214209
}
215210

216211
switch event := event.(type) {
217-
case *gitlab.IssueEvent:
212+
case *github.IssueEvent:
218213
// check if the issue is a devguard issue
219-
issueNumber := event.ObjectAttributes.IID
220-
issueID := event.ObjectAttributes.ID
214+
issueNumber := event.Issue.GetNumber()
215+
issueID := event.Issue.GetID()
221216

222217
// look for a vuln with such a github ticket id
223218
vuln, err := githubIntegration.aggregatedVulnRepository.FindByTicketID(nil, fmt.Sprintf("github:%d/%d", issueID, issueNumber))
224219
if err != nil {
225220
slog.Debug("could not find vuln by ticket id", "err", err, "ticketId", fmt.Sprintf("github:%d/%d", issueID, issueNumber))
226221
return nil
227222
}
228-
action := event.ObjectAttributes.Action
223+
action := event.Action
229224

230225
// make sure to save the user - it might be a new user or it might have new values defined.
231226
// we do not care about any error - and we want speed, thus do it on a goroutine
@@ -237,9 +232,9 @@ func (githubIntegration *githubIntegration) HandleWebhook(ctx core.Context) erro
237232
}
238233
// save the user in the database
239234
user := models.ExternalUser{
240-
ID: fmt.Sprintf("github:%d", event.User.ID),
241-
Username: event.User.Username,
242-
AvatarURL: event.User.AvatarURL,
235+
ID: fmt.Sprintf("github:%d", event.Actor.ID),
236+
Username: *event.Actor.Name,
237+
AvatarURL: *event.Actor.AvatarURL,
243238
}
244239

245240
err = githubIntegration.externalUserRepository.Save(nil, &user)
@@ -256,13 +251,7 @@ func (githubIntegration *githubIntegration) HandleWebhook(ctx core.Context) erro
256251
switch action {
257252
case "closed":
258253
vulnDependencyVuln := vuln.(*models.DependencyVuln)
259-
260-
vulnDependencyVuln.SetTicketState(models.TicketStateClosed)
261-
vuln.SetTicketState(models.TicketStateClosed)
262-
263-
var vulnEvent models.VulnEvent
264-
265-
vulnEvent = models.NewTicketClosedEvent(vuln.GetID(), fmt.Sprintf("github:%d", event.User.ID), fmt.Sprintf("This issue is closed by %s", event.User.Username))
254+
vulnEvent := models.NewTicketClosedEvent(vuln.GetID(), fmt.Sprintf("github:%d", event.Actor.ID), fmt.Sprintf("This issue is closed by %s", *event.Actor.Name))
266255

267256
err := githubIntegration.dependencyVulnRepository.ApplyAndSave(nil, vulnDependencyVuln, &vulnEvent)
268257
if err != nil {
@@ -271,12 +260,7 @@ func (githubIntegration *githubIntegration) HandleWebhook(ctx core.Context) erro
271260

272261
case "reopened":
273262
vulnDependencyVuln := vuln.(*models.DependencyVuln)
274-
275-
vulnDependencyVuln.SetTicketState(models.TicketStateClosed)
276-
vuln.SetTicketState(models.TicketStateClosed)
277-
278-
var vulnEvent models.VulnEvent
279-
vulnEvent = models.NewReopenedEvent(vuln.GetID(), fmt.Sprintf("github:%d", event.User.ID), fmt.Sprintf("This issue is reopened by %s", event.User.Username))
263+
vulnEvent := models.NewReopenedEvent(vuln.GetID(), fmt.Sprintf("github:%d", event.Actor.ID), fmt.Sprintf("This issue is reopened by %s", *event.Actor.Name))
280264

281265
err := githubIntegration.dependencyVulnRepository.ApplyAndSave(nil, vulnDependencyVuln, &vulnEvent)
282266
if err != nil {
@@ -285,12 +269,7 @@ func (githubIntegration *githubIntegration) HandleWebhook(ctx core.Context) erro
285269

286270
case "deleted":
287271
vulnDependencyVuln := vuln.(*models.DependencyVuln)
288-
289-
vulnDependencyVuln.SetTicketState(models.TicketStateDeleted)
290-
vuln.SetTicketState(models.TicketStateDeleted)
291-
292-
var vulnEvent models.VulnEvent
293-
vulnEvent = models.NewTicketDeletedEvent(vuln.GetID(), fmt.Sprintf("github:%d", event.User.ID), fmt.Sprintf("This issue is deleted by %s", event.User.Username))
272+
vulnEvent := models.NewTicketDeletedEvent(vuln.GetID(), fmt.Sprintf("github:%d", event.Actor.ID), fmt.Sprintf("This issue is deleted by %s", *event.Actor.Name))
294273

295274
err := githubIntegration.dependencyVulnRepository.ApplyAndSave(nil, vulnDependencyVuln, &vulnEvent)
296275
if err != nil {
@@ -733,27 +712,11 @@ func (g *githubIntegration) ReopenIssue(ctx context.Context, repoId string, depe
733712
}
734713

735714
func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset, repoId string, dependencyVuln models.DependencyVuln) error {
736-
737715
if !strings.HasPrefix(repoId, "github:") {
738716
// this integration only handles github repositories.
739717
return nil
740718
}
741719

742-
// check if the dependencyVuln is open, if not we need to close the issue
743-
if dependencyVuln.State != models.VulnStateOpen {
744-
if dependencyVuln.TicketState == models.TicketStateOpen {
745-
dependencyVuln.TicketState = models.TicketStateClosed
746-
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "system", "This issue is closed")
747-
748-
// save the event
749-
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
750-
if err != nil {
751-
slog.Error("could not save dependencyVuln and event", "err", err)
752-
}
753-
return nil
754-
}
755-
}
756-
757720
owner, repo, err := ownerAndRepoFromRepositoryID(repoId)
758721
if err != nil {
759722
return err
@@ -770,7 +733,7 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
770733
return err
771734
}
772735

773-
org, err := g.orgRepository.GetOrgByID(project.OrganizationID)
736+
org, err := g.orgRepository.Read(project.OrganizationID)
774737
if err != nil {
775738
slog.Error("could not get org by id", "err", err)
776739
return err
@@ -794,8 +757,6 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
794757
if err != nil {
795758
//check if err is 404 - if so, we can not reopen the issue
796759
if err.Error() == "404 Not Found" {
797-
// the issue was deleted - we need to set the ticket state to deleted
798-
dependencyVuln.TicketState = models.TicketStateDeleted
799760
// we can not reopen the issue - it is deleted
800761
vulnEvent := models.NewTicketDeletedEvent(dependencyVuln.ID, "user", "This issue is deleted")
801762
// save the event
@@ -808,39 +769,25 @@ func (g *githubIntegration) UpdateIssue(ctx context.Context, asset models.Asset,
808769
return err
809770
}
810771

811-
//check if the ticket state in devguard is different from the ticket state in gitlab, if so we need to update the ticket state in devguard
772+
//check if the ticket state in devguard is different from the ticket state in github, if so we need to update the ticket state in devguard
812773
ticketState := issue.State
813774
devguardTicketState := dependencyVuln.TicketState
814-
if *ticketState == "closed" {
815-
if devguardTicketState == models.TicketStateOpen {
816-
// the issue was closed - we need to set the ticket state to closed
817-
dependencyVuln.TicketState = models.TicketStateClosed
818-
// create a new event
819-
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "user", "This issue is closed")
820-
821-
// save the event
822-
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
823-
if err != nil {
824-
slog.Error("could not save dependencyVuln and event", "err", err)
825-
}
826-
return nil
775+
if *ticketState == "closed" && devguardTicketState == models.TicketStateOpen {
776+
// create a new event
777+
vulnEvent := models.NewTicketClosedEvent(dependencyVuln.ID, "user", "This issue is closed")
827778

779+
// save the event
780+
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
781+
if err != nil {
782+
slog.Error("could not save dependencyVuln and event", "err", err)
828783
}
829-
}
830-
831-
if *ticketState == "opened" {
832-
if devguardTicketState == models.TicketStateClosed {
833-
// the issue was opened - we need to set the ticket state to open
834-
dependencyVuln.TicketState = models.TicketStateOpen
835-
836-
// create a new event
837-
vulnEvent := models.NewReopenedEvent(dependencyVuln.ID, "user", "This issue is reopened")
838-
// save the event
839-
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
840-
if err != nil {
841-
slog.Error("could not save dependencyVuln and event", "err", err)
842-
}
843-
return nil
784+
} else if *ticketState == "open" && devguardTicketState == models.TicketStateClosed {
785+
// create a new event
786+
vulnEvent := models.NewReopenedEvent(dependencyVuln.ID, "user", "This issue is reopened")
787+
// save the event
788+
err := g.dependencyVulnRepository.ApplyAndSave(nil, &dependencyVuln, &vulnEvent)
789+
if err != nil {
790+
slog.Error("could not save dependencyVuln and event", "err", err)
844791
}
845792
}
846793

0 commit comments

Comments
 (0)