@@ -90,6 +90,15 @@ type GraphqlQueryIssue struct {
9090
9191type missingGithubIssueRef struct {
9292 ConnectionId uint64
93+ RepoId int
94+ GithubId int
95+ Number int
96+ RawDataOrigin common.RawDataOrigin
97+ }
98+
99+ type missingGithubIssueCleanupScope struct {
100+ ConnectionId uint64
101+ RepoId int
93102 GithubId int
94103 Number int
95104 RawDataOrigin common.RawDataOrigin
@@ -195,6 +204,7 @@ func CollectIssues(taskCtx plugin.SubTaskContext) errors.Error {
195204 issueUpdatedAt [inputIssue .Number ] = inputIssue .GithubUpdatedAt
196205 query .requestedIssues [inputIssue .Number ] = missingGithubIssueRef {
197206 ConnectionId : inputIssue .ConnectionId ,
207+ RepoId : inputIssue .RepoId ,
198208 GithubId : inputIssue .GithubId ,
199209 Number : inputIssue .Number ,
200210 RawDataOrigin : inputIssue .RawDataOrigin ,
@@ -261,18 +271,82 @@ func findMissingGithubIssues(requestedIssues map[int]missingGithubIssueRef, reso
261271func cleanupMissingGithubIssues (db dal.Dal , logger log.Logger , issues []missingGithubIssueRef ) errors.Error {
262272 var allErrors []error
263273 for _ , issue := range issues {
264- logger .Warn (nil , "GitHub issue #%d no longer resolves from the source API, deleting stale local data" , issue .Number )
265- err := cleanupMissingGithubIssue (db , issue )
274+ scope , ok := buildMissingGithubIssueCleanupScope (issue )
275+ if ! ok {
276+ logger .Warn (nil , "GitHub issue #%d no longer resolves from the source API, but source scope is incomplete so stale cleanup is skipped" , issue .Number )
277+ continue
278+ }
279+ logger .Warn (nil , "GitHub issue #%d no longer resolves from the source API, deleting stale local data for the current repository scope" , issue .Number )
280+ err := cleanupMissingGithubIssue (db , scope )
266281 if err != nil {
267282 allErrors = append (allErrors , err )
268283 }
269284 }
270285 return errors .Default .Combine (allErrors )
271286}
272287
273- func cleanupMissingGithubIssue (db dal.Dal , issue missingGithubIssueRef ) errors.Error {
288+ func buildMissingGithubIssueCleanupScope (issue missingGithubIssueRef ) (* missingGithubIssueCleanupScope , bool ) {
289+ if issue .ConnectionId == 0 || issue .RepoId == 0 || issue .GithubId == 0 || issue .RawDataOrigin .RawDataTable == "" || issue .RawDataOrigin .RawDataParams == "" {
290+ return nil , false
291+ }
292+ return & missingGithubIssueCleanupScope {
293+ ConnectionId : issue .ConnectionId ,
294+ RepoId : issue .RepoId ,
295+ GithubId : issue .GithubId ,
296+ Number : issue .Number ,
297+ RawDataOrigin : issue .RawDataOrigin ,
298+ }, true
299+ }
300+
301+ func (scope * missingGithubIssueCleanupScope ) issueScopedClauses () []dal.Clause {
302+ return []dal.Clause {
303+ dal .Where (
304+ "connection_id = ? AND issue_id = ? AND _raw_data_table = ? AND _raw_data_params = ?" ,
305+ scope .ConnectionId ,
306+ scope .GithubId ,
307+ scope .RawDataOrigin .RawDataTable ,
308+ scope .RawDataOrigin .RawDataParams ,
309+ ),
310+ }
311+ }
312+
313+ func (scope * missingGithubIssueCleanupScope ) assigneeScopedClauses () []dal.Clause {
314+ return []dal.Clause {
315+ dal .Where (
316+ "connection_id = ? AND repo_id = ? AND issue_id = ? AND _raw_data_table = ? AND _raw_data_params = ?" ,
317+ scope .ConnectionId ,
318+ scope .RepoId ,
319+ scope .GithubId ,
320+ scope .RawDataOrigin .RawDataTable ,
321+ scope .RawDataOrigin .RawDataParams ,
322+ ),
323+ }
324+ }
325+
326+ func (scope * missingGithubIssueCleanupScope ) githubIssueScopedClauses () []dal.Clause {
327+ return []dal.Clause {
328+ dal .Where (
329+ "connection_id = ? AND repo_id = ? AND github_id = ? AND _raw_data_table = ? AND _raw_data_params = ?" ,
330+ scope .ConnectionId ,
331+ scope .RepoId ,
332+ scope .GithubId ,
333+ scope .RawDataOrigin .RawDataTable ,
334+ scope .RawDataOrigin .RawDataParams ,
335+ ),
336+ }
337+ }
338+
339+ func (scope * missingGithubIssueCleanupScope ) rawDataScopedClauses () []dal.Clause {
340+ if scope .RawDataOrigin .RawDataId == 0 {
341+ return nil
342+ }
343+ return []dal.Clause {dal .Where ("id = ?" , scope .RawDataOrigin .RawDataId )}
344+ }
345+
346+ func cleanupMissingGithubIssue (db dal.Dal , scope * missingGithubIssueCleanupScope ) errors.Error {
274347 deleteByIssueId := func (model any , table string ) errors.Error {
275- err := db .Delete (model , dal .From (table ), dal .Where ("connection_id = ? AND issue_id = ?" , issue .ConnectionId , issue .GithubId ))
348+ clauses := append ([]dal.Clause {dal .From (table )}, scope .issueScopedClauses ()... )
349+ err := db .Delete (model , clauses ... )
276350 if err != nil {
277351 return errors .Default .Wrap (err , "failed to delete stale github issue data from " + table )
278352 }
@@ -291,31 +365,31 @@ func cleanupMissingGithubIssue(db dal.Dal, issue missingGithubIssueRef) errors.E
291365 if err != nil {
292366 return err
293367 }
294- err = deleteByIssueId (& models.GithubIssueAssignee {}, models.GithubIssueAssignee {}.TableName ())
368+ err = db .Delete (
369+ & models.GithubIssueAssignee {},
370+ append ([]dal.Clause {dal .From (models.GithubIssueAssignee {}.TableName ())}, scope .assigneeScopedClauses ()... )... ,
371+ )
295372 if err != nil {
296- return err
373+ return errors . Default . Wrap ( err , "failed to delete stale github issue assignees" )
297374 }
298375 err = db .Delete (
299376 & models.GithubPrIssue {},
300- dal .From (models.GithubPrIssue {}.TableName ()),
301- dal .Where ("connection_id = ? AND issue_id = ?" , issue .ConnectionId , issue .GithubId ),
377+ append ([]dal.Clause {dal .From (models.GithubPrIssue {}.TableName ())}, scope .issueScopedClauses ()... )... ,
302378 )
303379 if err != nil {
304380 return errors .Default .Wrap (err , "failed to delete stale github pull request issue links" )
305381 }
306382 err = db .Delete (
307383 & models.GithubIssue {},
308- dal .From (models.GithubIssue {}.TableName ()),
309- dal .Where ("connection_id = ? AND github_id = ?" , issue .ConnectionId , issue .GithubId ),
384+ append ([]dal.Clause {dal .From (models.GithubIssue {}.TableName ())}, scope .githubIssueScopedClauses ()... )... ,
310385 )
311386 if err != nil {
312387 return errors .Default .Wrap (err , "failed to delete stale github issue" )
313388 }
314- if issue . RawDataOrigin . RawDataTable != "" && issue . RawDataOrigin . RawDataId != 0 {
389+ if rawDataClauses := scope . rawDataScopedClauses (); len ( rawDataClauses ) > 0 {
315390 err = db .Delete (
316391 & api.RawData {},
317- dal .From (issue .RawDataOrigin .RawDataTable ),
318- dal .Where ("id = ?" , issue .RawDataOrigin .RawDataId ),
392+ append ([]dal.Clause {dal .From (scope .RawDataOrigin .RawDataTable )}, rawDataClauses ... )... ,
319393 )
320394 if err != nil {
321395 return errors .Default .Wrap (err , "failed to delete stale raw github issue" )
0 commit comments