func ExtractStory()

in backend/plugins/zentao/tasks/story_extractor.go [40:173]


func ExtractStory(taskCtx plugin.SubTaskContext) errors.Error {
	data := taskCtx.GetData().(*ZentaoTaskData)

	statusMappings := getStoryStatusMapping(data)
	stdTypeMappings := getStdTypeMappings(data)

	extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
		RawDataSubTaskArgs: api.RawDataSubTaskArgs{
			Ctx:     taskCtx,
			Options: data.Options,
			Table:   RAW_STORY_TABLE,
		},
		Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
			var inputParams storyInput
			err := json.Unmarshal(row.Input, &inputParams)
			if err != nil {
				return nil, errors.Default.WrapRaw(err)
			}
			res := &models.ZentaoStoryRes{}
			err = json.Unmarshal(row.Data, res)
			if err != nil {
				return nil, errors.Default.WrapRaw(err)
			}

			data.Stories[res.ID] = struct{}{}
			var results []interface{}
			projectStory := &models.ZentaoProjectStory{
				ConnectionId: data.Options.ConnectionId,
				ProjectId:    data.Options.ProjectId,
				StoryId:      res.ID,
			}
			results = append(results, projectStory)
			story := &models.ZentaoStory{
				ConnectionId:     data.Options.ConnectionId,
				ID:               res.ID,
				Product:          res.Product,
				Branch:           res.Branch,
				Version:          res.Version,
				OrderIn:          0,
				Vision:           res.Vision,
				Parent:           res.Parent,
				Module:           res.Module,
				Plan:             res.Plan,
				Source:           res.Source,
				SourceNote:       res.SourceNote,
				FromBug:          res.FromBug,
				Feedback:         res.Feedback,
				Title:            res.Title,
				Keywords:         res.Keywords,
				Type:             res.Type,
				Category:         res.Category,
				Pri:              res.Pri,
				Estimate:         res.Estimate,
				Status:           res.Status,
				SubStatus:        res.SubStatus,
				Color:            res.Color,
				Stage:            res.Stage,
				Lib:              res.Lib,
				FromStory:        res.FromStory,
				FromVersion:      res.FromVersion,
				OpenedById:       data.AccountCache.getAccountIDFromApiAccount(res.OpenedBy),
				OpenedByName:     data.AccountCache.getAccountNameFromApiAccount(res.OpenedBy),
				OpenedDate:       res.OpenedDate,
				AssignedToId:     data.AccountCache.getAccountIDFromApiAccount(res.AssignedTo),
				AssignedToName:   data.AccountCache.getAccountNameFromApiAccount(res.AssignedTo),
				AssignedDate:     res.AssignedDate,
				ApprovedDate:     res.ApprovedDate,
				LastEditedId:     data.AccountCache.getAccountIDFromApiAccount(res.LastEditedBy),
				LastEditedDate:   res.LastEditedDate,
				ChangedDate:      res.ChangedDate,
				ReviewedById:     data.AccountCache.getAccountIDFromApiAccount(res.ReviewedBy),
				ReviewedDate:     res.ReviewedDate,
				ClosedId:         data.AccountCache.getAccountIDFromApiAccount(res.ClosedBy),
				ClosedDate:       res.ClosedDate,
				ClosedReason:     res.ClosedReason,
				ActivatedDate:    res.ActivatedDate,
				ToBug:            res.ToBug,
				ChildStories:     res.ChildStories,
				LinkStories:      res.LinkStories,
				LinkRequirements: res.LinkRequirements,
				DuplicateStory:   res.DuplicateStory,
				StoryChanged:     res.StoryChanged,
				FeedbackBy:       res.FeedbackBy,
				NotifyEmail:      res.NotifyEmail,
				URChanged:        res.URChanged,
				Deleted:          res.Deleted,
				PriOrder:         res.PriOrder,
				PlanTitle:        res.PlanTitle,
				Url:              row.Url,
			}

			story.StdType = stdTypeMappings[story.Type]
			if story.StdType == "" {
				story.StdType = ticket.REQUIREMENT
			}
			switch story.Status {
			case "active", "closed", "draft", "changing", "reviewing":
			default:
				story.Status = "active"
			}
			if len(statusMappings) != 0 {
				if stdStatus, ok := statusMappings[story.Status]; ok {
					story.StdStatus = stdStatus
				} else {
					story.StdStatus = story.Status
				}
			} else {
				story.StdStatus = ticket.GetStatus(&ticket.StatusRule{
					Done:    []string{"closed"},
					Todo:    []string{"wait"},
					Default: ticket.IN_PROGRESS,
				}, story.Stage)
			}

			results = append(results, story)
			if inputParams.ExecutionId != 0 {
				executionStory := &models.ZentaoExecutionStory{
					ConnectionId: data.Options.ConnectionId,
					ProjectId:    data.Options.ProjectId,
					ExecutionId:  inputParams.ExecutionId,
					StoryId:      story.ID,
				}
				results = append(results, executionStory)
			}
			return results, nil
		},
	})

	if err != nil {
		return err
	}

	return extractor.Execute()
}