dosubot[bot] commented on issue #7534:
URL: 
https://github.com/apache/incubator-devlake/issues/7534#issuecomment-2136346928

   <!-- Greeting -->
   Hey @Challen-V! I'm here to help you with any bugs, questions, or 
contributions you have for the project. Looking forward to assisting you!
   
   <!-- Answer -->
   To address the issue where DevLake is not syncing the status of deleted 
issues from Jira, you need to ensure that the deletion of issues is properly 
handled in the `extractIssues` function. Currently, the provided code does not 
include logic to handle deleted issues.
   
   You can add a check to see if an issue has been deleted and then mark it 
accordingly. Here is a modified version of the `extractIssues` function to 
include this logic:
   
   ```go
   func extractIssues(data *JiraTaskData, mappings *typeMappings, row 
*api.RawData) ([]interface{}, errors.Error) {
       var apiIssue apiv2models.Issue
       err := errors.Convert(json.Unmarshal(row.Data, &apiIssue))
       if err != nil {
           return nil, err
       }
       err = apiIssue.SetAllFields(row.Data)
       if err != nil {
           return nil, err
       }
       var results []interface{}
       // if the field `created` is nil, ignore it
       if apiIssue.Fields.Created == nil {
           return results, nil
       }
       sprints, issue, comments, worklogs, changelogs, changelogItems, users := 
apiIssue.ExtractEntities(data.Options.ConnectionId)
       for _, sprintId := range sprints {
           sprintIssue := &models.JiraSprintIssue{
               ConnectionId:     data.Options.ConnectionId,
               SprintId:         sprintId,
               IssueId:          issue.IssueId,
               IssueCreatedDate: &issue.Created,
               ResolutionDate:   issue.ResolutionDate,
           }
           results = append(results, sprintIssue)
       }
       if issue.ResolutionDate != nil {
           temp := uint(issue.ResolutionDate.Unix()-issue.Created.Unix()) / 60
           issue.LeadTimeMinutes = &temp
       }
       if data.Options.ScopeConfig != nil && 
data.Options.ScopeConfig.StoryPointField != "" {
           unknownStoryPoint := 
apiIssue.Fields.AllFields[data.Options.ScopeConfig.StoryPointField]
           switch sp := unknownStoryPoint.(type) {
           case string:
               // string, try to parse
               temp, _ := strconv.ParseFloat(sp, 32)
               issue.StoryPoint = &temp
           case nil:
           default:
               // not string, convert to float64, ignore it if failed
               temp, _ := unknownStoryPoint.(float64)
               issue.StoryPoint = &temp
           }
       }
       // Check if the issue is deleted
       if apiIssue.Fields.Resolution != nil && 
strings.ToLower(apiIssue.Fields.Resolution.Name) == "deleted" {
           issue.StdStatus = "DELETED"
       } else {
           // code in next line will set issue.Type to issueType.Name
           issue.Type = mappings.typeIdMappings[issue.Type]
           issue.StdType = mappings.stdTypeMappings[issue.Type]
           if issue.StdType == "" {
               issue.StdType = strings.ToUpper(issue.Type)
           }
           issue.StdStatus = getStdStatus(issue.StatusKey)
           if value, ok := 
mappings.standardStatusMappings[issue.Type][issue.StatusKey]; ok {
               issue.StdStatus = value.StandardStatus
           }
       }
       // issue comments
       results = append(results, issue)
       for _, comment := range comments {
           results = append(results, comment)
       }
       // worklogs
       for _, worklog := range worklogs {
           results = append(results, worklog)
       }
       var issueUpdated *time.Time
       // likely this issue has more changelogs to be collected
       if len(changelogs) == 100 {
           issueUpdated = nil
       } else {
           issueUpdated = &issue.Updated
       }
       // changelogs
       for _, changelog := range changelogs {
           changelog.IssueUpdated = issueUpdated
           results = append(results, changelog)
       }
       // changelog items
       for _, changelogItem := range changelogItems {
           results = append(results, changelogItem)
       }
       // users
       for _, user := range users {
           if user.AccountId != "" {
               results = append(results, user)
           }
       }
       results = append(results, &models.JiraBoardIssue{
           ConnectionId: data.Options.ConnectionId,
           BoardId:      data.Options.BoardId,
           IssueId:      issue.IssueId,
       })
       // labels
       labels := apiIssue.Fields.Labels
       for _, v := range labels {
           issueLabel := &models.JiraIssueLabel{
               IssueId:      issue.IssueId,
               LabelName:    v,
               ConnectionId: data.Options.ConnectionId,
           }
           results = append(results, issueLabel)
       }
       // components
       components := apiIssue.Fields.Components
       var componentNames []string
       for _, v := range components {
           componentNames = append(componentNames, v.Name)
       }
       issue.Components = strings.Join(componentNames, ",")
       // issuelinks
       issuelinks := apiIssue.Fields.Issuelinks
       for _, v := range issuelinks {
           issueLink := &models.JiraIssueRelationship{
               ConnectionId:    data.Options.ConnectionId,
               IssueId:         issue.IssueId,
               IssueKey:        issue.IssueKey,
               TypeId:          v.Type.ID,
               TypeName:        v.Type.Name,
               Inward:          v.Type.Inward,
               Outward:         v.Type.Outward,
               InwardIssueId:   v.InwardIssue.ID,
               InwardIssueKey:  v.InwardIssue.Key,
               OutwardIssueId:  v.OutwardIssue.ID,
               OutwardIssueKey: v.OutwardIssue.Key,
           }
           results = append(results, issueLink)
       }
       return results, nil
   }
   ```
   
   This modification checks if the issue's resolution is marked as "deleted" 
and sets the `StdStatus` to "DELETED" accordingly. This should help in ensuring 
that deleted issues are properly marked and can be filtered out in Grafana 
<sup>[[1]](https://github.com/apache/incubator-devlake/blob/main/backend/plugins/jira/tasks/issue_extractor.go)</sup>.
   
   
   <!-- Dosu Comment Footer -->
   <details open>
   <summary>
   
   #### Details
   </summary>
   
   **About Dosu**
   This response is meant to be useful and save you time. It is **not meant to 
be a precise solution**, but rather a starting point for your own research.
   
   Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is 
irrelevant.
   </details>
   
   *To continue the conversation, mention @dosu.*
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@devlake.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to