From 3cfdaacca1cfb69837d018b9ff5366219ddddfc3 Mon Sep 17 00:00:00 2001 From: Keon Amini Date: Thu, 30 Jun 2022 14:43:23 -0700 Subject: [PATCH 1/7] feat(jira): collect the epic issue in an issue's epic link --- Makefile | 3 + api/docs/docs.go | 722 ++++++++++++++++++ api/pipelines/pipelines.go | 4 +- go.mod | 8 +- go.sum | 28 +- plugins/jira/impl/impl.go | 8 +- plugins/jira/tasks/external_epic_collector.go | 144 ++++ plugins/jira/tasks/external_epic_extractor.go | 136 ++++ plugins/jira/tasks/issue_extractor.go | 51 +- 9 files changed, 1052 insertions(+), 52 deletions(-) create mode 100644 api/docs/docs.go create mode 100644 plugins/jira/tasks/external_epic_collector.go create mode 100644 plugins/jira/tasks/external_epic_extractor.go diff --git a/Makefile b/Makefile index b685adff4a0..312e98a0b4b 100644 --- a/Makefile +++ b/Makefile @@ -93,3 +93,6 @@ clean: restart: docker-compose down; docker-compose up -d + +swag: + swag init --parseDependency --parseInternal -o ./api/docs -g ./api/api.go diff --git a/api/docs/docs.go b/api/docs/docs.go new file mode 100644 index 00000000000..ae868fae83b --- /dev/null +++ b/api/docs/docs.go @@ -0,0 +1,722 @@ +// Package docs GENERATED BY SWAG; DO NOT EDIT +// This file was generated by swaggo/swag +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": {}, + "license": { + "name": "Apache-2.0" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/blueprints": { + "get": { + "description": "get blueprints", + "consumes": [ + "application/json" + ], + "tags": [ + "Blueprints" + ], + "summary": "get blueprints", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/gin.H" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + }, + "post": { + "description": "post blueprints", + "consumes": [ + "application/json" + ], + "tags": [ + "Blueprints" + ], + "summary": "post blueprints", + "parameters": [ + { + "description": "json", + "name": "blueprint", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Blueprint" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/blueprints/{blueprintId}": { + "get": { + "description": "get blueprints", + "consumes": [ + "application/json" + ], + "tags": [ + "Blueprints" + ], + "summary": "get blueprints", + "parameters": [ + { + "type": "integer", + "description": "blueprint id", + "name": "blueprintId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Blueprint" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "description": "Delete BluePrints", + "tags": [ + "Blueprints" + ], + "summary": "delete blueprints", + "parameters": [ + { + "type": "string", + "description": "blueprintId", + "name": "blueprintId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + }, + "patch": { + "description": "patch blueprints", + "consumes": [ + "application/json" + ], + "tags": [ + "Blueprints" + ], + "summary": "patch blueprints", + "parameters": [ + { + "type": "string", + "description": "blueprintId", + "name": "blueprintId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Blueprint" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/domainlayer/repos": { + "get": { + "description": "Get all repos from database", + "consumes": [ + "application/json" + ], + "tags": [ + "Domainlayer" + ], + "summary": "Get all repos from database", + "responses": { + "200": { + "description": "{\"repos\": repos, \"count\": count}", + "schema": { + "$ref": "#/definitions/gin.H" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/ping": { + "get": { + "description": "check http status", + "tags": [ + "Ping" + ], + "summary": "Ping", + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/pipelines": { + "get": { + "description": "GET /pipelines?status=TASK_RUNNING\u0026pending=1\u0026page=1\u0026pagesize=10\nRETURN SAMPLE\n{\n\"pipelines\": [\n{\"id\": 1, \"name\": \"test-pipeline\", ...}\n],\n\"count\": 5\n}", + "tags": [ + "pipelines" + ], + "summary": "Get list of pipelines", + "parameters": [ + { + "type": "string", + "description": "query", + "name": "status", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "query", + "name": "pending", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "query", + "name": "page", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "query", + "name": "pagesize", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Pipeline" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + }, + "post": { + "description": "Create and run a new pipeline\nRETURN SAMPLE\n{\n\"name\": \"name-of-pipeline\",\n\"tasks\": [\n[ {\"plugin\": \"gitlab\", ...}, {\"plugin\": \"jira\"} ],\n[ {\"plugin\": \"github\", ...}],\n]\n}", + "consumes": [ + "application/json" + ], + "tags": [ + "pipelines" + ], + "summary": "Create and run a new pipeline", + "parameters": [ + { + "description": "json", + "name": "pipeline", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.NewPipeline" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Pipeline" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/pipelines/{pipelineId}": { + "get": { + "description": "GET /pipelines/:pipelineId\nRETURN SAMPLE\n{\n\"id\": 1,\n\"name\": \"test-pipeline\",\n...\n}", + "tags": [ + "pipelines" + ], + "parameters": [ + { + "type": "integer", + "description": "query", + "name": "pipelineId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Pipeline" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "description": "Cancel a pending pipeline", + "tags": [ + "pipelines" + ], + "parameters": [ + { + "type": "integer", + "description": "pipeline ID", + "name": "pipelineId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/pipelines/{pipelineId}/tasks": { + "get": { + "description": "get task\nSAMPLE\n{\n\"tasks\": [\n{\"id\": 1, \"plugin\": \"\", ...}\n],\n\"count\": 5\n}", + "consumes": [ + "application/json" + ], + "tags": [ + "task" + ], + "summary": "Get task", + "parameters": [ + { + "type": "integer", + "description": "pipelineId", + "name": "pipelineId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "{\"tasks\": tasks, \"count\": count}", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/push/{tableName}": { + "post": { + "description": "POST /push/:tableName", + "consumes": [ + "application/json" + ], + "tags": [ + "push" + ], + "summary": "POST /push/:tableName", + "parameters": [ + { + "type": "string", + "description": "table name", + "name": "tableName", + "in": "path", + "required": true + }, + { + "description": "data", + "name": "data", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "{\"rowsAffected\": rowsAffected}", + "schema": { + "$ref": "#/definitions/gin.H" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/version": { + "get": { + "description": "return a object", + "consumes": [ + "application/json" + ], + "tags": [ + "version" + ], + "summary": "Get the version of lake", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + } + }, + "definitions": { + "core.PipelineTask": { + "type": "object", + "required": [ + "plugin" + ], + "properties": { + "options": { + "type": "object", + "additionalProperties": true + }, + "plugin": { + "description": "Plugin name", + "type": "string" + }, + "subtasks": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gin.H": { + "type": "object", + "additionalProperties": true + }, + "models.Blueprint": { + "type": "object", + "required": [ + "mode", + "name" + ], + "properties": { + "createdAt": { + "type": "string" + }, + "cronConfig": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "isManual": { + "type": "boolean" + }, + "mode": { + "type": "string", + "enum": [ + "NORMAL", + "ADVANCED" + ] + }, + "name": { + "type": "string" + }, + "plan": { + "type": "array", + "items": { + "type": "integer" + } + }, + "settings": { + "type": "array", + "items": { + "type": "integer" + } + }, + "updatedAt": { + "type": "string" + } + } + }, + "models.NewPipeline": { + "type": "object", + "properties": { + "blueprintId": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "plan": { + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/core.PipelineTask" + } + } + } + } + }, + "models.Pipeline": { + "type": "object", + "properties": { + "beganAt": { + "type": "string" + }, + "blueprintId": { + "type": "integer" + }, + "createdAt": { + "type": "string" + }, + "finishedAt": { + "type": "string" + }, + "finishedTasks": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "plan": { + "type": "array", + "items": { + "type": "integer" + } + }, + "spentSeconds": { + "type": "integer" + }, + "stage": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "totalTasks": { + "type": "integer" + }, + "updatedAt": { + "type": "string" + } + } + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "0.1", + Host: "localhost:8080", + BasePath: "/", + Schemes: []string{}, + Title: "DevLake Swagger API", + Description: "

This is the main page of devlake api

", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/api/pipelines/pipelines.go b/api/pipelines/pipelines.go index 990101ba5f8..931fa853c54 100644 --- a/api/pipelines/pipelines.go +++ b/api/pipelines/pipelines.go @@ -51,10 +51,10 @@ POST /pipelines // @Description } // @Tags pipelines // @Accept application/json -// @Param pipeline body string true "json" +// @Param pipeline body models.NewPipeline true "json" // @Success 200 {object} models.Pipeline // @Failure 400 {string} errcode.Error "Bad Request" -// @Failure 500 {string} errcode.Error "Internel Error" +// @Failure 500 {string} errcode.Error "Internal Error" // @Router /pipelines [post] func Post(c *gin.Context) { newPipeline := &models.NewPipeline{} diff --git a/go.mod b/go.mod index 98cc2be4526..df773afb6b7 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/gin-gonic/gin v1.7.7 github.com/go-git/go-git/v5 v5.4.2 github.com/go-playground/validator/v10 v10.9.0 + github.com/gocarina/gocsv v0.0.0-20220707092902-b9da1f06c77e github.com/libgit2/git2go/v33 v33.0.6 github.com/magiconair/properties v1.8.5 github.com/manifoldco/promptui v0.9.0 @@ -36,10 +37,7 @@ require ( github.com/KyleBanks/depth v1.2.1 // indirect github.com/Microsoft/go-winio v0.5.0 // indirect github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/acomagu/bufpipe v1.0.3 // indirect - github.com/agiledragon/gomonkey/v2 v2.7.0 // indirect github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -47,7 +45,6 @@ require ( github.com/emirpasic/gods v1.12.0 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/ghodss/yaml v1.0.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect @@ -58,7 +55,6 @@ require ( github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect - github.com/gocarina/gocsv v0.0.0-20220707092902-b9da1f06c77e // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/status v1.1.0 // indirect @@ -107,9 +103,7 @@ require ( github.com/stretchr/objx v0.3.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/ugorji/go/codec v1.2.6 // indirect - github.com/urfave/cli/v2 v2.11.0 // indirect github.com/xanzy/ssh-agent v0.3.0 // indirect - github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.uber.org/atomic v1.9.0 // indirect golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e // indirect diff --git a/go.sum b/go.sum index fd15fd18acc..c78c73503d0 100644 --- a/go.sum +++ b/go.sum @@ -49,15 +49,11 @@ github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXG github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= -github.com/agiledragon/gomonkey/v2 v2.7.0 h1:CFT/xdr6xbsIN04Yll4OhKq/vPm0MVD8ykV99jDBesM= -github.com/agiledragon/gomonkey/v2 v2.7.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -119,7 +115,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/cors v1.3.1 h1:doAsuITavI4IOcd0Y19U4B+O0dNWihRyX//nn4sEmgA= github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzFA61xsmDk= @@ -152,16 +147,13 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/spec v0.20.6 h1:ich1RQ3WDbfoeTqTAb+5EIxNmpKVJZWBNah9RAT0jIQ= github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= @@ -419,7 +411,6 @@ github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaW github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -475,7 +466,6 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= @@ -565,7 +555,6 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w= github.com/swaggo/gin-swagger v1.4.3 h1:mHJz+yzJne0udgYnC5qlDf4e7KuxUbVNX2dhD/cw2rU= github.com/swaggo/gin-swagger v1.4.3/go.mod h1:hBg6tGeKJsUu/P79BH+WGUR8nq2LuGE0O160+s4iefo= -github.com/swaggo/swag v1.8.1 h1:JuARzFX1Z1njbCGz+ZytBR15TFJwF2Q7fu8puJHhQYI= github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ= github.com/swaggo/swag v1.8.3 h1:3pZSSCQ//gAH88lfmxM3Cd1+JCsxV8Md6f36b9hrZ5s= github.com/swaggo/swag v1.8.3/go.mod h1:jMLeXOOmYyjk8PvHTsXBdrubsNd9gUJTTCzL5iBnseg= @@ -576,20 +565,17 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v2 v2.11.0 h1:c6bD90aLd2iEsokxhxkY5Er0zA2V9fId2aJfwmrF+do= -github.com/urfave/cli/v2 v2.11.0/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= @@ -675,8 +661,10 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -720,8 +708,8 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -814,9 +802,10 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c h1:sSIdNI2Dd6vGv47bKc/xArpfxVmEz2+3j0E6I484xC4= golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e h1:NHvCuwuS43lGnYhten69ZWqi2QOj/CiDNcKbVqwVoew= golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -895,8 +884,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1044,7 +1033,6 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/plugins/jira/impl/impl.go b/plugins/jira/impl/impl.go index 9a368abd9db..63d5ddd5e34 100644 --- a/plugins/jira/impl/impl.go +++ b/plugins/jira/impl/impl.go @@ -110,10 +110,10 @@ func (plugin Jira) PrepareTaskData(taskCtx core.TaskContext, options map[string] logger.Debug("%v", options) err = mapstructure.Decode(options, &op) if err != nil { - return nil, err + return nil, fmt.Errorf("could not decode Jira options: %v", err) } if op.ConnectionId == 0 { - return nil, fmt.Errorf("connectionId is invalid") + return nil, fmt.Errorf("jira connectionId is invalid") } connection := &models.JiraConnection{} connectionHelper := helper.NewConnectionHelper( @@ -121,11 +121,11 @@ func (plugin Jira) PrepareTaskData(taskCtx core.TaskContext, options map[string] nil, ) if err != nil { - return nil, err + return nil, fmt.Errorf("could not get connection API instance for Jira: %v", err) } err = connectionHelper.FirstById(connection, op.ConnectionId) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to get Jira connection: %v", err) } var since time.Time diff --git a/plugins/jira/tasks/external_epic_collector.go b/plugins/jira/tasks/external_epic_collector.go new file mode 100644 index 00000000000..989300e2ca8 --- /dev/null +++ b/plugins/jira/tasks/external_epic_collector.go @@ -0,0 +1,144 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package tasks + +import ( + "fmt" + "github.com/apache/incubator-devlake/plugins/core" + "strings" + + "github.com/apache/incubator-devlake/plugins/helper" + "net/http" + "net/url" +) + +import ( + "encoding/json" + "io/ioutil" +) + +const RAW_EXTERNAL_EPIC_TABLE = "jira_external_epics" + +// this struct should be moved to `jira_api_common.go` +type JiraEpicParams struct { + ConnectionId uint64 + BoardId uint64 +} + +var _ core.SubTaskEntryPoint = CollectIssues + +var CollectExternalEpicsMeta = core.SubTaskMeta{ + Name: "collectExternalEpics", + EntryPoint: CollectExternalEpics, + EnabledByDefault: true, + Description: "collect Jira epics from other boards", + DomainTypes: []string{core.DOMAIN_TYPE_TICKET, core.DOMAIN_TYPE_CROSS}, +} + +func CollectExternalEpics(taskCtx core.SubTaskContext) error { + db := taskCtx.GetDal() + data := taskCtx.GetData().(*JiraTaskData) + + // union of + // 1. issues with epics not from this board and not in the issues table + // 2. issues with epics not from this board that ARE already in the issues table (from previous runs) + // the above two selections are mutually exclusive + cursor, err := db.RawCursor(fmt.Sprintf(` + SELECT tji.epic_key as epicKey FROM _tool_jira_issues tji + LEFT JOIN _tool_jira_board_issues tjbi + ON tji.issue_id = tjbi.issue_id + WHERE + tjbi.board_id = %d AND tji.epic_key != "" AND NOT EXISTS ( + SELECT issue_key FROM _tool_jira_issues tji2 + WHERE tji2.issue_key = tji.epic_key + ) + UNION + SELECT tji.issue_key as epicKey FROM _tool_jira_issues tji + LEFT JOIN _tool_jira_board_issues tjbi + ON tji.issue_id = tjbi.issue_id + WHERE + tjbi.issue_id IS NULL; + `, data.Options.BoardId)) + if err != nil { + return fmt.Errorf("unable to query for external epics: %v", err) + } + var externalEpicKeys []string + for cursor.Next() { + epicKey := "" + err = cursor.Scan(&epicKey) + if err != nil { + return fmt.Errorf("couldn't read returned epic key: %v", err) + } + externalEpicKeys = append(externalEpicKeys, epicKey) + } + if len(externalEpicKeys) == 0 { + taskCtx.GetLogger().Info("no external epic keys found for Jira board %d", data.Options.BoardId) + return nil + } + since := data.Since + jql := "ORDER BY created ASC" + if since != nil { + // prepend a time range criteria if `since` was specified, either by user or from database + jql = fmt.Sprintf("updated >= '%s' %s", since.Format("2006/01/02 15:04"), jql) + } + jql = fmt.Sprintf("issue in (%s) %s", strings.Join(externalEpicKeys, ","), jql) + + collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{ + RawDataSubTaskArgs: helper.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: JiraEpicParams{ + ConnectionId: data.Options.ConnectionId, + BoardId: data.Options.BoardId, + }, + Table: RAW_EXTERNAL_EPIC_TABLE, + }, + ApiClient: data.ApiClient, + PageSize: 100, + Incremental: false, + UrlTemplate: "api/2/search", + Query: func(reqData *helper.RequestData) (url.Values, error) { + query := url.Values{} + query.Set("jql", jql) + query.Set("issue in", fmt.Sprintf("(%s)", strings.Join(externalEpicKeys, ","))) + query.Set("startAt", fmt.Sprintf("%v", reqData.Pager.Skip)) + query.Set("maxResults", fmt.Sprintf("%v", reqData.Pager.Size)) + query.Set("expand", "changelog") + return query, nil + }, + GetTotalPages: GetTotalPagesFromResponse, + Concurrency: 10, + ResponseParser: func(res *http.Response) ([]json.RawMessage, error) { + var data struct { + Issues []json.RawMessage `json:"issues"` + } + blob, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, err + } + err = json.Unmarshal(blob, &data) + if err != nil { + return nil, err + } + return data.Issues, nil + }, + }) + if err != nil { + return err + } + return collector.Execute() +} diff --git a/plugins/jira/tasks/external_epic_extractor.go b/plugins/jira/tasks/external_epic_extractor.go new file mode 100644 index 00000000000..2b4ce9f7da5 --- /dev/null +++ b/plugins/jira/tasks/external_epic_extractor.go @@ -0,0 +1,136 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package tasks + +import ( + "encoding/json" + "github.com/apache/incubator-devlake/plugins/core" + "github.com/apache/incubator-devlake/plugins/helper" + "github.com/apache/incubator-devlake/plugins/jira/models" + "github.com/apache/incubator-devlake/plugins/jira/tasks/apiv2models" + "strconv" + "strings" + "time" +) + +var _ core.SubTaskEntryPoint = ExtractIssues + +var ExtractExternalEpicsMeta = core.SubTaskMeta{ + Name: "extractExternalEpics", + EntryPoint: ExtractExternalEpics, + EnabledByDefault: true, + Description: "extract Jira epics from other boards", + DomainTypes: []string{core.DOMAIN_TYPE_TICKET, core.DOMAIN_TYPE_CROSS}, +} + +func ExtractExternalEpics(taskCtx core.SubTaskContext) error { + data := taskCtx.GetData().(*JiraTaskData) + db := taskCtx.GetDal() + connectionId := data.Options.ConnectionId + boardId := data.Options.BoardId + logger := taskCtx.GetLogger() + logger.Info("extract external epic Issues, connection_id=%d, board_id=%d", connectionId, boardId) + mappings, err := getTypeMappings(data, db) + if err != nil { + return err + } + extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{ + RawDataSubTaskArgs: helper.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: JiraEpicParams{ + ConnectionId: data.Options.ConnectionId, + BoardId: data.Options.BoardId, + }, + Table: RAW_EXTERNAL_EPIC_TABLE, + }, + Extract: func(row *helper.RawData) ([]interface{}, error) { + var apiIssue apiv2models.Issue + err = 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{} + sprints, issue, 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 { + issue.LeadTimeMinutes = uint(issue.ResolutionDate.Unix()-issue.Created.Unix()) / 60 + } + if data.Options.TransformationRules.StoryPointField != "" { + strStoryPoint, _ := apiIssue.Fields.AllFields[data.Options.TransformationRules.StoryPointField].(string) + if strStoryPoint != "" { + issue.StoryPoint, _ = strconv.ParseFloat(strStoryPoint, 32) + } + } + issue.Type = mappings.typeIdMappings[issue.Type] + issue.StdStoryPoint = int64(issue.StoryPoint) + issue.StdType = mappings.stdTypeMappings[issue.Type] + if issue.StdType == "" { + issue.StdType = strings.ToUpper(issue.Type) + } + issue.StdStatus = getStdStatus(issue.StatusKey) + results = append(results, issue) + 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 + } + for _, changelog := range changelogs { + changelog.IssueUpdated = issueUpdated + results = append(results, changelog) + } + for _, changelogItem := range changelogItems { + results = append(results, changelogItem) + } + for _, user := range users { + results = append(results, user) + } + labels := apiIssue.Fields.Labels + for _, v := range labels { + issueLabel := &models.JiraIssueLabel{ + IssueId: issue.IssueId, + LabelName: v, + ConnectionId: data.Options.ConnectionId, + } + results = append(results, issueLabel) + } + return results, nil + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/plugins/jira/tasks/issue_extractor.go b/plugins/jira/tasks/issue_extractor.go index 6fc28bbef5c..146bde17899 100644 --- a/plugins/jira/tasks/issue_extractor.go +++ b/plugins/jira/tasks/issue_extractor.go @@ -40,6 +40,11 @@ var ExtractIssuesMeta = core.SubTaskMeta{ DomainTypes: []string{core.DOMAIN_TYPE_TICKET, core.DOMAIN_TYPE_CROSS}, } +type typeMappings struct { + typeIdMappings map[string]string + stdTypeMappings map[string]string +} + func ExtractIssues(taskCtx core.SubTaskContext) error { data := taskCtx.GetData().(*JiraTaskData) db := taskCtx.GetDal() @@ -47,24 +52,10 @@ func ExtractIssues(taskCtx core.SubTaskContext) error { boardId := data.Options.BoardId logger := taskCtx.GetLogger() logger.Info("extract Issues, connection_id=%d, board_id=%d", connectionId, boardId) - typeIdMapping := make(map[string]string) - issueTypes := make([]models.JiraIssueType, 0) - clauses := []dal.Clause{ - dal.From(&models.JiraIssueType{}), - dal.Where("connection_id = ?", connectionId), - } - err := db.All(&issueTypes, clauses...) + mappings, err := getTypeMappings(data, db) if err != nil { return err } - for _, issueType := range issueTypes { - typeIdMapping[issueType.Id] = issueType.UntranslatedName - } - - stdTypeMappings := make(map[string]string) - for userType, stdType := range data.Options.TransformationRules.TypeMappings { - stdTypeMappings[userType] = strings.ToUpper(stdType.StandardType) - } extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{ RawDataSubTaskArgs: helper.RawDataSubTaskArgs{ Ctx: taskCtx, @@ -112,9 +103,9 @@ func ExtractIssues(taskCtx core.SubTaskContext) error { issue.StoryPoint, _ = strconv.ParseFloat(strStoryPoint, 32) } } - issue.Type = typeIdMapping[issue.Type] + issue.Type = mappings.typeIdMappings[issue.Type] issue.StdStoryPoint = int64(issue.StoryPoint) - issue.StdType = stdTypeMappings[issue.Type] + issue.StdType = mappings.stdTypeMappings[issue.Type] if issue.StdType == "" { issue.StdType = strings.ToUpper(issue.Type) } @@ -157,10 +148,32 @@ func ExtractIssues(taskCtx core.SubTaskContext) error { return results, nil }, }) - if err != nil { return err } - return extractor.Execute() } + +func getTypeMappings(data *JiraTaskData, db dal.Dal) (*typeMappings, error) { + typeIdMapping := make(map[string]string) + issueTypes := make([]models.JiraIssueType, 0) + clauses := []dal.Clause{ + dal.From(&models.JiraIssueType{}), + dal.Where("connection_id = ?", data.Options.ConnectionId), + } + err := db.All(&issueTypes, clauses...) + if err != nil { + return nil, err + } + for _, issueType := range issueTypes { + typeIdMapping[issueType.Id] = issueType.UntranslatedName + } + stdTypeMappings := make(map[string]string) + for userType, stdType := range data.Options.TransformationRules.TypeMappings { + stdTypeMappings[userType] = strings.ToUpper(stdType.StandardType) + } + return &typeMappings{ + typeIdMappings: typeIdMapping, + stdTypeMappings: stdTypeMappings, + }, nil +} From 1c797bb095eb9ad31a71f5087e20dc07ccbc7519 Mon Sep 17 00:00:00 2001 From: Keon Amini Date: Thu, 21 Jul 2022 19:45:17 -0500 Subject: [PATCH 2/7] test: added e2e test for external epic --- Makefile | 3 - api/docs/docs.go | 535 +++++++++++++++++- helpers/e2ehelper/data_flow_tester.go | 16 +- plugins/jira/e2e/external_epic_test.go | 83 +++ .../e2e/raw_tables/_raw_jira_api_boards.csv | 1 + .../raw_tables/_raw_jira_api_issue_types.csv | 44 ++ .../e2e/raw_tables/_raw_jira_api_issues.csv | 3 + .../raw_tables/_raw_jira_external_epics.csv | 2 + ...l_jira_board_issues_for_external_epics.csv | 4 + .../_tool_jira_boards_for_external_epics.csv | 2 + .../_tool_jira_issues_for_external_epics.csv | 5 + plugins/jira/tasks/external_epic_collector.go | 70 ++- 12 files changed, 721 insertions(+), 47 deletions(-) create mode 100644 plugins/jira/e2e/external_epic_test.go create mode 100644 plugins/jira/e2e/raw_tables/_raw_jira_external_epics.csv create mode 100644 plugins/jira/e2e/snapshot_tables/_tool_jira_board_issues_for_external_epics.csv create mode 100644 plugins/jira/e2e/snapshot_tables/_tool_jira_boards_for_external_epics.csv create mode 100644 plugins/jira/e2e/snapshot_tables/_tool_jira_issues_for_external_epics.csv diff --git a/Makefile b/Makefile index 312e98a0b4b..b685adff4a0 100644 --- a/Makefile +++ b/Makefile @@ -93,6 +93,3 @@ clean: restart: docker-compose down; docker-compose up -d - -swag: - swag init --parseDependency --parseInternal -o ./api/docs -g ./api/api.go diff --git a/api/docs/docs.go b/api/docs/docs.go index ae868fae83b..aea5836c150 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -11,9 +11,6 @@ const docTemplate = `{ "description": "{{escape .Description}}", "title": "{{.Title}}", "contact": {}, - "license": { - "name": "Apache-2.0" - }, "version": "{{.Version}}" }, "host": "{{.Host}}", @@ -149,7 +146,7 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "" + "description": "OK" }, "400": { "description": "Bad Request", @@ -205,6 +202,47 @@ const docTemplate = `{ } } }, + "/blueprints/{blueprintId}/trigger": { + "post": { + "description": "trigger a blueprint immediately", + "consumes": [ + "application/json" + ], + "tags": [ + "Blueprints" + ], + "summary": "trigger blueprint", + "parameters": [ + { + "type": "string", + "description": "blueprintId", + "name": "blueprintId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Pipeline" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, "/domainlayer/repos": { "get": { "description": "Get all repos from database", @@ -246,7 +284,7 @@ const docTemplate = `{ "summary": "Ping", "responses": { "200": { - "description": "" + "description": "OK" }, "400": { "description": "Bad Request", @@ -355,7 +393,7 @@ const docTemplate = `{ } }, "500": { - "description": "Internel Error", + "description": "Internal Error", "schema": { "type": "string" } @@ -415,7 +453,7 @@ const docTemplate = `{ ], "responses": { "200": { - "description": "" + "description": "OK" }, "400": { "description": "Bad Request", @@ -473,6 +511,409 @@ const docTemplate = `{ } } }, + "/plugins/ae/connections": { + "get": { + "description": "Get all AE connections", + "tags": [ + "plugins/AE" + ], + "summary": "get all ae connections", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + }, + "post": { + "description": "Create AE connection", + "tags": [ + "plugins/AE" + ], + "summary": "create ae connection", + "parameters": [ + { + "description": "json body", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.AeConnection" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/plugins/ae/connections/{connectionId}": { + "get": { + "description": "Get AE connection detail", + "tags": [ + "plugins/AE" + ], + "summary": "get ae connection detail", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "description": "Delete a AE connection", + "tags": [ + "plugins/AE" + ], + "summary": "delete a ae connection", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + }, + "patch": { + "description": "Patch AE connection", + "tags": [ + "plugins/AE" + ], + "summary": "patch ae connection", + "parameters": [ + { + "description": "json body", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.AeConnection" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/plugins/ae/test": { + "post": { + "description": "Test AE Connection", + "tags": [ + "plugins/AE" + ], + "summary": "test ae connection", + "parameters": [ + { + "description": "json body", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.TestConnectionRequest" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internel Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/plugins/org/teams.csv": { + "get": { + "description": "get teams.csv file", + "produces": [ + "text/csv" + ], + "tags": [ + "plugins/org" + ], + "summary": "Get teams.csv file", + "parameters": [ + { + "type": "boolean", + "description": "return fake data or not", + "name": "fake_data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + } + } + }, + "put": { + "description": "upload teams.csv file", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "plugins/org" + ], + "summary": "Upload teams.csv file", + "parameters": [ + { + "type": "file", + "description": "select file to upload", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + } + } + } + }, + "/plugins/org/user_account_mapping.csv": { + "get": { + "description": "get user_account_mapping.csv.csv file", + "produces": [ + "text/csv" + ], + "tags": [ + "plugins/org" + ], + "summary": "Get user_account_mapping.csv.csv file", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + } + } + }, + "put": { + "description": "upload user_account_mapping.csv.csv file", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "plugins/org" + ], + "summary": "Upload user_account_mapping.csv.csv file", + "parameters": [ + { + "type": "file", + "description": "select file to upload", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + } + } + } + }, + "/plugins/org/users.csv": { + "get": { + "description": "get users.csv file", + "produces": [ + "text/csv" + ], + "tags": [ + "plugins/org" + ], + "summary": "Get users.csv file", + "parameters": [ + { + "type": "boolean", + "description": "return fake data or not", + "name": "fake_data", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + } + } + }, + "put": { + "description": "upload users.csv file", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "plugins/org" + ], + "summary": "Upload users.csv file", + "parameters": [ + { + "type": "file", + "description": "select file to upload", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/shared.ApiBody" + } + } + } + } + }, "/push/{tableName}": { "post": { "description": "POST /push/:tableName", @@ -583,6 +1024,44 @@ const docTemplate = `{ "type": "object", "additionalProperties": true }, + "models.AeConnection": { + "type": "object", + "required": [ + "app_id", + "endpoint", + "name", + "secret_key" + ], + "properties": { + "app_id": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "proxy": { + "type": "string" + }, + "rateLimit": { + "type": "integer" + }, + "secret_key": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + } + }, "models.Blueprint": { "type": "object", "required": [ @@ -701,18 +1180,50 @@ const docTemplate = `{ "type": "string" } } + }, + "models.TestConnectionRequest": { + "type": "object", + "required": [ + "app_id", + "secret_key" + ], + "properties": { + "app_id": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "proxy": { + "type": "string" + }, + "secret_key": { + "type": "string" + } + } + }, + "shared.ApiBody": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } } } }` // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ - Version: "0.1", - Host: "localhost:8080", - BasePath: "/", + Version: "", + Host: "", + BasePath: "", Schemes: []string{}, - Title: "DevLake Swagger API", - Description: "

This is the main page of devlake api

", + Title: "", + Description: "", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, } diff --git a/helpers/e2ehelper/data_flow_tester.go b/helpers/e2ehelper/data_flow_tester.go index 378ccba067a..60a30f81576 100644 --- a/helpers/e2ehelper/data_flow_tester.go +++ b/helpers/e2ehelper/data_flow_tester.go @@ -180,13 +180,18 @@ func (t *DataFlowTester) FlushTabler(dst schema.Tabler) { // Subtask executes specified subtasks func (t *DataFlowTester) Subtask(subtaskMeta core.SubTaskMeta, taskData interface{}) { - subtaskCtx := helper.NewStandaloneSubTaskContext(context.Background(), t.Cfg, t.Log, t.Db, t.Name, taskData) + subtaskCtx := t.SubtaskContext(taskData) err := subtaskMeta.EntryPoint(subtaskCtx) if err != nil { panic(err) } } +// SubtaskContext creates a subtask context +func (t *DataFlowTester) SubtaskContext(taskData interface{}) core.SubTaskContext { + return helper.NewStandaloneSubTaskContext(context.Background(), t.Cfg, t.Log, t.Db, t.Name, taskData) +} + func filterColumn(column dal.ColumnMeta, opts TableOptions) bool { for _, ignore := range opts.IgnoreFields { if column.Name() == ignore { @@ -241,6 +246,8 @@ func (t *DataFlowTester) CreateSnapshot(dst schema.Tabler, opts TableOptions) { forScanValues[i] = new(sql.NullTime) } else if columnType.ScanType().Name() == `bool` { forScanValues[i] = new(bool) + } else if columnType.ScanType().Name() == `RawBytes` { + forScanValues[i] = new(sql.NullString) } else { forScanValues[i] = new(string) } @@ -267,6 +274,13 @@ func (t *DataFlowTester) CreateSnapshot(dst schema.Tabler, opts TableOptions) { } else { values[i] = `0` } + case *sql.NullString: + value := *forScanValues[i].(*sql.NullString) + if value.Valid { + values[i] = value.String + } else { + values[i] = `` + } case *string: values[i] = fmt.Sprint(*forScanValues[i].(*string)) } diff --git a/plugins/jira/e2e/external_epic_test.go b/plugins/jira/e2e/external_epic_test.go new file mode 100644 index 00000000000..6d67fd38c1c --- /dev/null +++ b/plugins/jira/e2e/external_epic_test.go @@ -0,0 +1,83 @@ +package e2e + +import ( + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/models/common" + "github.com/apache/incubator-devlake/plugins/jira/impl" + "github.com/apache/incubator-devlake/plugins/jira/models" + "github.com/apache/incubator-devlake/plugins/jira/tasks" + "github.com/stretchr/testify/require" + "testing" +) + +func TestExternalEpicDataflow(t *testing.T) { + var plugin impl.Jira + dataflowTester := e2ehelper.NewDataFlowTester(t, "jira", plugin) + taskData := &tasks.JiraTaskData{ + Options: &tasks.JiraOptions{ + ConnectionId: 1, + BoardId: 93, + TransformationRules: tasks.TransformationRules{StoryPointField: "customfield_10024"}, + }, + } + + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_api_issue_types.csv", "_raw_jira_api_issue_types") + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_api_issues.csv", "_raw_jira_api_issues") + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_external_epics.csv", "_raw_jira_external_epics") + + dataflowTester.FlushTabler(&models.JiraIssue{}) + dataflowTester.FlushTabler(&models.JiraBoardIssue{}) + dataflowTester.FlushTabler(&models.JiraSprintIssue{}) + dataflowTester.FlushTabler(&models.JiraIssueChangelogs{}) + dataflowTester.FlushTabler(&models.JiraIssueChangelogItems{}) + dataflowTester.FlushTabler(&models.JiraWorklog{}) + dataflowTester.FlushTabler(&models.JiraAccount{}) + dataflowTester.FlushTabler(&models.JiraIssueType{}) + + ctx := dataflowTester.SubtaskContext(taskData) + + // run pre-req subtasks + require.NoError(t, tasks.ExtractIssueTypesMeta.EntryPoint(ctx)) + require.NoError(t, tasks.ExtractIssuesMeta.EntryPoint(ctx)) + dataflowTester.VerifyTableWithOptions( + models.JiraIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_jira_issues_for_external_epics.csv", + TargetFields: nil, + IgnoreFields: nil, + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }, + ) + dataflowTester.VerifyTableWithOptions( + models.JiraBoardIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_jira_board_issues_for_external_epics.csv", + TargetFields: []string{"connection_id", "board_id", "issue_id"}, + IgnoreFields: nil, + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }, + ) + + // run the part of the collector that queries tools data + keys, err := tasks.GetExternalEpicKeys(ctx.GetDal(), taskData) + require.NoError(t, err) + require.Equal(t, 1, len(keys)) + require.Equal(t, "K5-1", keys[0]) + + require.NoError(t, tasks.ExtractExternalEpicsMeta.EntryPoint(ctx)) + + dataflowTester.VerifyTableWithOptions( + models.JiraBoardIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_jira_board_issues_for_external_epics.csv", + TargetFields: nil, + IgnoreFields: nil, + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }, + ) + dataflowTester.VerifyTableWithOptions( + models.JiraIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_jira_issues_for_external_epics.csv", + TargetFields: nil, + IgnoreFields: nil, + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }, + ) +} diff --git a/plugins/jira/e2e/raw_tables/_raw_jira_api_boards.csv b/plugins/jira/e2e/raw_tables/_raw_jira_api_boards.csv index 99f53629ee7..7705a32d88c 100644 --- a/plugins/jira/e2e/raw_tables/_raw_jira_api_boards.csv +++ b/plugins/jira/e2e/raw_tables/_raw_jira_api_boards.csv @@ -1,2 +1,3 @@ "id","params","data","url","input","created_at" 7,"{""ConnectionId"":2,""BoardId"":8}","{""id"": 8, ""name"": ""迭代开发看板(停用)"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/board/8"", ""type"": ""scrum"", ""location"": {""name"": ""Enterprise Edition (EE)"", ""avatarURI"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=small"", ""projectId"": 10003, ""projectKey"": ""EE"", ""displayName"": ""Enterprise Edition (EE)"", ""projectName"": ""Enterprise Edition"", ""projectTypeKey"": ""software""}}","https://merico.atlassian.net/rest/agile/1.0/board/8","null","2022-06-23 10:43:18.026" +1,"{""ConnectionId"":1,""BoardId"":93}","{""id"":93,""self"":""https://merico.atlassian.net/rest/agile/1.0/board/93"",""name"":""test_board"",""type"":""kanban"",""location"":{""projectId"":10050,""displayName"":""Keon_5 (K5)"",""projectName"":""Keon_5"",""projectKey"":""K5"",""projectTypeKey"":""software"",""avatarURI"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""name"":""Keon_5 (K5)""}}",https://merico.atlassian.net/rest/agile/1.0/board/93,null,2022-07-19T19:36:30.241+00:00 diff --git a/plugins/jira/e2e/raw_tables/_raw_jira_api_issue_types.csv b/plugins/jira/e2e/raw_tables/_raw_jira_api_issue_types.csv index 37062b590f7..11934417fd4 100644 --- a/plugins/jira/e2e/raw_tables/_raw_jira_api_issue_types.csv +++ b/plugins/jira/e2e/raw_tables/_raw_jira_api_issue_types.csv @@ -43,3 +43,47 @@ id,params,data,url,input,created_at 2,"{""ConnectionId"":2,""BoardId"":8}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10128"",""id"":""10128"",""description"":""Subtasks track small pieces of work that are part of a larger task."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"",""name"":""Subtask"",""untranslatedName"":""Subtask"",""subtask"":true,""avatarId"":10316,""hierarchyLevel"":-1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10046""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-16 06:27:15.411 37,"{""ConnectionId"":2,""BoardId"":8}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10132"",""id"":""10132"",""description"":""问题或错误。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"",""name"":""缺陷"",""untranslatedName"":""Bug"",""subtask"":false,""avatarId"":10303,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10046""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-16 06:27:15.411 10,"{""ConnectionId"":2,""BoardId"":8}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10133"",""id"":""10133"",""description"":""表述为用户目标的功能。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""故事"",""untranslatedName"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10046""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-16 06:27:15.411 +45,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10077"",""id"":""10077"",""description"":""Subtasks track small pieces of work that are part of a larger task."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"",""name"":""Subtask"",""untranslatedName"":""Subtask"",""subtask"":true,""avatarId"":10316,""hierarchyLevel"":-1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10033""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +46,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10128"",""id"":""10128"",""description"":""Subtasks track small pieces of work that are part of a larger task."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"",""name"":""Subtask"",""untranslatedName"":""Subtask"",""subtask"":true,""avatarId"":10316,""hierarchyLevel"":-1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10046""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +47,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10091"",""id"":""10091"",""description"":""非业务的测试开发工作,例如开发测试平台"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium"",""name"":""测试开发任务"",""untranslatedName"":""测试开发任务"",""subtask"":false,""avatarId"":10318,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +48,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10069"",""id"":""10069"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10300?size=medium"",""name"":""疑问"",""untranslatedName"":""疑问"",""subtask"":false,""avatarId"":10300,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +49,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10074"",""id"":""10074"",""description"":""Tasks track small, distinct pieces of work."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium"",""name"":""Task"",""untranslatedName"":""Task"",""subtask"":false,""avatarId"":10318,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10033""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +50,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10051"",""id"":""10051"",""description"":""Tasks track small, distinct pieces of work."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium"",""name"":""任务"",""untranslatedName"":""任务"",""subtask"":false,""avatarId"":10318,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10022""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +51,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10040"",""id"":""10040"",""description"":""For system outages or incidents. Created by Jira Service Desk."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10553?size=medium"",""name"":""Incident"",""untranslatedName"":""Incident"",""subtask"":false,""avatarId"":10553,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +52,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10032"",""id"":""10032"",""description"":""对产品的任何疑问或建议,问题由产品经理定期进行处理。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10300?size=medium"",""name"":""Question"",""untranslatedName"":""Question"",""subtask"":false,""avatarId"":10300,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +53,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10073"",""id"":""10073"",""description"":""Stories track functionality or features expressed as user goals."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""untranslatedName"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10033""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +54,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10133"",""id"":""10133"",""description"":""Stories track functionality or features expressed as user goals."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""untranslatedName"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10046""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +55,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10072"",""id"":""10072"",""description"":""技术债需求"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10321?size=medium"",""name"":""Tech Story"",""untranslatedName"":""Tech Story"",""subtask"":false,""avatarId"":10321,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +56,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""untranslatedName"":""Epic"",""subtask"":false,""hierarchyLevel"":1}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +57,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10107"",""id"":""10107"",""description"":""This is the Xray Sub Test Execution Issue Type. Used to execute test cases already defined. A Sub Test Execution can be created for a parent issue like a requirement in order to execute the test cases associated with it."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10566?size=medium"",""name"":""Sub Test Execution"",""untranslatedName"":""Sub Test Execution"",""subtask"":true,""avatarId"":10566,""hierarchyLevel"":-1}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +58,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10078"",""id"":""10078"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium"",""name"":""测试任务"",""untranslatedName"":""测试任务"",""subtask"":false,""avatarId"":10318,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +59,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10090"",""id"":""10090"",""description"":""Subtasks track small pieces of work that are part of a larger task."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"",""name"":""Subtask"",""untranslatedName"":""Subtask"",""subtask"":true,""avatarId"":10316,""hierarchyLevel"":-1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10038""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +60,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10004"",""id"":""10004"",""description"":""测试发现的系统缺陷。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"",""name"":""Bug"",""untranslatedName"":""Bug"",""subtask"":false,""avatarId"":10303,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +61,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10075"",""id"":""10075"",""description"":""Bugs track problems or errors."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"",""name"":""Bug"",""untranslatedName"":""Bug"",""subtask"":false,""avatarId"":10303,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10033""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +62,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10047"",""id"":""10047"",""description"":""客户提出的一种改进方案。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10322?size=medium"",""name"":""Suggestion"",""untranslatedName"":""Suggestion"",""subtask"":false,""avatarId"":10322,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +63,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10052"",""id"":""10052"",""description"":""长篇故事追踪相关缺陷、故事和任务集。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10307?size=medium"",""name"":""项目"",""untranslatedName"":""项目"",""subtask"":false,""avatarId"":10307,""hierarchyLevel"":1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10022""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +64,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10001"",""id"":""10001"",""description"":""具体一个功能点,以用户角度,大小适中,可以满足某一个需要为原则。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""untranslatedName"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +65,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10102"",""id"":""10102"",""description"":""This is the Xray Test Issue Type. Used to define test cases of different types that can be executed multiple times using Test Execution issues."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10561?size=medium"",""name"":""Test"",""untranslatedName"":""Test"",""subtask"":false,""avatarId"":10561,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +66,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10031"",""id"":""10031"",""description"":""技术性任务或需求。包括技术债和用户故事的拆解。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium"",""name"":""Task"",""untranslatedName"":""Task"",""subtask"":false,""avatarId"":10318,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +67,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10106"",""id"":""10106"",""description"":""This is the Xray Precondition Issue Type. Used to abstract common actions that must be ensured before the test case execution. A Precondition can be associated with multiple test cases."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10565?size=medium"",""name"":""Precondition"",""untranslatedName"":""Precondition"",""subtask"":false,""avatarId"":10565,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +68,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10053"",""id"":""10053"",""description"":""子任务跟踪大任务中的小任务。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"",""name"":""子任务"",""untranslatedName"":""子任务"",""subtask"":true,""avatarId"":10316,""hierarchyLevel"":-1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10022""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +69,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10101"",""id"":""10101"",""description"":""Subtasks track small pieces of work that are part of a larger task."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"",""name"":""Subtask"",""untranslatedName"":""Subtask"",""subtask"":true,""avatarId"":10316,""hierarchyLevel"":-1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10041""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +70,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10082"",""id"":""10082"",""description"":""讲述一个完整的模块、场景、任务,包含多了Epic,可能跨Project、跨Team。例如:Dashboard、人才发展场景、设置重构"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10306?size=medium"",""name"":""Initiative"",""untranslatedName"":""Initiative"",""subtask"":false,""avatarId"":10306,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +71,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10097"",""id"":""10097"",""description"":""Stories track functionality or features expressed as user goals."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""untranslatedName"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10041""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +72,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10068"",""id"":""10068"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10300?size=medium"",""name"":""风险"",""untranslatedName"":""风险"",""subtask"":false,""avatarId"":10300,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +73,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10103"",""id"":""10103"",""description"":""This is the Xray Test Set Issue Type. Creates a group of test cases. Used to associate all included Tests with other Xray issue types like Test Execution and Test Plan. A Test Set can also be associated with a requirement issue to provide coverage and test status."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10562?size=medium"",""name"":""Test Set"",""untranslatedName"":""Test Set"",""subtask"":false,""avatarId"":10562,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +74,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10100"",""id"":""10100"",""description"":""Epics track collections of related bugs, stories, and tasks."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10307?size=medium"",""name"":""Epic"",""untranslatedName"":""Epic"",""subtask"":false,""avatarId"":10307,""hierarchyLevel"":1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10041""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +75,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10054"",""id"":""10054"",""description"":""在新一代项目中创建的一个用来测试的类型。看看是不是只在新一代项目中可以看见"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10304?size=medium"",""name"":""新一代测试类型"",""untranslatedName"":""新一代测试类型"",""subtask"":false,""avatarId"":10304,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10022""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +76,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10086"",""id"":""10086"",""description"":""Stories track functionality or features expressed as user goals."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""untranslatedName"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10038""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +77,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10104"",""id"":""10104"",""description"":""This is the Xray Test Plan Issue Type. Used to define the scope of test cases for a given test campaign and to aggregate all executions for those tests displaying the latest result for each test case."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10563?size=medium"",""name"":""Test Plan"",""untranslatedName"":""Test Plan"",""subtask"":false,""avatarId"":10563,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +78,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10089"",""id"":""10089"",""description"":""Epics track collections of related bugs, stories, and tasks."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10307?size=medium"",""name"":""Epic"",""untranslatedName"":""Epic"",""subtask"":false,""avatarId"":10307,""hierarchyLevel"":1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10038""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +79,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10099"",""id"":""10099"",""description"":""Bugs track problems or errors."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"",""name"":""Bug"",""untranslatedName"":""Bug"",""subtask"":false,""avatarId"":10303,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10041""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +80,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10127"",""id"":""10127"",""description"":""Epics track collections of related bugs, stories, and tasks."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10307?size=medium"",""name"":""Epic"",""untranslatedName"":""Epic"",""subtask"":false,""avatarId"":10307,""hierarchyLevel"":1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10046""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +81,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10132"",""id"":""10132"",""description"":""Bugs track problems or errors."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"",""name"":""Bug"",""untranslatedName"":""Bug"",""subtask"":false,""avatarId"":10303,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10046""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +82,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10087"",""id"":""10087"",""description"":""Tasks track small, distinct pieces of work."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium"",""name"":""Task"",""untranslatedName"":""Task"",""subtask"":false,""avatarId"":10318,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10038""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +83,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10098"",""id"":""10098"",""description"":""Tasks track small, distinct pieces of work."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium"",""name"":""Task"",""untranslatedName"":""Task"",""subtask"":false,""avatarId"":10318,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10041""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +84,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10126"",""id"":""10126"",""description"":""Tasks track small, distinct pieces of work."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium"",""name"":""Task"",""untranslatedName"":""Task"",""subtask"":false,""avatarId"":10318,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10046""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +85,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10088"",""id"":""10088"",""description"":""Bugs track problems or errors."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"",""name"":""Bug"",""untranslatedName"":""Bug"",""subtask"":false,""avatarId"":10303,""hierarchyLevel"":0,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10038""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +86,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10076"",""id"":""10076"",""description"":""Epics track collections of related bugs, stories, and tasks."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10307?size=medium"",""name"":""Epic"",""untranslatedName"":""Epic"",""subtask"":false,""avatarId"":10307,""hierarchyLevel"":1,""scope"":{""type"":""PROJECT"",""project"":{""id"":""10033""}}}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +87,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10003"",""id"":""10003"",""description"":""拆分Task、Story或Bug,最小执行单位,通常是具体的测试任务或编写测试用例。一般最大为8h,极特殊情况允许16h"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"",""name"":""Sub-task"",""untranslatedName"":""Sub-task"",""subtask"":true,""avatarId"":10316,""hierarchyLevel"":-1}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 +88,"{""ConnectionId"":1,""BoardId"":93}","{""self"":""https://merico.atlassian.net/rest/api/3/issuetype/10105"",""id"":""10105"",""description"":""This is the Xray Test Execution Issue Type. Used to execute test cases already defined."",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10564?size=medium"",""name"":""Test Execution"",""untranslatedName"":""Test Execution"",""subtask"":false,""avatarId"":10564,""hierarchyLevel"":0}",https://merico.atlassian.net/rest/api/3/issuetype,null,2022-07-22T00:20:26.871+00:00 diff --git a/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv b/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv index 7387436f1bb..50e8c174e85 100644 --- a/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv +++ b/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv @@ -29,3 +29,6 @@ 12468,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10097"", ""key"": ""EE-35"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10097"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-35/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""parent"": {""id"": ""10065"", ""key"": ""EE-3"", ""self"": ""https://merico.atlassian.net/rest/api/2/issue/10065"", ""fields"": {""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/status/10068"", ""iconUrl"": ""https://merico.atlassian.net/"", ""description"": ""This status is managed internally by Jira Software"", ""statusCategory"": {""id"": 3, ""key"": ""done"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/statuscategory/3"", ""colorName"": ""green""}}, ""summary"": ""​问题积压图率"", ""priority"": {""id"": ""3"", ""name"": ""Medium"", ""self"": ""https://merico.atlassian.net/rest/api/2/priority/3"", ""iconUrl"": ""https://merico.atlassian.net/images/icons/priorities/medium.svg""}, ""issuetype"": {""id"": ""10001"", ""name"": ""故事"", ""self"": ""https://merico.atlassian.net/rest/api/2/issuetype/10001"", ""iconUrl"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"", ""subtask"": false, ""avatarId"": 10315, ""description"": ""表述为用户目标的功能。"", ""hierarchyLevel"": 0}}}, ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/status/10068"", ""iconUrl"": ""https://merico.atlassian.net/"", ""description"": ""This status is managed internally by Jira Software"", ""statusCategory"": {""id"": 3, ""key"": ""done"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/statuscategory/3"", ""colorName"": ""green""}}, ""comment"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/10097/comment"", ""total"": 0, ""startAt"": 0, ""comments"": [], ""maxResults"": 0}, ""created"": ""2020-06-12T08:52:04.767+0800"", ""creator"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""duedate"": null, ""flagged"": false, ""project"": {""id"": ""10003"", ""key"": ""EE"", ""name"": ""Enterprise Edition"", ""self"": ""https://merico.atlassian.net/rest/api/2/project/10003"", ""avatarUrls"": {""16x16"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=xsmall"", ""24x24"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=small"", ""32x32"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=medium"", ""48x48"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552""}, ""simplified"": false, ""projectTypeKey"": ""software""}, ""summary"": ""定接口"", ""updated"": ""2021-03-28T16:05:55.353+0800"", ""watches"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-35/watchers"", ""isWatching"": false, ""watchCount"": 1}, ""worklog"": {""total"": 0, ""startAt"": 0, ""worklogs"": [], ""maxResults"": 20}, ""assignee"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5ecfbd0a47d31e0c2a15fd87"", ""active"": false, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5ecfbd0a47d31e0c2a15fd87"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/70034f92b12867f30613f25aadf6f8ca?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FY-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/70034f92b12867f30613f25aadf6f8ca?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FY-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/70034f92b12867f30613f25aadf6f8ca?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FY-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/70034f92b12867f30613f25aadf6f8ca?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FY-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""yuxiang""}, ""priority"": {""id"": ""3"", ""name"": ""Medium"", ""self"": ""https://merico.atlassian.net/rest/api/2/priority/3"", ""iconUrl"": ""https://merico.atlassian.net/images/icons/priorities/medium.svg""}, ""progress"": {""total"": 7200, ""percent"": 0, ""progress"": 0}, ""reporter"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""security"": null, ""subtasks"": [], ""versions"": [], ""issuetype"": {""id"": ""10003"", ""name"": ""子任务"", ""self"": ""https://merico.atlassian.net/rest/api/2/issuetype/10003"", ""iconUrl"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"", ""subtask"": true, ""avatarId"": 10316, ""description"": ""大任务中的小任务。"", ""hierarchyLevel"": -1}, ""timespent"": null, ""workratio"": -1, ""attachment"": [], ""components"": [], ""issuelinks"": [], ""lastViewed"": null, ""resolution"": {""id"": ""10001"", ""name"": ""Won't Do"", ""self"": ""https://merico.atlassian.net/rest/api/2/resolution/10001"", ""description"": ""This issue won't be actioned.""}, ""description"": null, ""environment"": null, ""fixVersions"": [], ""timeestimate"": 7200, ""timetracking"": {""remainingEstimate"": ""2h"", ""remainingEstimateSeconds"": 7200}, ""closedSprints"": [{""id"": 7, ""goal"": """", ""name"": ""EE Sprint 7"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/sprint/7"", ""state"": ""closed"", ""endDate"": ""2020-06-26T00:38:00.000Z"", ""startDate"": ""2020-06-12T00:38:51.882Z"", ""completeDate"": ""2020-06-22T05:59:58.980Z"", ""originBoardId"": 8}], ""resolutiondate"": ""2020-06-15T17:06:30.942+0800"", ""issuerestriction"": {""shouldDisplay"": false, ""issuerestrictions"": {}}, ""aggregateprogress"": {""total"": 7200, ""percent"": 0, ""progress"": 0}, ""customfield_10000"": ""{}"", ""customfield_10001"": null, ""customfield_10002"": null, ""customfield_10003"": null, ""customfield_10004"": null, ""customfield_10005"": null, ""customfield_10006"": null, ""customfield_10007"": null, ""customfield_10008"": null, ""customfield_10009"": null, ""customfield_10010"": null, ""customfield_10014"": null, ""customfield_10015"": null, ""customfield_10016"": null, ""customfield_10017"": null, ""customfield_10018"": {""showField"": false, ""nonEditableReason"": {""reason"": ""SUBTASK_LINK_SHOULD_BE_USED"", ""message"": ""要为子任务设置父项,请使用子任务链接。""}, ""hasEpicLinkFieldDependency"": false}, ""customfield_10019"": ""0|i000kv:"", ""customfield_10020"": [{""id"": 7, ""goal"": """", ""name"": ""EE Sprint 7"", ""state"": ""closed"", ""boardId"": 8, ""endDate"": ""2020-06-26T00:38:00.000Z"", ""startDate"": ""2020-06-12T00:38:51.882Z"", ""completeDate"": ""2020-06-22T05:59:58.980Z""}], ""customfield_10021"": null, ""customfield_10022"": null, ""customfield_10023"": ""1_*:*_1_*:*_273910297_*|*_5_*:*_1_*:*_13967428_*|*_6_*:*_1_*:*_0_*|*_10000_*:*_2_*:*_988504"", ""customfield_10024"": null, ""customfield_10027"": null, ""customfield_10028"": null, ""customfield_10060"": null, ""customfield_10061"": null, ""customfield_10062"": null, ""customfield_10063"": null, ""customfield_10064"": null, ""customfield_10065"": null, ""customfield_10066"": null, ""customfield_10068"": null, ""customfield_10070"": null, ""customfield_10071"": null, ""customfield_10073"": [], ""customfield_10074"": null, ""customfield_10075"": null, ""customfield_10076"": null, ""customfield_10077"": null, ""customfield_10078"": null, ""customfield_10079"": null, ""customfield_10080"": null, ""customfield_10081"": null, ""customfield_10082"": null, ""customfield_10083"": null, ""customfield_10084"": null, ""customfield_10085"": null, ""customfield_10086"": null, ""customfield_10087"": null, ""customfield_10088"": null, ""customfield_10089"": null, ""customfield_10090"": null, ""customfield_10091"": null, ""customfield_10092"": null, ""customfield_10093"": null, ""customfield_10095"": null, ""customfield_10096"": null, ""customfield_10097"": null, ""customfield_10098"": null, ""customfield_10099"": null, ""customfield_10100"": null, ""customfield_10101"": null, ""customfield_10102"": null, ""customfield_10103"": null, ""customfield_10104"": null, ""customfield_10105"": null, ""customfield_10106"": null, ""customfield_10107"": null, ""customfield_10108"": null, ""customfield_10109"": null, ""customfield_10113"": null, ""customfield_10114"": null, ""customfield_10115"": null, ""customfield_10116"": null, ""customfield_10117"": null, ""customfield_10118"": null, ""customfield_10119"": null, ""customfield_10120"": null, ""customfield_10121"": null, ""customfield_10122"": null, ""customfield_10123"": null, ""customfield_10124"": null, ""customfield_10125"": null, ""customfield_10126"": null, ""customfield_10127"": null, ""customfield_10128"": null, ""customfield_10129"": null, ""customfield_10130"": null, ""customfield_10131"": null, ""customfield_10132"": null, ""customfield_10133"": null, ""customfield_10134"": null, ""customfield_10135"": null, ""customfield_10136"": null, ""customfield_10137"": null, ""customfield_10138"": null, ""customfield_10140"": null, ""customfield_10141"": null, ""customfield_10142"": null, ""customfield_10143"": null, ""customfield_10145"": null, ""customfield_10146"": null, ""customfield_10150"": null, ""customfield_10151"": null, ""customfield_10152"": null, ""customfield_10153"": null, ""customfield_10154"": null, ""customfield_10155"": null, ""customfield_10156"": null, ""customfield_10157"": null, ""aggregatetimespent"": null, ""timeoriginalestimate"": null, ""aggregatetimeestimate"": 7200, ""statuscategorychangedate"": ""2020-06-15T17:06:30.983+0800"", ""aggregatetimeoriginalestimate"": null}, ""changelog"": {""total"": 14, ""startAt"": 0, ""histories"": [{""id"": ""90448"", ""items"": [{""to"": ""21134"", ""from"": ""17964"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE-subtask2"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE-subtask""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2021-04-01T08:52:15.307+0800""}, {""id"": ""86142"", ""items"": [{""to"": ""10068"", ""from"": ""6"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""已完成"", ""fieldtype"": ""jira"", ""fromString"": ""Closed""}, {""to"": ""17964"", ""from"": ""13637"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE-subtask"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2021-03-28T16:05:55.354+0800""}, {""id"": ""33529"", ""items"": [{""to"": ""13637"", ""from"": ""11976"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE"", ""fieldtype"": ""jira"", ""fromString"": ""EE Workflow v0.3""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-11-09T16:52:13.192+0800""}, {""id"": ""17932"", ""items"": [{""to"": ""11976"", ""from"": ""11356"", ""field"": ""Workflow"", ""toString"": ""EE Workflow v0.3"", ""fieldtype"": ""jira"", ""fromString"": ""EE Workflow v0.2""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-13T16:42:22.520+0800""}, {""id"": ""17311"", ""items"": [{""to"": ""11356"", ""from"": ""10496"", ""field"": ""Workflow"", ""toString"": ""EE Workflow v0.2"", ""fieldtype"": ""jira"", ""fromString"": ""jira""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-13T16:39:11.428+0800""}, {""id"": ""11446"", ""items"": [{""to"": ""10001"", ""from"": null, ""field"": ""resolution"", ""fieldId"": ""resolution"", ""toString"": ""Won't Do"", ""fieldtype"": ""jira"", ""fromString"": null}, {""to"": ""6"", ""from"": ""1"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Closed"", ""fieldtype"": ""jira"", ""fromString"": ""Open""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5ecfbd0a47d31e0c2a15fd87"", ""active"": false, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5ecfbd0a47d31e0c2a15fd87"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/70034f92b12867f30613f25aadf6f8ca?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FY-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/70034f92b12867f30613f25aadf6f8ca?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FY-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/70034f92b12867f30613f25aadf6f8ca?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FY-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/70034f92b12867f30613f25aadf6f8ca?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FY-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""yuxiang""}, ""created"": ""2020-06-15T17:06:30.996+0800""}, {""id"": ""10996"", ""items"": [{""to"": ""1"", ""from"": ""10000"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Open"", ""fieldtype"": ""jira"", ""fromString"": ""To Do""}, {""to"": ""10496"", ""from"": ""10421"", ""field"": ""Workflow"", ""toString"": ""jira"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T13:01:20.699+0800""}, {""id"": ""10921"", ""items"": [{""to"": ""10000"", ""from"": ""5"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""To Do"", ""fieldtype"": ""jira"", ""fromString"": ""Resolved""}, {""to"": ""10421"", ""from"": ""10384"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE"", ""fieldtype"": ""jira"", ""fromString"": ""Sprint Workflow for EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T12:58:46.964+0800""}, {""id"": ""10778"", ""items"": [{""to"": ""5"", ""from"": ""10000"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Resolved"", ""fieldtype"": ""jira"", ""fromString"": ""To Do""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:05:59.536+0800""}, {""id"": ""10777"", ""items"": [{""to"": null, ""from"": ""7200"", ""field"": ""timeoriginalestimate"", ""fieldId"": ""timeoriginalestimate"", ""toString"": null, ""fieldtype"": ""jira"", ""fromString"": ""7200""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:05:54.557+0800""}, {""id"": ""10768"", ""items"": [{""to"": ""5ecfbd0a47d31e0c2a15fd87"", ""from"": ""5ecfbd0ba04d9c0c220c18d8"", ""field"": ""assignee"", ""fieldId"": ""assignee"", ""toString"": ""yuxiang"", ""fieldtype"": ""jira"", ""fromString"": ""yanghui"", ""tmpToAccountId"": ""5ecfbd0a47d31e0c2a15fd87"", ""tmpFromAccountId"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:04:14.092+0800""}, {""id"": ""10765"", ""items"": [{""to"": ""7200"", ""from"": null, ""field"": ""timeestimate"", ""fieldId"": ""timeestimate"", ""toString"": ""7200"", ""fieldtype"": ""jira"", ""fromString"": null}, {""to"": ""7200"", ""from"": null, ""field"": ""timeoriginalestimate"", ""fieldId"": ""timeoriginalestimate"", ""toString"": ""7200"", ""fieldtype"": ""jira"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:03:40.427+0800""}, {""id"": ""10764"", ""items"": [{""to"": ""5ecfbd0ba04d9c0c220c18d8"", ""from"": null, ""field"": ""assignee"", ""fieldId"": ""assignee"", ""toString"": ""yanghui"", ""fieldtype"": ""jira"", ""fromString"": null, ""tmpToAccountId"": ""5ecfbd0ba04d9c0c220c18d8"", ""tmpFromAccountId"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:03:34.878+0800""}, {""id"": ""10753"", ""items"": [{""to"": ""10065"", ""from"": null, ""field"": ""Parent"", ""toString"": ""EE-3"", ""fieldtype"": ""jira"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T08:52:04.979+0800""}], ""maxResults"": 14}}","https://merico.atlassian.net/rest/agile/1.0/board/8/issue?expand=changelog&jql=updated+%3E%3D+%272006%2F01%2F02+15%3A04%27+ORDER+BY+created+ASC&maxResults=100&startAt=0","null","2022-06-23 10:43:19.866" 12469,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10098"", ""key"": ""EE-36"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10098"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-36/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""parent"": {""id"": ""10065"", ""key"": ""EE-3"", ""self"": ""https://merico.atlassian.net/rest/api/2/issue/10065"", ""fields"": {""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/status/10068"", ""iconUrl"": ""https://merico.atlassian.net/"", ""description"": ""This status is managed internally by Jira Software"", ""statusCategory"": {""id"": 3, ""key"": ""done"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/statuscategory/3"", ""colorName"": ""green""}}, ""summary"": ""​问题积压图率"", ""priority"": {""id"": ""3"", ""name"": ""Medium"", ""self"": ""https://merico.atlassian.net/rest/api/2/priority/3"", ""iconUrl"": ""https://merico.atlassian.net/images/icons/priorities/medium.svg""}, ""issuetype"": {""id"": ""10001"", ""name"": ""故事"", ""self"": ""https://merico.atlassian.net/rest/api/2/issuetype/10001"", ""iconUrl"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"", ""subtask"": false, ""avatarId"": 10315, ""description"": ""表述为用户目标的功能。"", ""hierarchyLevel"": 0}}}, ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/status/10068"", ""iconUrl"": ""https://merico.atlassian.net/"", ""description"": ""This status is managed internally by Jira Software"", ""statusCategory"": {""id"": 3, ""key"": ""done"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/statuscategory/3"", ""colorName"": ""green""}}, ""comment"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/10098/comment"", ""total"": 0, ""startAt"": 0, ""comments"": [], ""maxResults"": 0}, ""created"": ""2020-06-12T08:52:12.678+0800"", ""creator"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""duedate"": null, ""flagged"": false, ""project"": {""id"": ""10003"", ""key"": ""EE"", ""name"": ""Enterprise Edition"", ""self"": ""https://merico.atlassian.net/rest/api/2/project/10003"", ""avatarUrls"": {""16x16"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=xsmall"", ""24x24"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=small"", ""32x32"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=medium"", ""48x48"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552""}, ""simplified"": false, ""projectTypeKey"": ""software""}, ""summary"": ""后端接口"", ""updated"": ""2021-03-28T16:05:55.685+0800"", ""watches"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-36/watchers"", ""isWatching"": false, ""watchCount"": 1}, ""worklog"": {""total"": 0, ""startAt"": 0, ""worklogs"": [], ""maxResults"": 20}, ""assignee"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5ecfbd0ba04d9c0c220c18d8"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5ecfbd0ba04d9c0c220c18d8"", ""avatarUrls"": {""16x16"": ""https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/5ecfbd0ba04d9c0c220c18d8/22fb069e-32f9-4ab8-be11-ee4e76e2e0b1/16"", ""24x24"": ""https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/5ecfbd0ba04d9c0c220c18d8/22fb069e-32f9-4ab8-be11-ee4e76e2e0b1/24"", ""32x32"": ""https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/5ecfbd0ba04d9c0c220c18d8/22fb069e-32f9-4ab8-be11-ee4e76e2e0b1/32"", ""48x48"": ""https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/5ecfbd0ba04d9c0c220c18d8/22fb069e-32f9-4ab8-be11-ee4e76e2e0b1/48""}, ""accountType"": ""atlassian"", ""displayName"": ""yanghui""}, ""priority"": {""id"": ""3"", ""name"": ""Medium"", ""self"": ""https://merico.atlassian.net/rest/api/2/priority/3"", ""iconUrl"": ""https://merico.atlassian.net/images/icons/priorities/medium.svg""}, ""progress"": {""total"": 7200, ""percent"": 0, ""progress"": 0}, ""reporter"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""security"": null, ""subtasks"": [], ""versions"": [], ""issuetype"": {""id"": ""10003"", ""name"": ""子任务"", ""self"": ""https://merico.atlassian.net/rest/api/2/issuetype/10003"", ""iconUrl"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"", ""subtask"": true, ""avatarId"": 10316, ""description"": ""大任务中的小任务。"", ""hierarchyLevel"": -1}, ""timespent"": null, ""workratio"": 0, ""attachment"": [], ""components"": [], ""issuelinks"": [], ""lastViewed"": null, ""resolution"": {""id"": ""10000"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/resolution/10000"", ""description"": ""事务上的工作已完成。""}, ""description"": null, ""environment"": null, ""fixVersions"": [], ""timeestimate"": 7200, ""timetracking"": {""originalEstimate"": ""2h"", ""remainingEstimate"": ""2h"", ""originalEstimateSeconds"": 7200, ""remainingEstimateSeconds"": 7200}, ""closedSprints"": [{""id"": 7, ""goal"": """", ""name"": ""EE Sprint 7"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/sprint/7"", ""state"": ""closed"", ""endDate"": ""2020-06-26T00:38:00.000Z"", ""startDate"": ""2020-06-12T00:38:51.882Z"", ""completeDate"": ""2020-06-22T05:59:58.980Z"", ""originBoardId"": 8}], ""resolutiondate"": ""2020-06-19T15:35:44.696+0800"", ""issuerestriction"": {""shouldDisplay"": false, ""issuerestrictions"": {}}, ""aggregateprogress"": {""total"": 7200, ""percent"": 0, ""progress"": 0}, ""customfield_10000"": ""{}"", ""customfield_10001"": null, ""customfield_10002"": null, ""customfield_10003"": null, ""customfield_10004"": null, ""customfield_10005"": null, ""customfield_10006"": null, ""customfield_10007"": null, ""customfield_10008"": null, ""customfield_10009"": null, ""customfield_10010"": null, ""customfield_10014"": null, ""customfield_10015"": ""2020-06-12"", ""customfield_10016"": null, ""customfield_10017"": null, ""customfield_10018"": {""showField"": false, ""nonEditableReason"": {""reason"": ""SUBTASK_LINK_SHOULD_BE_USED"", ""message"": ""要为子任务设置父项,请使用子任务链接。""}, ""hasEpicLinkFieldDependency"": false}, ""customfield_10019"": ""0|i000l3:"", ""customfield_10020"": [{""id"": 7, ""goal"": """", ""name"": ""EE Sprint 7"", ""state"": ""closed"", ""boardId"": 8, ""endDate"": ""2020-06-26T00:38:00.000Z"", ""startDate"": ""2020-06-12T00:38:51.882Z"", ""completeDate"": ""2020-06-22T05:59:58.980Z""}], ""customfield_10021"": null, ""customfield_10022"": null, ""customfield_10023"": ""1_*:*_1_*:*_614064109_*|*_3_*:*_1_*:*_9037024_*|*_5_*:*_2_*:*_4922707_*|*_10000_*:*_2_*:*_988236"", ""customfield_10024"": null, ""customfield_10027"": null, ""customfield_10028"": null, ""customfield_10060"": ""2020-06-12"", ""customfield_10061"": null, ""customfield_10062"": null, ""customfield_10063"": null, ""customfield_10064"": null, ""customfield_10065"": null, ""customfield_10066"": null, ""customfield_10068"": null, ""customfield_10070"": null, ""customfield_10071"": null, ""customfield_10073"": [], ""customfield_10074"": null, ""customfield_10075"": null, ""customfield_10076"": null, ""customfield_10077"": null, ""customfield_10078"": null, ""customfield_10079"": null, ""customfield_10080"": null, ""customfield_10081"": null, ""customfield_10082"": null, ""customfield_10083"": null, ""customfield_10084"": null, ""customfield_10085"": null, ""customfield_10086"": null, ""customfield_10087"": null, ""customfield_10088"": null, ""customfield_10089"": null, ""customfield_10090"": null, ""customfield_10091"": null, ""customfield_10092"": null, ""customfield_10093"": null, ""customfield_10095"": null, ""customfield_10096"": null, ""customfield_10097"": null, ""customfield_10098"": null, ""customfield_10099"": null, ""customfield_10100"": null, ""customfield_10101"": null, ""customfield_10102"": null, ""customfield_10103"": null, ""customfield_10104"": null, ""customfield_10105"": null, ""customfield_10106"": null, ""customfield_10107"": null, ""customfield_10108"": null, ""customfield_10109"": null, ""customfield_10113"": null, ""customfield_10114"": null, ""customfield_10115"": null, ""customfield_10116"": null, ""customfield_10117"": null, ""customfield_10118"": null, ""customfield_10119"": null, ""customfield_10120"": null, ""customfield_10121"": null, ""customfield_10122"": null, ""customfield_10123"": null, ""customfield_10124"": null, ""customfield_10125"": null, ""customfield_10126"": null, ""customfield_10127"": null, ""customfield_10128"": null, ""customfield_10129"": null, ""customfield_10130"": null, ""customfield_10131"": null, ""customfield_10132"": null, ""customfield_10133"": null, ""customfield_10134"": null, ""customfield_10135"": null, ""customfield_10136"": null, ""customfield_10137"": null, ""customfield_10138"": null, ""customfield_10140"": null, ""customfield_10141"": null, ""customfield_10142"": null, ""customfield_10143"": null, ""customfield_10145"": null, ""customfield_10146"": null, ""customfield_10150"": null, ""customfield_10151"": null, ""customfield_10152"": null, ""customfield_10153"": null, ""customfield_10154"": null, ""customfield_10155"": null, ""customfield_10156"": null, ""customfield_10157"": null, ""aggregatetimespent"": null, ""timeoriginalestimate"": 7200, ""aggregatetimeestimate"": 7200, ""statuscategorychangedate"": ""2020-06-19T15:35:44.740+0800"", ""aggregatetimeoriginalestimate"": 7200}, ""changelog"": {""total"": 15, ""startAt"": 0, ""histories"": [{""id"": ""90442"", ""items"": [{""to"": ""21128"", ""from"": ""17971"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE-subtask2"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE-subtask""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2021-04-01T08:52:14.994+0800""}, {""id"": ""86149"", ""items"": [{""to"": ""10068"", ""from"": ""6"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""已完成"", ""fieldtype"": ""jira"", ""fromString"": ""Closed""}, {""to"": ""17971"", ""from"": ""13632"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE-subtask"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2021-03-28T16:05:55.687+0800""}, {""id"": ""35122"", ""items"": [{""to"": ""6"", ""from"": ""5"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Closed"", ""fieldtype"": ""jira"", ""fromString"": ""Resolved""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-11-10T09:43:10.712+0800""}, {""id"": ""33524"", ""items"": [{""to"": ""13632"", ""from"": ""11957"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE"", ""fieldtype"": ""jira"", ""fromString"": ""EE Workflow v0.3""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-11-09T16:52:13.053+0800""}, {""id"": ""25420"", ""items"": [{""to"": ""2020-06-12"", ""from"": null, ""field"": ""Start date"", ""fieldId"": ""customfield_10015"", ""toString"": ""12/Jun/20"", ""fieldtype"": ""custom"", ""fromString"": null}, {""to"": ""2020-06-12"", ""from"": null, ""field"": ""End date"", ""fieldId"": ""customfield_10060"", ""toString"": ""12/Jun/20"", ""fieldtype"": ""custom"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=557058%3A46121f43-e58d-4ff4-83fd-a79fb4b71b45"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""557058:46121f43-e58d-4ff4-83fd-a79fb4b71b45"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""24x24"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""32x32"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""48x48"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png""}, ""accountType"": ""app"", ""displayName"": ""BigPicture - for ppm, project management""}, ""created"": ""2020-08-31T12:47:29.230+0800"", ""historyMetadata"": {""description"": "" on behalf of accountId=5e9711ba34f7b90c0fbc37d3""}}, {""id"": ""17913"", ""items"": [{""to"": ""11957"", ""from"": ""11362"", ""field"": ""Workflow"", ""toString"": ""EE Workflow v0.3"", ""fieldtype"": ""jira"", ""fromString"": ""EE Workflow v0.2""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-13T16:42:21.987+0800""}, {""id"": ""17317"", ""items"": [{""to"": ""11362"", ""from"": ""10489"", ""field"": ""Workflow"", ""toString"": ""EE Workflow v0.2"", ""fieldtype"": ""jira"", ""fromString"": ""jira""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-13T16:39:11.607+0800""}, {""id"": ""12050"", ""items"": [{""to"": ""10000"", ""from"": null, ""field"": ""resolution"", ""fieldId"": ""resolution"", ""toString"": ""Done"", ""fieldtype"": ""jira"", ""fromString"": null}, {""to"": ""5"", ""from"": ""1"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Resolved"", ""fieldtype"": ""jira"", ""fromString"": ""Open""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5ecfbd0ba04d9c0c220c18d8"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5ecfbd0ba04d9c0c220c18d8"", ""avatarUrls"": {""16x16"": ""https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/5ecfbd0ba04d9c0c220c18d8/22fb069e-32f9-4ab8-be11-ee4e76e2e0b1/16"", ""24x24"": ""https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/5ecfbd0ba04d9c0c220c18d8/22fb069e-32f9-4ab8-be11-ee4e76e2e0b1/24"", ""32x32"": ""https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/5ecfbd0ba04d9c0c220c18d8/22fb069e-32f9-4ab8-be11-ee4e76e2e0b1/32"", ""48x48"": ""https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/5ecfbd0ba04d9c0c220c18d8/22fb069e-32f9-4ab8-be11-ee4e76e2e0b1/48""}, ""accountType"": ""atlassian"", ""displayName"": ""yanghui""}, ""created"": ""2020-06-19T15:35:44.754+0800""}, {""id"": ""10989"", ""items"": [{""to"": ""1"", ""from"": ""10000"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Open"", ""fieldtype"": ""jira"", ""fromString"": ""To Do""}, {""to"": ""10489"", ""from"": ""10440"", ""field"": ""Workflow"", ""toString"": ""jira"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T13:01:20.645+0800""}, {""id"": ""10940"", ""items"": [{""to"": ""10000"", ""from"": ""5"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""To Do"", ""fieldtype"": ""jira"", ""fromString"": ""Resolved""}, {""to"": ""10440"", ""from"": ""10385"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE"", ""fieldtype"": ""jira"", ""fromString"": ""Sprint Workflow for EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T12:58:47.489+0800""}, {""id"": ""10910"", ""items"": [{""to"": ""5"", ""from"": ""3"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Resolved"", ""fieldtype"": ""jira"", ""fromString"": ""In Development""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T11:36:44.782+0800""}, {""id"": ""10779"", ""items"": [{""to"": ""3"", ""from"": ""10000"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""In Development"", ""fieldtype"": ""jira"", ""fromString"": ""To Do""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:06:07.758+0800""}, {""id"": ""10767"", ""items"": [{""to"": ""7200"", ""from"": null, ""field"": ""timeestimate"", ""fieldId"": ""timeestimate"", ""toString"": ""7200"", ""fieldtype"": ""jira"", ""fromString"": null}, {""to"": ""7200"", ""from"": null, ""field"": ""timeoriginalestimate"", ""fieldId"": ""timeoriginalestimate"", ""toString"": ""7200"", ""fieldtype"": ""jira"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:04:01.873+0800""}, {""id"": ""10766"", ""items"": [{""to"": ""5ecfbd0ba04d9c0c220c18d8"", ""from"": null, ""field"": ""assignee"", ""fieldId"": ""assignee"", ""toString"": ""yanghui"", ""fieldtype"": ""jira"", ""fromString"": null, ""tmpToAccountId"": ""5ecfbd0ba04d9c0c220c18d8"", ""tmpFromAccountId"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:03:59.387+0800""}, {""id"": ""10755"", ""items"": [{""to"": ""10065"", ""from"": null, ""field"": ""Parent"", ""toString"": ""EE-3"", ""fieldtype"": ""jira"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T08:52:12.893+0800""}], ""maxResults"": 15}}","https://merico.atlassian.net/rest/agile/1.0/board/8/issue?expand=changelog&jql=updated+%3E%3D+%272006%2F01%2F02+15%3A04%27+ORDER+BY+created+ASC&maxResults=100&startAt=0","null","2022-06-23 10:43:19.866" 12470,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10099"", ""key"": ""EE-37"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10099"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-37/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""parent"": {""id"": ""10065"", ""key"": ""EE-3"", ""self"": ""https://merico.atlassian.net/rest/api/2/issue/10065"", ""fields"": {""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/status/10068"", ""iconUrl"": ""https://merico.atlassian.net/"", ""description"": ""This status is managed internally by Jira Software"", ""statusCategory"": {""id"": 3, ""key"": ""done"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/statuscategory/3"", ""colorName"": ""green""}}, ""summary"": ""​问题积压图率"", ""priority"": {""id"": ""3"", ""name"": ""Medium"", ""self"": ""https://merico.atlassian.net/rest/api/2/priority/3"", ""iconUrl"": ""https://merico.atlassian.net/images/icons/priorities/medium.svg""}, ""issuetype"": {""id"": ""10001"", ""name"": ""故事"", ""self"": ""https://merico.atlassian.net/rest/api/2/issuetype/10001"", ""iconUrl"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"", ""subtask"": false, ""avatarId"": 10315, ""description"": ""表述为用户目标的功能。"", ""hierarchyLevel"": 0}}}, ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/status/10068"", ""iconUrl"": ""https://merico.atlassian.net/"", ""description"": ""This status is managed internally by Jira Software"", ""statusCategory"": {""id"": 3, ""key"": ""done"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/statuscategory/3"", ""colorName"": ""green""}}, ""comment"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/10099/comment"", ""total"": 0, ""startAt"": 0, ""comments"": [], ""maxResults"": 0}, ""created"": ""2020-06-12T08:52:23.456+0800"", ""creator"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""duedate"": null, ""flagged"": false, ""project"": {""id"": ""10003"", ""key"": ""EE"", ""name"": ""Enterprise Edition"", ""self"": ""https://merico.atlassian.net/rest/api/2/project/10003"", ""avatarUrls"": {""16x16"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=xsmall"", ""24x24"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=small"", ""32x32"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=medium"", ""48x48"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552""}, ""simplified"": false, ""projectTypeKey"": ""software""}, ""summary"": ""数据填充与联调 "", ""updated"": ""2021-03-28T16:05:55.638+0800"", ""watches"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-37/watchers"", ""isWatching"": false, ""watchCount"": 1}, ""worklog"": {""total"": 0, ""startAt"": 0, ""worklogs"": [], ""maxResults"": 20}, ""assignee"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5ecfbd0c730ec90c1999cadf"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5ecfbd0c730ec90c1999cadf"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""24x24"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""32x32"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""48x48"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Dingding Zhang""}, ""priority"": {""id"": ""3"", ""name"": ""Medium"", ""self"": ""https://merico.atlassian.net/rest/api/2/priority/3"", ""iconUrl"": ""https://merico.atlassian.net/images/icons/priorities/medium.svg""}, ""progress"": {""total"": 0, ""progress"": 0}, ""reporter"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""security"": null, ""subtasks"": [], ""versions"": [], ""issuetype"": {""id"": ""10003"", ""name"": ""子任务"", ""self"": ""https://merico.atlassian.net/rest/api/2/issuetype/10003"", ""iconUrl"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"", ""subtask"": true, ""avatarId"": 10316, ""description"": ""大任务中的小任务。"", ""hierarchyLevel"": -1}, ""timespent"": null, ""workratio"": -1, ""attachment"": [], ""components"": [], ""issuelinks"": [], ""lastViewed"": null, ""resolution"": {""id"": ""10000"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/resolution/10000"", ""description"": ""事务上的工作已完成。""}, ""description"": null, ""environment"": null, ""fixVersions"": [{""id"": ""10026"", ""name"": ""v2.7.0"", ""self"": ""https://merico.atlassian.net/rest/api/2/version/10026"", ""archived"": false, ""released"": true, ""description"": """", ""releaseDate"": ""2020-07-10""}], ""timeestimate"": null, ""timetracking"": {}, ""closedSprints"": [{""id"": 7, ""goal"": """", ""name"": ""EE Sprint 7"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/sprint/7"", ""state"": ""closed"", ""endDate"": ""2020-06-26T00:38:00.000Z"", ""startDate"": ""2020-06-12T00:38:51.882Z"", ""completeDate"": ""2020-06-22T05:59:58.980Z"", ""originBoardId"": 8}], ""resolutiondate"": ""2020-06-18T12:04:31.261+0800"", ""issuerestriction"": {""shouldDisplay"": false, ""issuerestrictions"": {}}, ""aggregateprogress"": {""total"": 0, ""progress"": 0}, ""customfield_10000"": ""{}"", ""customfield_10001"": null, ""customfield_10002"": null, ""customfield_10003"": null, ""customfield_10004"": null, ""customfield_10005"": null, ""customfield_10006"": null, ""customfield_10007"": null, ""customfield_10008"": null, ""customfield_10009"": null, ""customfield_10010"": null, ""customfield_10014"": null, ""customfield_10015"": ""2020-06-12"", ""customfield_10016"": null, ""customfield_10017"": null, ""customfield_10018"": {""showField"": false, ""nonEditableReason"": {""reason"": ""SUBTASK_LINK_SHOULD_BE_USED"", ""message"": ""要为子任务设置父项,请使用子任务链接。""}, ""hasEpicLinkFieldDependency"": false}, ""customfield_10019"": ""0|i000lb:"", ""customfield_10020"": [{""id"": 7, ""goal"": """", ""name"": ""EE Sprint 7"", ""state"": ""closed"", ""boardId"": 8, ""endDate"": ""2020-06-26T00:38:00.000Z"", ""startDate"": ""2020-06-12T00:38:51.882Z"", ""completeDate"": ""2020-06-22T05:59:58.980Z""}], ""customfield_10021"": null, ""customfield_10022"": null, ""customfield_10023"": ""1_*:*_1_*:*_514990822_*|*_5_*:*_1_*:*_0_*|*_10000_*:*_1_*:*_14937097"", ""customfield_10024"": null, ""customfield_10027"": null, ""customfield_10028"": null, ""customfield_10060"": ""2020-06-18"", ""customfield_10061"": null, ""customfield_10062"": null, ""customfield_10063"": null, ""customfield_10064"": null, ""customfield_10065"": null, ""customfield_10066"": null, ""customfield_10068"": null, ""customfield_10070"": null, ""customfield_10071"": null, ""customfield_10073"": [], ""customfield_10074"": null, ""customfield_10075"": null, ""customfield_10076"": null, ""customfield_10077"": null, ""customfield_10078"": null, ""customfield_10079"": null, ""customfield_10080"": null, ""customfield_10081"": null, ""customfield_10082"": null, ""customfield_10083"": null, ""customfield_10084"": null, ""customfield_10085"": null, ""customfield_10086"": null, ""customfield_10087"": null, ""customfield_10088"": null, ""customfield_10089"": null, ""customfield_10090"": null, ""customfield_10091"": null, ""customfield_10092"": null, ""customfield_10093"": null, ""customfield_10095"": null, ""customfield_10096"": null, ""customfield_10097"": null, ""customfield_10098"": null, ""customfield_10099"": null, ""customfield_10100"": null, ""customfield_10101"": null, ""customfield_10102"": null, ""customfield_10103"": null, ""customfield_10104"": null, ""customfield_10105"": null, ""customfield_10106"": null, ""customfield_10107"": null, ""customfield_10108"": null, ""customfield_10109"": null, ""customfield_10113"": null, ""customfield_10114"": null, ""customfield_10115"": null, ""customfield_10116"": null, ""customfield_10117"": null, ""customfield_10118"": null, ""customfield_10119"": null, ""customfield_10120"": null, ""customfield_10121"": null, ""customfield_10122"": null, ""customfield_10123"": null, ""customfield_10124"": null, ""customfield_10125"": null, ""customfield_10126"": null, ""customfield_10127"": null, ""customfield_10128"": null, ""customfield_10129"": null, ""customfield_10130"": null, ""customfield_10131"": null, ""customfield_10132"": null, ""customfield_10133"": null, ""customfield_10134"": null, ""customfield_10135"": null, ""customfield_10136"": null, ""customfield_10137"": null, ""customfield_10138"": null, ""customfield_10140"": null, ""customfield_10141"": null, ""customfield_10142"": null, ""customfield_10143"": null, ""customfield_10145"": null, ""customfield_10146"": null, ""customfield_10150"": null, ""customfield_10151"": null, ""customfield_10152"": null, ""customfield_10153"": null, ""customfield_10154"": null, ""customfield_10155"": null, ""customfield_10156"": null, ""customfield_10157"": null, ""aggregatetimespent"": null, ""timeoriginalestimate"": null, ""aggregatetimeestimate"": null, ""statuscategorychangedate"": ""2020-06-18T12:04:31.361+0800"", ""aggregatetimeoriginalestimate"": null}, ""changelog"": {""total"": 13, ""startAt"": 0, ""histories"": [{""id"": ""90441"", ""items"": [{""to"": ""21127"", ""from"": ""17970"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE-subtask2"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE-subtask""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2021-04-01T08:52:14.944+0800""}, {""id"": ""86148"", ""items"": [{""to"": ""10068"", ""from"": ""6"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""已完成"", ""fieldtype"": ""jira"", ""fromString"": ""Closed""}, {""to"": ""17970"", ""from"": ""13630"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE-subtask"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2021-03-28T16:05:55.640+0800""}, {""id"": ""35118"", ""items"": [{""to"": ""6"", ""from"": ""5"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Closed"", ""fieldtype"": ""jira"", ""fromString"": ""Resolved""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-11-10T09:43:10.084+0800""}, {""id"": ""33522"", ""items"": [{""to"": ""13630"", ""from"": ""11961"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE"", ""fieldtype"": ""jira"", ""fromString"": ""EE Workflow v0.3""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-11-09T16:52:12.997+0800""}, {""id"": ""25413"", ""items"": [{""to"": ""2020-06-12"", ""from"": null, ""field"": ""Start date"", ""fieldId"": ""customfield_10015"", ""toString"": ""12/Jun/20"", ""fieldtype"": ""custom"", ""fromString"": null}, {""to"": ""2020-06-18"", ""from"": null, ""field"": ""End date"", ""fieldId"": ""customfield_10060"", ""toString"": ""18/Jun/20"", ""fieldtype"": ""custom"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=557058%3A46121f43-e58d-4ff4-83fd-a79fb4b71b45"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""557058:46121f43-e58d-4ff4-83fd-a79fb4b71b45"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""24x24"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""32x32"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""48x48"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png""}, ""accountType"": ""app"", ""displayName"": ""BigPicture - for ppm, project management""}, ""created"": ""2020-08-31T12:47:28.407+0800"", ""historyMetadata"": {""description"": "" on behalf of accountId=5e9711ba34f7b90c0fbc37d3""}}, {""id"": ""18912"", ""items"": [{""to"": null, ""from"": ""10008"", ""field"": ""Fix Version"", ""fieldId"": ""fixVersions"", ""toString"": null, ""fieldtype"": ""jira"", ""fromString"": ""v2.7.0""}, {""to"": ""10026"", ""from"": null, ""field"": ""Fix Version"", ""fieldId"": ""fixVersions"", ""toString"": ""SaaS"", ""fieldtype"": ""jira"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-14T05:35:56.738+0800""}, {""id"": ""17917"", ""items"": [{""to"": ""11961"", ""from"": ""11366"", ""field"": ""Workflow"", ""toString"": ""EE Workflow v0.3"", ""fieldtype"": ""jira"", ""fromString"": ""EE Workflow v0.2""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-13T16:42:22.098+0800""}, {""id"": ""17321"", ""items"": [{""to"": ""11366"", ""from"": ""10479"", ""field"": ""Workflow"", ""toString"": ""EE Workflow v0.2"", ""fieldtype"": ""jira"", ""fromString"": ""jira""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-13T16:39:11.719+0800""}, {""id"": ""11773"", ""items"": [{""to"": ""10008"", ""from"": null, ""field"": ""Fix Version"", ""fieldId"": ""fixVersions"", ""toString"": ""v2.7.0"", ""fieldtype"": ""jira"", ""fromString"": null}, {""to"": ""10000"", ""from"": null, ""field"": ""resolution"", ""fieldId"": ""resolution"", ""toString"": ""Done"", ""fieldtype"": ""jira"", ""fromString"": null}, {""to"": ""5"", ""from"": ""1"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Resolved"", ""fieldtype"": ""jira"", ""fromString"": ""Open""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5ecfbd0c730ec90c1999cadf"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5ecfbd0c730ec90c1999cadf"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""24x24"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""32x32"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""48x48"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Dingding Zhang""}, ""created"": ""2020-06-18T12:04:31.375+0800""}, {""id"": ""10979"", ""items"": [{""to"": ""1"", ""from"": ""10000"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Open"", ""fieldtype"": ""jira"", ""fromString"": ""To Do""}, {""to"": ""10479"", ""from"": ""10419"", ""field"": ""Workflow"", ""toString"": ""jira"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T13:01:20.553+0800""}, {""id"": ""10919"", ""items"": [{""to"": ""10419"", ""from"": ""10386"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE"", ""fieldtype"": ""jira"", ""fromString"": ""Sprint Workflow for EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T12:58:46.910+0800""}, {""id"": ""10772"", ""items"": [{""to"": ""5ecfbd0c730ec90c1999cadf"", ""from"": null, ""field"": ""assignee"", ""fieldId"": ""assignee"", ""toString"": ""Dingding Zhang"", ""fieldtype"": ""jira"", ""fromString"": null, ""tmpToAccountId"": ""5ecfbd0c730ec90c1999cadf"", ""tmpFromAccountId"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:05:14.147+0800""}, {""id"": ""10757"", ""items"": [{""to"": ""10065"", ""from"": null, ""field"": ""Parent"", ""toString"": ""EE-3"", ""fieldtype"": ""jira"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T08:52:23.725+0800""}], ""maxResults"": 13}}","https://merico.atlassian.net/rest/agile/1.0/board/8/issue?expand=changelog&jql=updated+%3E%3D+%272006%2F01%2F02+15%3A04%27+ORDER+BY+created+ASC&maxResults=100&startAt=0","null","2022-06-23 10:43:19.866" +13000,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20708"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20708"",""key"":""K5-2"",""changelog"":{""startAt"":0,""maxResults"":2,""total"":2,""histories"":[{""id"":""422892"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:30:23.343+0800"",""items"":[{""field"":""Epic Link"",""fieldtype"":""custom"",""fieldId"":""customfield_10014"",""from"":null,""fromString"":null,""to"":""20707"",""toString"":""K5-1""}]},{""id"":""422890"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:30:23.321+0800"",""items"":[{""field"":""IssueParentAssociation"",""fieldtype"":""jira"",""from"":null,""fromString"":null,""to"":""20707"",""toString"":""K5-1""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:29:49.427+0800"",""parent"":{""id"":""20707"",""key"":""K5-1"",""self"":""https://merico.atlassian.net/rest/api/2/issue/20707"",""fields"":{""summary"":""test epic"",""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1}}},""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""fixVersions"":[],""customfield_10077"":null,""customfield_10078"":null,""customfield_10079"":null,""resolution"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-16T07:10:31.302+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""epic"":{""id"":20707,""key"":""K5-1"",""self"":""https://merico.atlassian.net/rest/agile/1.0/epic/20707"",""name"":""Outside Epic"",""summary"":""test epic"",""color"":{""key"":""color_9""},""done"":false},""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10068"":null,""customfield_10101"":null,""customfield_10102"":null,""customfield_10103"":null,""labels"":[],""aggregatetimeoriginalestimate"":null,""timeestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10165"":null,""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-2/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10001"",""id"":""10001"",""description"":""具体一个功能点,以用户角度,大小适中,可以满足某一个需要为原则。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0},""timespent"":null,""customfield_10150"":null,""sprint"":{""id"":175,""self"":""https://merico.atlassian.net/rest/agile/1.0/sprint/175"",""state"":""active"",""name"":""K5 Sprint 1"",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z"",""originBoardId"":92,""goal"":""""},""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-2/watchers"",""watchCount"":1,""isWatching"":true},""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""created"":""2022-07-16T06:29:49.026+0800"",""customfield_10140"":null,""customfield_10141"":null,""customfield_10020"":[{""id"":175,""name"":""K5 Sprint 1"",""state"":""active"",""boardId"":92,""goal"":"""",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z""}],""customfield_10142"":null,""customfield_10021"":null,""customfield_10143"":null,""customfield_10022"":null,""customfield_10023"":null,""customfield_10024"":null,""customfield_10145"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10138"":null,""customfield_10017"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":false,""nonEditableReason"":{""reason"":""EPIC_LINK_SHOULD_BE_USED"",""message"":""To set an epic as the parent, use the epic link instead""}},""customfield_10019"":""0|i01oz7:"",""updated"":""2022-07-16T06:30:23.341+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""customfield_10130"":null,""customfield_10097"":null,""description"":null,""customfield_10098"":null,""customfield_10131"":null,""customfield_10010"":null,""customfield_10132"":null,""customfield_10099"":null,""customfield_10133"":null,""customfield_10134"":null,""customfield_10014"":""K5-1"",""customfield_10135"":null,""timetracking"":{},""customfield_10015"":null,""customfield_10136"":null,""customfield_10005"":null,""customfield_10126"":null,""customfield_10127"":null,""customfield_10006"":null,""security"":null,""customfield_10007"":null,""customfield_10128"":null,""customfield_10129"":null,""customfield_10008"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""first story"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10000"":""{}"",""customfield_10121"":null,""customfield_10088"":null,""customfield_10089"":null,""customfield_10122"":null,""customfield_10001"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10124"":null,""customfield_10003"":null,""customfield_10125"":null,""customfield_10004"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20708/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 +13001,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20709"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20709"",""key"":""K5-3"",""changelog"":{""startAt"":0,""maxResults"":2,""total"":2,""histories"":[{""id"":""422897"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.616+0800"",""items"":[{""field"":""Epic Link"",""fieldtype"":""custom"",""fieldId"":""customfield_10014"",""from"":null,""fromString"":null,""to"":""20710"",""toString"":""K5-4""}]},{""id"":""422895"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.588+0800"",""items"":[{""field"":""IssueParentAssociation"",""fieldtype"":""jira"",""from"":null,""fromString"":null,""to"":""20710"",""toString"":""K5-4""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:30:43.506+0800"",""parent"":{""id"":""20710"",""key"":""K5-4"",""self"":""https://merico.atlassian.net/rest/api/2/issue/20710"",""fields"":{""summary"":""K5 epic"",""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1}}},""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""fixVersions"":[],""customfield_10077"":null,""customfield_10078"":null,""resolution"":null,""customfield_10079"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-16T06:30:48.020+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""epic"":{""id"":20710,""key"":""K5-4"",""self"":""https://merico.atlassian.net/rest/agile/1.0/epic/20710"",""name"":""K5 Epic"",""summary"":""K5 epic"",""color"":{""key"":""color_3""},""done"":false},""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10068"":null,""customfield_10101"":null,""customfield_10102"":null,""labels"":[],""customfield_10103"":null,""timeestimate"":null,""aggregatetimeoriginalestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10165"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-3/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10001"",""id"":""10001"",""description"":""具体一个功能点,以用户角度,大小适中,可以满足某一个需要为原则。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0},""timespent"":null,""customfield_10150"":null,""sprint"":{""id"":175,""self"":""https://merico.atlassian.net/rest/agile/1.0/sprint/175"",""state"":""active"",""name"":""K5 Sprint 1"",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z"",""originBoardId"":92,""goal"":""""},""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""aggregatetimespent"":null,""customfield_10155"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-3/watchers"",""watchCount"":1,""isWatching"":true},""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""created"":""2022-07-16T06:30:43.178+0800"",""customfield_10140"":null,""customfield_10141"":null,""customfield_10020"":[{""id"":175,""name"":""K5 Sprint 1"",""state"":""active"",""boardId"":92,""goal"":"""",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z""}],""customfield_10142"":null,""customfield_10021"":null,""customfield_10143"":null,""customfield_10022"":null,""customfield_10023"":null,""customfield_10145"":null,""customfield_10024"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10017"":null,""customfield_10138"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":false,""nonEditableReason"":{""reason"":""EPIC_LINK_SHOULD_BE_USED"",""message"":""To set an epic as the parent, use the epic link instead""}},""customfield_10019"":""0|i01ozf:"",""updated"":""2022-07-16T06:31:38.612+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10130"":null,""customfield_10097"":null,""customfield_10098"":null,""customfield_10010"":null,""customfield_10131"":null,""customfield_10132"":null,""customfield_10099"":null,""customfield_10133"":null,""customfield_10134"":null,""customfield_10014"":""K5-4"",""customfield_10135"":null,""customfield_10136"":null,""customfield_10015"":null,""timetracking"":{},""customfield_10126"":null,""customfield_10005"":null,""customfield_10006"":null,""customfield_10127"":null,""customfield_10007"":null,""security"":null,""customfield_10128"":null,""customfield_10008"":null,""customfield_10129"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""second story"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10000"":""{}"",""customfield_10121"":null,""customfield_10088"":null,""customfield_10122"":null,""customfield_10089"":null,""customfield_10001"":null,""customfield_10002"":null,""customfield_10123"":null,""customfield_10003"":null,""customfield_10124"":null,""customfield_10125"":null,""customfield_10004"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20709/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 +13002,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20710"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20710"",""key"":""K5-4"",""changelog"":{""startAt"":0,""maxResults"":1,""total"":1,""histories"":[{""id"":""422896"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.602+0800"",""items"":[{""field"":""Epic Child"",""fieldtype"":""custom"",""from"":null,""fromString"":null,""to"":""20709"",""toString"":""K5-3""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:31:16.183+0800"",""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""customfield_10077"":null,""fixVersions"":[],""customfield_10078"":null,""customfield_10079"":null,""resolution"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-20T01:43:28.123+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10101"":null,""customfield_10068"":null,""customfield_10102"":null,""customfield_10103"":null,""labels"":[],""aggregatetimeoriginalestimate"":null,""timeestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10165"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-4/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1},""timespent"":null,""customfield_10150"":null,""sprint"":null,""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-4/watchers"",""watchCount"":1,""isWatching"":true},""created"":""2022-07-16T06:31:15.981+0800"",""customfield_10140"":null,""customfield_10020"":null,""customfield_10141"":null,""customfield_10142"":null,""customfield_10021"":null,""customfield_10022"":null,""customfield_10143"":null,""customfield_10023"":null,""customfield_10024"":null,""customfield_10145"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10017"":""yellow"",""customfield_10138"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":true},""customfield_10019"":""0|i01ozn:"",""updated"":""2022-07-16T06:31:38.598+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10130"":null,""customfield_10097"":null,""customfield_10098"":null,""customfield_10131"":null,""customfield_10010"":null,""customfield_10099"":null,""customfield_10011"":""K5 Epic"",""customfield_10132"":null,""customfield_10012"":{""self"":""https://merico.atlassian.net/rest/api/2/customFieldOption/10016"",""value"":""To Do"",""id"":""10016""},""customfield_10133"":null,""customfield_10134"":null,""customfield_10013"":""ghx-label-3"",""customfield_10135"":null,""customfield_10014"":null,""customfield_10015"":null,""timetracking"":{},""customfield_10136"":null,""customfield_10005"":null,""customfield_10126"":null,""customfield_10127"":null,""customfield_10006"":null,""customfield_10128"":null,""customfield_10007"":null,""security"":null,""customfield_10008"":null,""customfield_10129"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""K5 epic"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10088"":null,""customfield_10121"":null,""customfield_10000"":""{}"",""customfield_10089"":null,""customfield_10122"":null,""customfield_10001"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10003"":null,""customfield_10124"":null,""customfield_10004"":null,""customfield_10125"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20710/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 diff --git a/plugins/jira/e2e/raw_tables/_raw_jira_external_epics.csv b/plugins/jira/e2e/raw_tables/_raw_jira_external_epics.csv new file mode 100644 index 00000000000..84b359a3f2e --- /dev/null +++ b/plugins/jira/e2e/raw_tables/_raw_jira_external_epics.csv @@ -0,0 +1,2 @@ +id,params,data,url,input,created_at +9,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,customfield_10010.requestTypePractice,renderedFields"",""id"":""20707"",""self"":""https://merico.atlassian.net/rest/api/2/issue/20707"",""key"":""K5-1"",""changelog"":{""startAt"":0,""maxResults"":2,""total"":2,""histories"":[{""id"":""422898"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:54:52.085+0800"",""items"":[{""field"":""Epic Name"",""fieldtype"":""custom"",""fieldId"":""customfield_10011"",""from"":null,""fromString"":""Epic for B1"",""to"":null,""toString"":""Outside Epic""}]},{""id"":""422891"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:30:23.334+0800"",""items"":[{""field"":""Epic Child"",""fieldtype"":""custom"",""from"":null,""fromString"":null,""to"":""20708"",""toString"":""K5-2""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:15:44.185+0800"",""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""customfield_10077"":null,""fixVersions"":[],""customfield_10078"":null,""resolution"":null,""customfield_10079"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-16T07:10:39.685+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""customfield_10066"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10100"":null,""customfield_10101"":null,""customfield_10068"":null,""customfield_10102"":null,""labels"":[],""customfield_10103"":null,""timeestimate"":null,""aggregatetimeoriginalestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10164"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10165"":null,""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-1/votes"",""votes"":0,""hasVoted"":false},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1},""timespent"":null,""customfield_10150"":null,""customfield_10151"":null,""customfield_10152"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-1/watchers"",""watchCount"":1,""isWatching"":true},""created"":""2022-07-16T06:15:43.810+0800"",""customfield_10140"":null,""customfield_10020"":null,""customfield_10141"":null,""customfield_10021"":null,""customfield_10142"":null,""customfield_10022"":null,""customfield_10143"":null,""customfield_10023"":null,""customfield_10145"":null,""customfield_10024"":null,""customfield_10146"":null,""customfield_10137"":null,""customfield_10016"":null,""customfield_10138"":null,""customfield_10017"":""orange"",""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":true},""customfield_10019"":""0|i01oyz:"",""updated"":""2022-07-16T06:54:52.078+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10097"":null,""customfield_10130"":null,""customfield_10010"":null,""customfield_10131"":null,""customfield_10098"":null,""customfield_10132"":null,""customfield_10011"":""Outside Epic"",""customfield_10099"":null,""customfield_10012"":{""self"":""https://merico.atlassian.net/rest/api/2/customFieldOption/10016"",""value"":""To Do"",""id"":""10016""},""customfield_10133"":null,""customfield_10134"":null,""customfield_10013"":""ghx-label-9"",""customfield_10135"":null,""customfield_10014"":null,""customfield_10136"":null,""customfield_10015"":null,""customfield_10126"":null,""customfield_10005"":null,""customfield_10127"":null,""customfield_10006"":null,""security"":null,""customfield_10007"":null,""customfield_10128"":null,""customfield_10129"":null,""customfield_10008"":null,""customfield_10009"":null,""summary"":""test epic"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10120"":null,""customfield_10087"":null,""customfield_10000"":""{}"",""customfield_10121"":null,""customfield_10088"":null,""customfield_10089"":null,""customfield_10001"":null,""customfield_10122"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10124"":null,""customfield_10003"":null,""customfield_10004"":null,""customfield_10125"":null,""customfield_10115"":null,""customfield_10116"":null,""environment"":null,""customfield_10117"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null}}",https://merico.atlassian.net/rest/api/2/search?expand=changelog&issue+in=%28K5-1%29&jql=issue+in+%28K5-1%29+ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-20T00:15:43.541+00:00 diff --git a/plugins/jira/e2e/snapshot_tables/_tool_jira_board_issues_for_external_epics.csv b/plugins/jira/e2e/snapshot_tables/_tool_jira_board_issues_for_external_epics.csv new file mode 100644 index 00000000000..cd0504917e8 --- /dev/null +++ b/plugins/jira/e2e/snapshot_tables/_tool_jira_board_issues_for_external_epics.csv @@ -0,0 +1,4 @@ +connection_id,board_id,issue_id +1,93,20708 +1,93,20709 +1,93,20710 diff --git a/plugins/jira/e2e/snapshot_tables/_tool_jira_boards_for_external_epics.csv b/plugins/jira/e2e/snapshot_tables/_tool_jira_boards_for_external_epics.csv new file mode 100644 index 00000000000..5dbb4dfa996 --- /dev/null +++ b/plugins/jira/e2e/snapshot_tables/_tool_jira_boards_for_external_epics.csv @@ -0,0 +1,2 @@ +connection_id,board_id,created_at,updated_at,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,project_id,name,self,type +1,93,2022-07-19T19:36:30.254+00:00,2022-07-19T19:36:30.254+00:00,"{""ConnectionId"":1,""BoardId"":93}",_raw_jira_api_boards,1,,10050,test_board,https://merico.atlassian.net/rest/agile/1.0/board/93,kanban diff --git a/plugins/jira/e2e/snapshot_tables/_tool_jira_issues_for_external_epics.csv b/plugins/jira/e2e/snapshot_tables/_tool_jira_issues_for_external_epics.csv new file mode 100644 index 00000000000..d1f5c8cb137 --- /dev/null +++ b/plugins/jira/e2e/snapshot_tables/_tool_jira_issues_for_external_epics.csv @@ -0,0 +1,5 @@ +connection_id,issue_id,project_id,self,icon_url,issue_key,summary,type,epic_key,status_name,status_key,story_point,original_estimate_minutes,aggregate_estimate_minutes,remaining_estimate_minutes,creator_account_id,creator_account_type,creator_display_name,assignee_account_id,assignee_account_type,assignee_display_name,priority_id,priority_name,parent_id,parent_key,sprint_id,sprint_name,resolution_date,created,updated,spent_minutes,lead_time_minutes,std_story_point,std_type,std_status,all_fields,created_at,updated_at,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark +1,20707,10050,https://merico.atlassian.net/rest/api/2/issue/20707,https://merico.atlassian.net/images/icons/issuetypes/epic.svg,K5-1,test epic,Epic,,To Do,new,0,0,0,0,62a2d08d1be00a0068af1945,,Keon Amini,,,,3,Medium,0,,0,,,2022-07-15T22:15:43.810+00:00,2022-07-15T22:54:52.078+00:00,0,0,0,EPIC,TODO,,2022-07-20T00:16:37.030+00:00,2022-07-20T00:16:37.030+00:00,"{""ConnectionId"":1,""BoardId"":93}",_raw_jira_external_epics,9, +1,20708,10050,https://merico.atlassian.net/rest/agile/1.0/issue/20708,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,K5-2,first story,Story,K5-1,To Do,new,0,0,0,0,62a2d08d1be00a0068af1945,,Keon Amini,,,,3,Medium,20707,K5-1,175,K5 Sprint 1,,2022-07-15T22:29:49.026+00:00,2022-07-15T22:30:23.341+00:00,0,0,0,STORY,TODO,,2022-07-20T00:15:41.988+00:00,2022-07-20T00:15:41.988+00:00,"{""ConnectionId"":1,""BoardId"":93}",_raw_jira_api_issues,1, +1,20709,10050,https://merico.atlassian.net/rest/agile/1.0/issue/20709,https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium,K5-3,second story,Story,K5-4,To Do,new,0,0,0,0,62a2d08d1be00a0068af1945,,Keon Amini,,,,3,Medium,20710,K5-4,175,K5 Sprint 1,,2022-07-15T22:30:43.178+00:00,2022-07-15T22:31:38.612+00:00,0,0,0,STORY,TODO,,2022-07-20T00:15:41.988+00:00,2022-07-20T00:15:41.988+00:00,"{""ConnectionId"":1,""BoardId"":93}",_raw_jira_api_issues,2, +1,20710,10050,https://merico.atlassian.net/rest/agile/1.0/issue/20710,https://merico.atlassian.net/images/icons/issuetypes/epic.svg,K5-4,K5 epic,Epic,,To Do,new,0,0,0,0,62a2d08d1be00a0068af1945,,Keon Amini,,,,3,Medium,0,,0,,,2022-07-15T22:31:15.981+00:00,2022-07-15T22:31:38.598+00:00,0,0,0,EPIC,TODO,,2022-07-20T00:15:41.988+00:00,2022-07-20T00:15:41.988+00:00,"{""ConnectionId"":1,""BoardId"":93}",_raw_jira_api_issues,3, diff --git a/plugins/jira/tasks/external_epic_collector.go b/plugins/jira/tasks/external_epic_collector.go index 989300e2ca8..56f24bea590 100644 --- a/plugins/jira/tasks/external_epic_collector.go +++ b/plugins/jira/tasks/external_epic_collector.go @@ -20,6 +20,7 @@ package tasks import ( "fmt" "github.com/apache/incubator-devlake/plugins/core" + "github.com/apache/incubator-devlake/plugins/core/dal" "strings" "github.com/apache/incubator-devlake/plugins/helper" @@ -53,38 +54,9 @@ var CollectExternalEpicsMeta = core.SubTaskMeta{ func CollectExternalEpics(taskCtx core.SubTaskContext) error { db := taskCtx.GetDal() data := taskCtx.GetData().(*JiraTaskData) - - // union of - // 1. issues with epics not from this board and not in the issues table - // 2. issues with epics not from this board that ARE already in the issues table (from previous runs) - // the above two selections are mutually exclusive - cursor, err := db.RawCursor(fmt.Sprintf(` - SELECT tji.epic_key as epicKey FROM _tool_jira_issues tji - LEFT JOIN _tool_jira_board_issues tjbi - ON tji.issue_id = tjbi.issue_id - WHERE - tjbi.board_id = %d AND tji.epic_key != "" AND NOT EXISTS ( - SELECT issue_key FROM _tool_jira_issues tji2 - WHERE tji2.issue_key = tji.epic_key - ) - UNION - SELECT tji.issue_key as epicKey FROM _tool_jira_issues tji - LEFT JOIN _tool_jira_board_issues tjbi - ON tji.issue_id = tjbi.issue_id - WHERE - tjbi.issue_id IS NULL; - `, data.Options.BoardId)) + externalEpicKeys, err := GetExternalEpicKeys(db, data) if err != nil { - return fmt.Errorf("unable to query for external epics: %v", err) - } - var externalEpicKeys []string - for cursor.Next() { - epicKey := "" - err = cursor.Scan(&epicKey) - if err != nil { - return fmt.Errorf("couldn't read returned epic key: %v", err) - } - externalEpicKeys = append(externalEpicKeys, epicKey) + return err } if len(externalEpicKeys) == 0 { taskCtx.GetLogger().Info("no external epic keys found for Jira board %d", data.Options.BoardId) @@ -142,3 +114,39 @@ func CollectExternalEpics(taskCtx core.SubTaskContext) error { } return collector.Execute() } + +func GetExternalEpicKeys(db dal.Dal, data *JiraTaskData) ([]string, error) { + // union of + // 1. issues with epics not from this board and not in the issues table + // 2. issues with epics not from this board that ARE already in the issues table (from previous runs) + // the above two selections are mutually exclusive + cursor, err := db.RawCursor(fmt.Sprintf(` + SELECT tji.epic_key as epicKey FROM _tool_jira_issues tji + LEFT JOIN _tool_jira_board_issues tjbi + ON tji.issue_id = tjbi.issue_id + WHERE + tjbi.board_id = %d AND tji.epic_key != "" AND NOT EXISTS ( + SELECT issue_key FROM _tool_jira_issues tji2 + WHERE tji2.issue_key = tji.epic_key + ) + UNION + SELECT tji.issue_key as epicKey FROM _tool_jira_issues tji + LEFT JOIN _tool_jira_board_issues tjbi + ON tji.issue_id = tjbi.issue_id + WHERE + tjbi.issue_id IS NULL; + `, data.Options.BoardId)) + if err != nil { + return nil, fmt.Errorf("unable to query for external epics: %v", err) + } + var externalEpicKeys []string + for cursor.Next() { + epicKey := "" + err = cursor.Scan(&epicKey) + if err != nil { + return nil, fmt.Errorf("couldn't read returned epic key: %v", err) + } + externalEpicKeys = append(externalEpicKeys, epicKey) + } + return externalEpicKeys, nil +} From ad3ab9b7cf79cae252b9cc35017fd07e7c9b8751 Mon Sep 17 00:00:00 2001 From: Keon Amini Date: Tue, 26 Jul 2022 22:46:53 -0500 Subject: [PATCH 3/7] fix: addressing changes per PR feedback --- api/docs/docs.go | 1233 ----------------- .../{external_epic_test.go => epic_test.go} | 11 +- .../e2e/raw_tables/_raw_jira_api_issues.csv | 2 +- .../raw_tables/_raw_jira_external_epics.csv | 6 +- ...al_epic_collector.go => epic_collector.go} | 63 +- plugins/jira/tasks/epic_extractor.go | 63 + plugins/jira/tasks/external_epic_extractor.go | 136 -- plugins/jira/tasks/issue_extractor.go | 152 +- 8 files changed, 180 insertions(+), 1486 deletions(-) delete mode 100644 api/docs/docs.go rename plugins/jira/e2e/{external_epic_test.go => epic_test.go} (90%) rename plugins/jira/tasks/{external_epic_collector.go => epic_collector.go} (71%) create mode 100644 plugins/jira/tasks/epic_extractor.go delete mode 100644 plugins/jira/tasks/external_epic_extractor.go diff --git a/api/docs/docs.go b/api/docs/docs.go deleted file mode 100644 index aea5836c150..00000000000 --- a/api/docs/docs.go +++ /dev/null @@ -1,1233 +0,0 @@ -// Package docs GENERATED BY SWAG; DO NOT EDIT -// This file was generated by swaggo/swag -package docs - -import "github.com/swaggo/swag" - -const docTemplate = `{ - "schemes": {{ marshal .Schemes }}, - "swagger": "2.0", - "info": { - "description": "{{escape .Description}}", - "title": "{{.Title}}", - "contact": {}, - "version": "{{.Version}}" - }, - "host": "{{.Host}}", - "basePath": "{{.BasePath}}", - "paths": { - "/blueprints": { - "get": { - "description": "get blueprints", - "consumes": [ - "application/json" - ], - "tags": [ - "Blueprints" - ], - "summary": "get blueprints", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/gin.H" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "description": "post blueprints", - "consumes": [ - "application/json" - ], - "tags": [ - "Blueprints" - ], - "summary": "post blueprints", - "parameters": [ - { - "description": "json", - "name": "blueprint", - "in": "body", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Blueprint" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/blueprints/{blueprintId}": { - "get": { - "description": "get blueprints", - "consumes": [ - "application/json" - ], - "tags": [ - "Blueprints" - ], - "summary": "get blueprints", - "parameters": [ - { - "type": "integer", - "description": "blueprint id", - "name": "blueprintId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Blueprint" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "description": "Delete BluePrints", - "tags": [ - "Blueprints" - ], - "summary": "delete blueprints", - "parameters": [ - { - "type": "string", - "description": "blueprintId", - "name": "blueprintId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - }, - "patch": { - "description": "patch blueprints", - "consumes": [ - "application/json" - ], - "tags": [ - "Blueprints" - ], - "summary": "patch blueprints", - "parameters": [ - { - "type": "string", - "description": "blueprintId", - "name": "blueprintId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Blueprint" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/blueprints/{blueprintId}/trigger": { - "post": { - "description": "trigger a blueprint immediately", - "consumes": [ - "application/json" - ], - "tags": [ - "Blueprints" - ], - "summary": "trigger blueprint", - "parameters": [ - { - "type": "string", - "description": "blueprintId", - "name": "blueprintId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Pipeline" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/domainlayer/repos": { - "get": { - "description": "Get all repos from database", - "consumes": [ - "application/json" - ], - "tags": [ - "Domainlayer" - ], - "summary": "Get all repos from database", - "responses": { - "200": { - "description": "{\"repos\": repos, \"count\": count}", - "schema": { - "$ref": "#/definitions/gin.H" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/ping": { - "get": { - "description": "check http status", - "tags": [ - "Ping" - ], - "summary": "Ping", - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/pipelines": { - "get": { - "description": "GET /pipelines?status=TASK_RUNNING\u0026pending=1\u0026page=1\u0026pagesize=10\nRETURN SAMPLE\n{\n\"pipelines\": [\n{\"id\": 1, \"name\": \"test-pipeline\", ...}\n],\n\"count\": 5\n}", - "tags": [ - "pipelines" - ], - "summary": "Get list of pipelines", - "parameters": [ - { - "type": "string", - "description": "query", - "name": "status", - "in": "query", - "required": true - }, - { - "type": "integer", - "description": "query", - "name": "pending", - "in": "query", - "required": true - }, - { - "type": "integer", - "description": "query", - "name": "page", - "in": "query", - "required": true - }, - { - "type": "integer", - "description": "query", - "name": "pagesize", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Pipeline" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "description": "Create and run a new pipeline\nRETURN SAMPLE\n{\n\"name\": \"name-of-pipeline\",\n\"tasks\": [\n[ {\"plugin\": \"gitlab\", ...}, {\"plugin\": \"jira\"} ],\n[ {\"plugin\": \"github\", ...}],\n]\n}", - "consumes": [ - "application/json" - ], - "tags": [ - "pipelines" - ], - "summary": "Create and run a new pipeline", - "parameters": [ - { - "description": "json", - "name": "pipeline", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.NewPipeline" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Pipeline" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/pipelines/{pipelineId}": { - "get": { - "description": "GET /pipelines/:pipelineId\nRETURN SAMPLE\n{\n\"id\": 1,\n\"name\": \"test-pipeline\",\n...\n}", - "tags": [ - "pipelines" - ], - "parameters": [ - { - "type": "integer", - "description": "query", - "name": "pipelineId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Pipeline" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "description": "Cancel a pending pipeline", - "tags": [ - "pipelines" - ], - "parameters": [ - { - "type": "integer", - "description": "pipeline ID", - "name": "pipelineId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/pipelines/{pipelineId}/tasks": { - "get": { - "description": "get task\nSAMPLE\n{\n\"tasks\": [\n{\"id\": 1, \"plugin\": \"\", ...}\n],\n\"count\": 5\n}", - "consumes": [ - "application/json" - ], - "tags": [ - "task" - ], - "summary": "Get task", - "parameters": [ - { - "type": "integer", - "description": "pipelineId", - "name": "pipelineId", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "{\"tasks\": tasks, \"count\": count}", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/plugins/ae/connections": { - "get": { - "description": "Get all AE connections", - "tags": [ - "plugins/AE" - ], - "summary": "get all ae connections", - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "description": "Create AE connection", - "tags": [ - "plugins/AE" - ], - "summary": "create ae connection", - "parameters": [ - { - "description": "json body", - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.AeConnection" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/plugins/ae/connections/{connectionId}": { - "get": { - "description": "Get AE connection detail", - "tags": [ - "plugins/AE" - ], - "summary": "get ae connection detail", - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "description": "Delete a AE connection", - "tags": [ - "plugins/AE" - ], - "summary": "delete a ae connection", - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - }, - "patch": { - "description": "Patch AE connection", - "tags": [ - "plugins/AE" - ], - "summary": "patch ae connection", - "parameters": [ - { - "description": "json body", - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.AeConnection" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/plugins/ae/test": { - "post": { - "description": "Test AE Connection", - "tags": [ - "plugins/AE" - ], - "summary": "test ae connection", - "parameters": [ - { - "description": "json body", - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.TestConnectionRequest" - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/plugins/org/teams.csv": { - "get": { - "description": "get teams.csv file", - "produces": [ - "text/csv" - ], - "tags": [ - "plugins/org" - ], - "summary": "Get teams.csv file", - "parameters": [ - { - "type": "boolean", - "description": "return fake data or not", - "name": "fake_data", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - }, - "500": { - "description": "Internal Error", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - } - } - }, - "put": { - "description": "upload teams.csv file", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "tags": [ - "plugins/org" - ], - "summary": "Upload teams.csv file", - "parameters": [ - { - "type": "file", - "description": "select file to upload", - "name": "file", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - }, - "500": { - "description": "Internal Error", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - } - } - } - }, - "/plugins/org/user_account_mapping.csv": { - "get": { - "description": "get user_account_mapping.csv.csv file", - "produces": [ - "text/csv" - ], - "tags": [ - "plugins/org" - ], - "summary": "Get user_account_mapping.csv.csv file", - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - }, - "500": { - "description": "Internal Error", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - } - } - }, - "put": { - "description": "upload user_account_mapping.csv.csv file", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "tags": [ - "plugins/org" - ], - "summary": "Upload user_account_mapping.csv.csv file", - "parameters": [ - { - "type": "file", - "description": "select file to upload", - "name": "file", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - }, - "500": { - "description": "Internal Error", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - } - } - } - }, - "/plugins/org/users.csv": { - "get": { - "description": "get users.csv file", - "produces": [ - "text/csv" - ], - "tags": [ - "plugins/org" - ], - "summary": "Get users.csv file", - "parameters": [ - { - "type": "boolean", - "description": "return fake data or not", - "name": "fake_data", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - }, - "500": { - "description": "Internal Error", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - } - } - }, - "put": { - "description": "upload users.csv file", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "tags": [ - "plugins/org" - ], - "summary": "Upload users.csv file", - "parameters": [ - { - "type": "file", - "description": "select file to upload", - "name": "file", - "in": "formData", - "required": true - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - }, - "500": { - "description": "Internal Error", - "schema": { - "$ref": "#/definitions/shared.ApiBody" - } - } - } - } - }, - "/push/{tableName}": { - "post": { - "description": "POST /push/:tableName", - "consumes": [ - "application/json" - ], - "tags": [ - "push" - ], - "summary": "POST /push/:tableName", - "parameters": [ - { - "type": "string", - "description": "table name", - "name": "tableName", - "in": "path", - "required": true - }, - { - "description": "data", - "name": "data", - "in": "body", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "{\"rowsAffected\": rowsAffected}", - "schema": { - "$ref": "#/definitions/gin.H" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/version": { - "get": { - "description": "return a object", - "consumes": [ - "application/json" - ], - "tags": [ - "version" - ], - "summary": "Get the version of lake", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internel Error", - "schema": { - "type": "string" - } - } - } - } - } - }, - "definitions": { - "core.PipelineTask": { - "type": "object", - "required": [ - "plugin" - ], - "properties": { - "options": { - "type": "object", - "additionalProperties": true - }, - "plugin": { - "description": "Plugin name", - "type": "string" - }, - "subtasks": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "gin.H": { - "type": "object", - "additionalProperties": true - }, - "models.AeConnection": { - "type": "object", - "required": [ - "app_id", - "endpoint", - "name", - "secret_key" - ], - "properties": { - "app_id": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "endpoint": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "proxy": { - "type": "string" - }, - "rateLimit": { - "type": "integer" - }, - "secret_key": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.Blueprint": { - "type": "object", - "required": [ - "mode", - "name" - ], - "properties": { - "createdAt": { - "type": "string" - }, - "cronConfig": { - "type": "string" - }, - "enable": { - "type": "boolean" - }, - "id": { - "type": "integer" - }, - "isManual": { - "type": "boolean" - }, - "mode": { - "type": "string", - "enum": [ - "NORMAL", - "ADVANCED" - ] - }, - "name": { - "type": "string" - }, - "plan": { - "type": "array", - "items": { - "type": "integer" - } - }, - "settings": { - "type": "array", - "items": { - "type": "integer" - } - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.NewPipeline": { - "type": "object", - "properties": { - "blueprintId": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "plan": { - "type": "array", - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/core.PipelineTask" - } - } - } - } - }, - "models.Pipeline": { - "type": "object", - "properties": { - "beganAt": { - "type": "string" - }, - "blueprintId": { - "type": "integer" - }, - "createdAt": { - "type": "string" - }, - "finishedAt": { - "type": "string" - }, - "finishedTasks": { - "type": "integer" - }, - "id": { - "type": "integer" - }, - "message": { - "type": "string" - }, - "name": { - "type": "string" - }, - "plan": { - "type": "array", - "items": { - "type": "integer" - } - }, - "spentSeconds": { - "type": "integer" - }, - "stage": { - "type": "integer" - }, - "status": { - "type": "string" - }, - "totalTasks": { - "type": "integer" - }, - "updatedAt": { - "type": "string" - } - } - }, - "models.TestConnectionRequest": { - "type": "object", - "required": [ - "app_id", - "secret_key" - ], - "properties": { - "app_id": { - "type": "string" - }, - "endpoint": { - "type": "string" - }, - "proxy": { - "type": "string" - }, - "secret_key": { - "type": "string" - } - } - }, - "shared.ApiBody": { - "type": "object", - "properties": { - "message": { - "type": "string" - }, - "success": { - "type": "boolean" - } - } - } - } -}` - -// SwaggerInfo holds exported Swagger Info so clients can modify it -var SwaggerInfo = &swag.Spec{ - Version: "", - Host: "", - BasePath: "", - Schemes: []string{}, - Title: "", - Description: "", - InfoInstanceName: "swagger", - SwaggerTemplate: docTemplate, -} - -func init() { - swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) -} diff --git a/plugins/jira/e2e/external_epic_test.go b/plugins/jira/e2e/epic_test.go similarity index 90% rename from plugins/jira/e2e/external_epic_test.go rename to plugins/jira/e2e/epic_test.go index 6d67fd38c1c..03ef7ab2946 100644 --- a/plugins/jira/e2e/external_epic_test.go +++ b/plugins/jira/e2e/epic_test.go @@ -10,7 +10,7 @@ import ( "testing" ) -func TestExternalEpicDataflow(t *testing.T) { +func TestEpicDataflow(t *testing.T) { var plugin impl.Jira dataflowTester := e2ehelper.NewDataFlowTester(t, "jira", plugin) taskData := &tasks.JiraTaskData{ @@ -23,7 +23,7 @@ func TestExternalEpicDataflow(t *testing.T) { dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_api_issue_types.csv", "_raw_jira_api_issue_types") dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_api_issues.csv", "_raw_jira_api_issues") - dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_external_epics.csv", "_raw_jira_external_epics") + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jira_external_epics.csv", "_raw_jira_api_epics") dataflowTester.FlushTabler(&models.JiraIssue{}) dataflowTester.FlushTabler(&models.JiraBoardIssue{}) @@ -57,12 +57,11 @@ func TestExternalEpicDataflow(t *testing.T) { ) // run the part of the collector that queries tools data - keys, err := tasks.GetExternalEpicKeys(ctx.GetDal(), taskData) + keys, err := tasks.GetEpicKeys(ctx.GetDal(), taskData) require.NoError(t, err) - require.Equal(t, 1, len(keys)) - require.Equal(t, "K5-1", keys[0]) + require.Contains(t, keys, "K5-1") //epic not on the board - require.NoError(t, tasks.ExtractExternalEpicsMeta.EntryPoint(ctx)) + require.NoError(t, tasks.ExtractEpicsMeta.EntryPoint(ctx)) dataflowTester.VerifyTableWithOptions( models.JiraBoardIssue{}, e2ehelper.TableOptions{ diff --git a/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv b/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv index 50e8c174e85..feeca3dcb35 100644 --- a/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv +++ b/plugins/jira/e2e/raw_tables/_raw_jira_api_issues.csv @@ -31,4 +31,4 @@ 12470,"{""ConnectionId"":2,""BoardId"":8}","{""id"": ""10099"", ""key"": ""EE-37"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/issue/10099"", ""expand"": ""operations,versionedRepresentations,editmeta,changelog,renderedFields"", ""fields"": {""epic"": null, ""votes"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-37/votes"", ""votes"": 0, ""hasVoted"": false}, ""labels"": [], ""parent"": {""id"": ""10065"", ""key"": ""EE-3"", ""self"": ""https://merico.atlassian.net/rest/api/2/issue/10065"", ""fields"": {""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/status/10068"", ""iconUrl"": ""https://merico.atlassian.net/"", ""description"": ""This status is managed internally by Jira Software"", ""statusCategory"": {""id"": 3, ""key"": ""done"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/statuscategory/3"", ""colorName"": ""green""}}, ""summary"": ""​问题积压图率"", ""priority"": {""id"": ""3"", ""name"": ""Medium"", ""self"": ""https://merico.atlassian.net/rest/api/2/priority/3"", ""iconUrl"": ""https://merico.atlassian.net/images/icons/priorities/medium.svg""}, ""issuetype"": {""id"": ""10001"", ""name"": ""故事"", ""self"": ""https://merico.atlassian.net/rest/api/2/issuetype/10001"", ""iconUrl"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"", ""subtask"": false, ""avatarId"": 10315, ""description"": ""表述为用户目标的功能。"", ""hierarchyLevel"": 0}}}, ""sprint"": null, ""status"": {""id"": ""10068"", ""name"": ""已完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/status/10068"", ""iconUrl"": ""https://merico.atlassian.net/"", ""description"": ""This status is managed internally by Jira Software"", ""statusCategory"": {""id"": 3, ""key"": ""done"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/statuscategory/3"", ""colorName"": ""green""}}, ""comment"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/10099/comment"", ""total"": 0, ""startAt"": 0, ""comments"": [], ""maxResults"": 0}, ""created"": ""2020-06-12T08:52:23.456+0800"", ""creator"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""duedate"": null, ""flagged"": false, ""project"": {""id"": ""10003"", ""key"": ""EE"", ""name"": ""Enterprise Edition"", ""self"": ""https://merico.atlassian.net/rest/api/2/project/10003"", ""avatarUrls"": {""16x16"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=xsmall"", ""24x24"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=small"", ""32x32"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552?size=medium"", ""48x48"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10552""}, ""simplified"": false, ""projectTypeKey"": ""software""}, ""summary"": ""数据填充与联调 "", ""updated"": ""2021-03-28T16:05:55.638+0800"", ""watches"": {""self"": ""https://merico.atlassian.net/rest/api/2/issue/EE-37/watchers"", ""isWatching"": false, ""watchCount"": 1}, ""worklog"": {""total"": 0, ""startAt"": 0, ""worklogs"": [], ""maxResults"": 20}, ""assignee"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5ecfbd0c730ec90c1999cadf"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5ecfbd0c730ec90c1999cadf"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""24x24"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""32x32"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""48x48"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Dingding Zhang""}, ""priority"": {""id"": ""3"", ""name"": ""Medium"", ""self"": ""https://merico.atlassian.net/rest/api/2/priority/3"", ""iconUrl"": ""https://merico.atlassian.net/images/icons/priorities/medium.svg""}, ""progress"": {""total"": 0, ""progress"": 0}, ""reporter"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""security"": null, ""subtasks"": [], ""versions"": [], ""issuetype"": {""id"": ""10003"", ""name"": ""子任务"", ""self"": ""https://merico.atlassian.net/rest/api/2/issuetype/10003"", ""iconUrl"": ""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10316?size=medium"", ""subtask"": true, ""avatarId"": 10316, ""description"": ""大任务中的小任务。"", ""hierarchyLevel"": -1}, ""timespent"": null, ""workratio"": -1, ""attachment"": [], ""components"": [], ""issuelinks"": [], ""lastViewed"": null, ""resolution"": {""id"": ""10000"", ""name"": ""完成"", ""self"": ""https://merico.atlassian.net/rest/api/2/resolution/10000"", ""description"": ""事务上的工作已完成。""}, ""description"": null, ""environment"": null, ""fixVersions"": [{""id"": ""10026"", ""name"": ""v2.7.0"", ""self"": ""https://merico.atlassian.net/rest/api/2/version/10026"", ""archived"": false, ""released"": true, ""description"": """", ""releaseDate"": ""2020-07-10""}], ""timeestimate"": null, ""timetracking"": {}, ""closedSprints"": [{""id"": 7, ""goal"": """", ""name"": ""EE Sprint 7"", ""self"": ""https://merico.atlassian.net/rest/agile/1.0/sprint/7"", ""state"": ""closed"", ""endDate"": ""2020-06-26T00:38:00.000Z"", ""startDate"": ""2020-06-12T00:38:51.882Z"", ""completeDate"": ""2020-06-22T05:59:58.980Z"", ""originBoardId"": 8}], ""resolutiondate"": ""2020-06-18T12:04:31.261+0800"", ""issuerestriction"": {""shouldDisplay"": false, ""issuerestrictions"": {}}, ""aggregateprogress"": {""total"": 0, ""progress"": 0}, ""customfield_10000"": ""{}"", ""customfield_10001"": null, ""customfield_10002"": null, ""customfield_10003"": null, ""customfield_10004"": null, ""customfield_10005"": null, ""customfield_10006"": null, ""customfield_10007"": null, ""customfield_10008"": null, ""customfield_10009"": null, ""customfield_10010"": null, ""customfield_10014"": null, ""customfield_10015"": ""2020-06-12"", ""customfield_10016"": null, ""customfield_10017"": null, ""customfield_10018"": {""showField"": false, ""nonEditableReason"": {""reason"": ""SUBTASK_LINK_SHOULD_BE_USED"", ""message"": ""要为子任务设置父项,请使用子任务链接。""}, ""hasEpicLinkFieldDependency"": false}, ""customfield_10019"": ""0|i000lb:"", ""customfield_10020"": [{""id"": 7, ""goal"": """", ""name"": ""EE Sprint 7"", ""state"": ""closed"", ""boardId"": 8, ""endDate"": ""2020-06-26T00:38:00.000Z"", ""startDate"": ""2020-06-12T00:38:51.882Z"", ""completeDate"": ""2020-06-22T05:59:58.980Z""}], ""customfield_10021"": null, ""customfield_10022"": null, ""customfield_10023"": ""1_*:*_1_*:*_514990822_*|*_5_*:*_1_*:*_0_*|*_10000_*:*_1_*:*_14937097"", ""customfield_10024"": null, ""customfield_10027"": null, ""customfield_10028"": null, ""customfield_10060"": ""2020-06-18"", ""customfield_10061"": null, ""customfield_10062"": null, ""customfield_10063"": null, ""customfield_10064"": null, ""customfield_10065"": null, ""customfield_10066"": null, ""customfield_10068"": null, ""customfield_10070"": null, ""customfield_10071"": null, ""customfield_10073"": [], ""customfield_10074"": null, ""customfield_10075"": null, ""customfield_10076"": null, ""customfield_10077"": null, ""customfield_10078"": null, ""customfield_10079"": null, ""customfield_10080"": null, ""customfield_10081"": null, ""customfield_10082"": null, ""customfield_10083"": null, ""customfield_10084"": null, ""customfield_10085"": null, ""customfield_10086"": null, ""customfield_10087"": null, ""customfield_10088"": null, ""customfield_10089"": null, ""customfield_10090"": null, ""customfield_10091"": null, ""customfield_10092"": null, ""customfield_10093"": null, ""customfield_10095"": null, ""customfield_10096"": null, ""customfield_10097"": null, ""customfield_10098"": null, ""customfield_10099"": null, ""customfield_10100"": null, ""customfield_10101"": null, ""customfield_10102"": null, ""customfield_10103"": null, ""customfield_10104"": null, ""customfield_10105"": null, ""customfield_10106"": null, ""customfield_10107"": null, ""customfield_10108"": null, ""customfield_10109"": null, ""customfield_10113"": null, ""customfield_10114"": null, ""customfield_10115"": null, ""customfield_10116"": null, ""customfield_10117"": null, ""customfield_10118"": null, ""customfield_10119"": null, ""customfield_10120"": null, ""customfield_10121"": null, ""customfield_10122"": null, ""customfield_10123"": null, ""customfield_10124"": null, ""customfield_10125"": null, ""customfield_10126"": null, ""customfield_10127"": null, ""customfield_10128"": null, ""customfield_10129"": null, ""customfield_10130"": null, ""customfield_10131"": null, ""customfield_10132"": null, ""customfield_10133"": null, ""customfield_10134"": null, ""customfield_10135"": null, ""customfield_10136"": null, ""customfield_10137"": null, ""customfield_10138"": null, ""customfield_10140"": null, ""customfield_10141"": null, ""customfield_10142"": null, ""customfield_10143"": null, ""customfield_10145"": null, ""customfield_10146"": null, ""customfield_10150"": null, ""customfield_10151"": null, ""customfield_10152"": null, ""customfield_10153"": null, ""customfield_10154"": null, ""customfield_10155"": null, ""customfield_10156"": null, ""customfield_10157"": null, ""aggregatetimespent"": null, ""timeoriginalestimate"": null, ""aggregatetimeestimate"": null, ""statuscategorychangedate"": ""2020-06-18T12:04:31.361+0800"", ""aggregatetimeoriginalestimate"": null}, ""changelog"": {""total"": 13, ""startAt"": 0, ""histories"": [{""id"": ""90441"", ""items"": [{""to"": ""21127"", ""from"": ""17970"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE-subtask2"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE-subtask""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2021-04-01T08:52:14.944+0800""}, {""id"": ""86148"", ""items"": [{""to"": ""10068"", ""from"": ""6"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""已完成"", ""fieldtype"": ""jira"", ""fromString"": ""Closed""}, {""to"": ""17970"", ""from"": ""13630"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE-subtask"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2021-03-28T16:05:55.640+0800""}, {""id"": ""35118"", ""items"": [{""to"": ""6"", ""from"": ""5"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Closed"", ""fieldtype"": ""jira"", ""fromString"": ""Resolved""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-11-10T09:43:10.084+0800""}, {""id"": ""33522"", ""items"": [{""to"": ""13630"", ""from"": ""11961"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE"", ""fieldtype"": ""jira"", ""fromString"": ""EE Workflow v0.3""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-11-09T16:52:12.997+0800""}, {""id"": ""25413"", ""items"": [{""to"": ""2020-06-12"", ""from"": null, ""field"": ""Start date"", ""fieldId"": ""customfield_10015"", ""toString"": ""12/Jun/20"", ""fieldtype"": ""custom"", ""fromString"": null}, {""to"": ""2020-06-18"", ""from"": null, ""field"": ""End date"", ""fieldId"": ""customfield_10060"", ""toString"": ""18/Jun/20"", ""fieldtype"": ""custom"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=557058%3A46121f43-e58d-4ff4-83fd-a79fb4b71b45"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""557058:46121f43-e58d-4ff4-83fd-a79fb4b71b45"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""24x24"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""32x32"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png"", ""48x48"": ""https://secure.gravatar.com/avatar/97f7c79b50890409584990ddde1920b3?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FBM-1.png""}, ""accountType"": ""app"", ""displayName"": ""BigPicture - for ppm, project management""}, ""created"": ""2020-08-31T12:47:28.407+0800"", ""historyMetadata"": {""description"": "" on behalf of accountId=5e9711ba34f7b90c0fbc37d3""}}, {""id"": ""18912"", ""items"": [{""to"": null, ""from"": ""10008"", ""field"": ""Fix Version"", ""fieldId"": ""fixVersions"", ""toString"": null, ""fieldtype"": ""jira"", ""fromString"": ""v2.7.0""}, {""to"": ""10026"", ""from"": null, ""field"": ""Fix Version"", ""fieldId"": ""fixVersions"", ""toString"": ""SaaS"", ""fieldtype"": ""jira"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-14T05:35:56.738+0800""}, {""id"": ""17917"", ""items"": [{""to"": ""11961"", ""from"": ""11366"", ""field"": ""Workflow"", ""toString"": ""EE Workflow v0.3"", ""fieldtype"": ""jira"", ""fromString"": ""EE Workflow v0.2""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-13T16:42:22.098+0800""}, {""id"": ""17321"", ""items"": [{""to"": ""11366"", ""from"": ""10479"", ""field"": ""Workflow"", ""toString"": ""EE Workflow v0.2"", ""fieldtype"": ""jira"", ""fromString"": ""jira""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-07-13T16:39:11.719+0800""}, {""id"": ""11773"", ""items"": [{""to"": ""10008"", ""from"": null, ""field"": ""Fix Version"", ""fieldId"": ""fixVersions"", ""toString"": ""v2.7.0"", ""fieldtype"": ""jira"", ""fromString"": null}, {""to"": ""10000"", ""from"": null, ""field"": ""resolution"", ""fieldId"": ""resolution"", ""toString"": ""Done"", ""fieldtype"": ""jira"", ""fromString"": null}, {""to"": ""5"", ""from"": ""1"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Resolved"", ""fieldtype"": ""jira"", ""fromString"": ""Open""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5ecfbd0c730ec90c1999cadf"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5ecfbd0c730ec90c1999cadf"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""24x24"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""32x32"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png"", ""48x48"": ""https://secure.gravatar.com/avatar/9f2459a1fcb78fd5c1d8b70bf3917992?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FDZ-1.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Dingding Zhang""}, ""created"": ""2020-06-18T12:04:31.375+0800""}, {""id"": ""10979"", ""items"": [{""to"": ""1"", ""from"": ""10000"", ""field"": ""status"", ""fieldId"": ""status"", ""toString"": ""Open"", ""fieldtype"": ""jira"", ""fromString"": ""To Do""}, {""to"": ""10479"", ""from"": ""10419"", ""field"": ""Workflow"", ""toString"": ""jira"", ""fieldtype"": ""jira"", ""fromString"": ""Software Simplified Workflow for Project EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T13:01:20.553+0800""}, {""id"": ""10919"", ""items"": [{""to"": ""10419"", ""from"": ""10386"", ""field"": ""Workflow"", ""toString"": ""Software Simplified Workflow for Project EE"", ""fieldtype"": ""jira"", ""fromString"": ""Sprint Workflow for EE""}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T12:58:46.910+0800""}, {""id"": ""10772"", ""items"": [{""to"": ""5ecfbd0c730ec90c1999cadf"", ""from"": null, ""field"": ""assignee"", ""fieldId"": ""assignee"", ""toString"": ""Dingding Zhang"", ""fieldtype"": ""jira"", ""fromString"": null, ""tmpToAccountId"": ""5ecfbd0c730ec90c1999cadf"", ""tmpFromAccountId"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T09:05:14.147+0800""}, {""id"": ""10757"", ""items"": [{""to"": ""10065"", ""from"": null, ""field"": ""Parent"", ""toString"": ""EE-3"", ""fieldtype"": ""jira"", ""fromString"": null}], ""author"": {""self"": ""https://merico.atlassian.net/rest/api/2/user?accountId=5e9711ba34f7b90c0fbc37d3"", ""active"": true, ""timeZone"": ""Asia/Shanghai"", ""accountId"": ""5e9711ba34f7b90c0fbc37d3"", ""avatarUrls"": {""16x16"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""24x24"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""32x32"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png"", ""48x48"": ""https://secure.gravatar.com/avatar/f1e7dd8eadd9170aff5df20da45c849d?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FRZ-5.png""}, ""accountType"": ""atlassian"", ""displayName"": ""Rankin Zheng""}, ""created"": ""2020-06-12T08:52:23.725+0800""}], ""maxResults"": 13}}","https://merico.atlassian.net/rest/agile/1.0/board/8/issue?expand=changelog&jql=updated+%3E%3D+%272006%2F01%2F02+15%3A04%27+ORDER+BY+created+ASC&maxResults=100&startAt=0","null","2022-06-23 10:43:19.866" 13000,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20708"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20708"",""key"":""K5-2"",""changelog"":{""startAt"":0,""maxResults"":2,""total"":2,""histories"":[{""id"":""422892"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:30:23.343+0800"",""items"":[{""field"":""Epic Link"",""fieldtype"":""custom"",""fieldId"":""customfield_10014"",""from"":null,""fromString"":null,""to"":""20707"",""toString"":""K5-1""}]},{""id"":""422890"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:30:23.321+0800"",""items"":[{""field"":""IssueParentAssociation"",""fieldtype"":""jira"",""from"":null,""fromString"":null,""to"":""20707"",""toString"":""K5-1""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:29:49.427+0800"",""parent"":{""id"":""20707"",""key"":""K5-1"",""self"":""https://merico.atlassian.net/rest/api/2/issue/20707"",""fields"":{""summary"":""test epic"",""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1}}},""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""fixVersions"":[],""customfield_10077"":null,""customfield_10078"":null,""customfield_10079"":null,""resolution"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-16T07:10:31.302+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""epic"":{""id"":20707,""key"":""K5-1"",""self"":""https://merico.atlassian.net/rest/agile/1.0/epic/20707"",""name"":""Outside Epic"",""summary"":""test epic"",""color"":{""key"":""color_9""},""done"":false},""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10068"":null,""customfield_10101"":null,""customfield_10102"":null,""customfield_10103"":null,""labels"":[],""aggregatetimeoriginalestimate"":null,""timeestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10165"":null,""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-2/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10001"",""id"":""10001"",""description"":""具体一个功能点,以用户角度,大小适中,可以满足某一个需要为原则。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0},""timespent"":null,""customfield_10150"":null,""sprint"":{""id"":175,""self"":""https://merico.atlassian.net/rest/agile/1.0/sprint/175"",""state"":""active"",""name"":""K5 Sprint 1"",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z"",""originBoardId"":92,""goal"":""""},""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-2/watchers"",""watchCount"":1,""isWatching"":true},""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""created"":""2022-07-16T06:29:49.026+0800"",""customfield_10140"":null,""customfield_10141"":null,""customfield_10020"":[{""id"":175,""name"":""K5 Sprint 1"",""state"":""active"",""boardId"":92,""goal"":"""",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z""}],""customfield_10142"":null,""customfield_10021"":null,""customfield_10143"":null,""customfield_10022"":null,""customfield_10023"":null,""customfield_10024"":null,""customfield_10145"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10138"":null,""customfield_10017"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":false,""nonEditableReason"":{""reason"":""EPIC_LINK_SHOULD_BE_USED"",""message"":""To set an epic as the parent, use the epic link instead""}},""customfield_10019"":""0|i01oz7:"",""updated"":""2022-07-16T06:30:23.341+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""customfield_10130"":null,""customfield_10097"":null,""description"":null,""customfield_10098"":null,""customfield_10131"":null,""customfield_10010"":null,""customfield_10132"":null,""customfield_10099"":null,""customfield_10133"":null,""customfield_10134"":null,""customfield_10014"":""K5-1"",""customfield_10135"":null,""timetracking"":{},""customfield_10015"":null,""customfield_10136"":null,""customfield_10005"":null,""customfield_10126"":null,""customfield_10127"":null,""customfield_10006"":null,""security"":null,""customfield_10007"":null,""customfield_10128"":null,""customfield_10129"":null,""customfield_10008"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""first story"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10000"":""{}"",""customfield_10121"":null,""customfield_10088"":null,""customfield_10089"":null,""customfield_10122"":null,""customfield_10001"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10124"":null,""customfield_10003"":null,""customfield_10125"":null,""customfield_10004"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20708/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 13001,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20709"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20709"",""key"":""K5-3"",""changelog"":{""startAt"":0,""maxResults"":2,""total"":2,""histories"":[{""id"":""422897"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.616+0800"",""items"":[{""field"":""Epic Link"",""fieldtype"":""custom"",""fieldId"":""customfield_10014"",""from"":null,""fromString"":null,""to"":""20710"",""toString"":""K5-4""}]},{""id"":""422895"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.588+0800"",""items"":[{""field"":""IssueParentAssociation"",""fieldtype"":""jira"",""from"":null,""fromString"":null,""to"":""20710"",""toString"":""K5-4""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:30:43.506+0800"",""parent"":{""id"":""20710"",""key"":""K5-4"",""self"":""https://merico.atlassian.net/rest/api/2/issue/20710"",""fields"":{""summary"":""K5 epic"",""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1}}},""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""fixVersions"":[],""customfield_10077"":null,""customfield_10078"":null,""resolution"":null,""customfield_10079"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-16T06:30:48.020+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""epic"":{""id"":20710,""key"":""K5-4"",""self"":""https://merico.atlassian.net/rest/agile/1.0/epic/20710"",""name"":""K5 Epic"",""summary"":""K5 epic"",""color"":{""key"":""color_3""},""done"":false},""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10068"":null,""customfield_10101"":null,""customfield_10102"":null,""labels"":[],""customfield_10103"":null,""timeestimate"":null,""aggregatetimeoriginalestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10165"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-3/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10001"",""id"":""10001"",""description"":""具体一个功能点,以用户角度,大小适中,可以满足某一个需要为原则。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0},""timespent"":null,""customfield_10150"":null,""sprint"":{""id"":175,""self"":""https://merico.atlassian.net/rest/agile/1.0/sprint/175"",""state"":""active"",""name"":""K5 Sprint 1"",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z"",""originBoardId"":92,""goal"":""""},""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""aggregatetimespent"":null,""customfield_10155"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-3/watchers"",""watchCount"":1,""isWatching"":true},""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""created"":""2022-07-16T06:30:43.178+0800"",""customfield_10140"":null,""customfield_10141"":null,""customfield_10020"":[{""id"":175,""name"":""K5 Sprint 1"",""state"":""active"",""boardId"":92,""goal"":"""",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z""}],""customfield_10142"":null,""customfield_10021"":null,""customfield_10143"":null,""customfield_10022"":null,""customfield_10023"":null,""customfield_10145"":null,""customfield_10024"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10017"":null,""customfield_10138"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":false,""nonEditableReason"":{""reason"":""EPIC_LINK_SHOULD_BE_USED"",""message"":""To set an epic as the parent, use the epic link instead""}},""customfield_10019"":""0|i01ozf:"",""updated"":""2022-07-16T06:31:38.612+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10130"":null,""customfield_10097"":null,""customfield_10098"":null,""customfield_10010"":null,""customfield_10131"":null,""customfield_10132"":null,""customfield_10099"":null,""customfield_10133"":null,""customfield_10134"":null,""customfield_10014"":""K5-4"",""customfield_10135"":null,""customfield_10136"":null,""customfield_10015"":null,""timetracking"":{},""customfield_10126"":null,""customfield_10005"":null,""customfield_10006"":null,""customfield_10127"":null,""customfield_10007"":null,""security"":null,""customfield_10128"":null,""customfield_10008"":null,""customfield_10129"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""second story"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10000"":""{}"",""customfield_10121"":null,""customfield_10088"":null,""customfield_10122"":null,""customfield_10089"":null,""customfield_10001"":null,""customfield_10002"":null,""customfield_10123"":null,""customfield_10003"":null,""customfield_10124"":null,""customfield_10125"":null,""customfield_10004"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20709/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 -13002,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20710"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20710"",""key"":""K5-4"",""changelog"":{""startAt"":0,""maxResults"":1,""total"":1,""histories"":[{""id"":""422896"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.602+0800"",""items"":[{""field"":""Epic Child"",""fieldtype"":""custom"",""from"":null,""fromString"":null,""to"":""20709"",""toString"":""K5-3""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:31:16.183+0800"",""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""customfield_10077"":null,""fixVersions"":[],""customfield_10078"":null,""customfield_10079"":null,""resolution"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-20T01:43:28.123+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10101"":null,""customfield_10068"":null,""customfield_10102"":null,""customfield_10103"":null,""labels"":[],""aggregatetimeoriginalestimate"":null,""timeestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10165"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-4/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1},""timespent"":null,""customfield_10150"":null,""sprint"":null,""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-4/watchers"",""watchCount"":1,""isWatching"":true},""created"":""2022-07-16T06:31:15.981+0800"",""customfield_10140"":null,""customfield_10020"":null,""customfield_10141"":null,""customfield_10142"":null,""customfield_10021"":null,""customfield_10022"":null,""customfield_10143"":null,""customfield_10023"":null,""customfield_10024"":null,""customfield_10145"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10017"":""yellow"",""customfield_10138"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":true},""customfield_10019"":""0|i01ozn:"",""updated"":""2022-07-16T06:31:38.598+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10130"":null,""customfield_10097"":null,""customfield_10098"":null,""customfield_10131"":null,""customfield_10010"":null,""customfield_10099"":null,""customfield_10011"":""K5 Epic"",""customfield_10132"":null,""customfield_10012"":{""self"":""https://merico.atlassian.net/rest/api/2/customFieldOption/10016"",""value"":""To Do"",""id"":""10016""},""customfield_10133"":null,""customfield_10134"":null,""customfield_10013"":""ghx-label-3"",""customfield_10135"":null,""customfield_10014"":null,""customfield_10015"":null,""timetracking"":{},""customfield_10136"":null,""customfield_10005"":null,""customfield_10126"":null,""customfield_10127"":null,""customfield_10006"":null,""customfield_10128"":null,""customfield_10007"":null,""security"":null,""customfield_10008"":null,""customfield_10129"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""K5 epic"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10088"":null,""customfield_10121"":null,""customfield_10000"":""{}"",""customfield_10089"":null,""customfield_10122"":null,""customfield_10001"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10003"":null,""customfield_10124"":null,""customfield_10004"":null,""customfield_10125"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20710/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 +13002,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20710"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20710"",""key"":""K5-4"",""changelog"":{""startAt"":0,""maxResults"":1,""total"":1,""histories"":[{""id"":""422896"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.602+0800"",""items"":[{""field"":""Epic Child"",""fieldtype"":""custom"",""from"":null,""fromString"":null,""to"":""20709"",""toString"":""K5-3""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:31:16.183+0800"",""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""customfield_10077"":null,""fixVersions"":[],""customfield_10078"":null,""customfield_10079"":null,""resolution"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-20T01:43:28.123+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10101"":null,""customfield_10068"":null,""customfield_10102"":null,""customfield_10103"":null,""labels"":[],""aggregatetimeoriginalestimate"":null,""timeestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10165"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-4/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1},""timespent"":null,""customfield_10150"":null,""sprint"":null,""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-4/watchers"",""watchCount"":1,""isWatching"":true},""created"":""2022-07-16T06:31:15.981+0800"",""customfield_10140"":null,""customfield_10020"":null,""customfield_10141"":null,""customfield_10142"":null,""customfield_10021"":null,""customfield_10022"":null,""customfield_10143"":null,""customfield_10023"":null,""customfield_10024"":null,""customfield_10145"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10017"":""yellow"",""customfield_10138"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":true},""customfield_10019"":""0|i01ozn:"",""updated"":""2022-07-16T06:31:38.598+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10130"":null,""customfield_10097"":null,""customfield_10098"":null,""customfield_10131"":null,""customfield_10010"":null,""customfield_10099"":null,""customfield_10011"":""K5 Epic"",""customfield_10132"":null,""customfield_10012"":{""self"":""https://merico.atlassian.net/rest/api/2/customFieldOption/10016"",""value"":""To Do"",""id"":""10016""},""customfield_10133"":null,""customfield_10134"":null,""customfield_10013"":""ghx-label-3"",""customfield_10135"":null,""customfield_10014"":null,""customfield_10015"":null,""timetracking"":{},""customfield_10136"":null,""customfield_10005"":null,""customfield_10126"":null,""customfield_10127"":null,""customfield_10006"":null,""customfield_10128"":null,""customfield_10007"":null,""security"":null,""customfield_10008"":null,""customfield_10129"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""K5 epic"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10088"":null,""customfield_10121"":null,""customfield_10000"":""{}"",""customfield_10089"":null,""customfield_10122"":null,""customfield_10001"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10003"":null,""customfield_10124"":null,""customfield_10004"":null,""customfield_10125"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20710/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 \ No newline at end of file diff --git a/plugins/jira/e2e/raw_tables/_raw_jira_external_epics.csv b/plugins/jira/e2e/raw_tables/_raw_jira_external_epics.csv index 84b359a3f2e..f30df96032c 100644 --- a/plugins/jira/e2e/raw_tables/_raw_jira_external_epics.csv +++ b/plugins/jira/e2e/raw_tables/_raw_jira_external_epics.csv @@ -1,2 +1,4 @@ -id,params,data,url,input,created_at -9,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,customfield_10010.requestTypePractice,renderedFields"",""id"":""20707"",""self"":""https://merico.atlassian.net/rest/api/2/issue/20707"",""key"":""K5-1"",""changelog"":{""startAt"":0,""maxResults"":2,""total"":2,""histories"":[{""id"":""422898"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:54:52.085+0800"",""items"":[{""field"":""Epic Name"",""fieldtype"":""custom"",""fieldId"":""customfield_10011"",""from"":null,""fromString"":""Epic for B1"",""to"":null,""toString"":""Outside Epic""}]},{""id"":""422891"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:30:23.334+0800"",""items"":[{""field"":""Epic Child"",""fieldtype"":""custom"",""from"":null,""fromString"":null,""to"":""20708"",""toString"":""K5-2""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:15:44.185+0800"",""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""customfield_10077"":null,""fixVersions"":[],""customfield_10078"":null,""resolution"":null,""customfield_10079"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-16T07:10:39.685+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""customfield_10066"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10100"":null,""customfield_10101"":null,""customfield_10068"":null,""customfield_10102"":null,""labels"":[],""customfield_10103"":null,""timeestimate"":null,""aggregatetimeoriginalestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10164"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10165"":null,""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-1/votes"",""votes"":0,""hasVoted"":false},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1},""timespent"":null,""customfield_10150"":null,""customfield_10151"":null,""customfield_10152"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-1/watchers"",""watchCount"":1,""isWatching"":true},""created"":""2022-07-16T06:15:43.810+0800"",""customfield_10140"":null,""customfield_10020"":null,""customfield_10141"":null,""customfield_10021"":null,""customfield_10142"":null,""customfield_10022"":null,""customfield_10143"":null,""customfield_10023"":null,""customfield_10145"":null,""customfield_10024"":null,""customfield_10146"":null,""customfield_10137"":null,""customfield_10016"":null,""customfield_10138"":null,""customfield_10017"":""orange"",""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":true},""customfield_10019"":""0|i01oyz:"",""updated"":""2022-07-16T06:54:52.078+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10097"":null,""customfield_10130"":null,""customfield_10010"":null,""customfield_10131"":null,""customfield_10098"":null,""customfield_10132"":null,""customfield_10011"":""Outside Epic"",""customfield_10099"":null,""customfield_10012"":{""self"":""https://merico.atlassian.net/rest/api/2/customFieldOption/10016"",""value"":""To Do"",""id"":""10016""},""customfield_10133"":null,""customfield_10134"":null,""customfield_10013"":""ghx-label-9"",""customfield_10135"":null,""customfield_10014"":null,""customfield_10136"":null,""customfield_10015"":null,""customfield_10126"":null,""customfield_10005"":null,""customfield_10127"":null,""customfield_10006"":null,""security"":null,""customfield_10007"":null,""customfield_10128"":null,""customfield_10129"":null,""customfield_10008"":null,""customfield_10009"":null,""summary"":""test epic"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10120"":null,""customfield_10087"":null,""customfield_10000"":""{}"",""customfield_10121"":null,""customfield_10088"":null,""customfield_10089"":null,""customfield_10001"":null,""customfield_10122"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10124"":null,""customfield_10003"":null,""customfield_10004"":null,""customfield_10125"":null,""customfield_10115"":null,""customfield_10116"":null,""environment"":null,""customfield_10117"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null}}",https://merico.atlassian.net/rest/api/2/search?expand=changelog&issue+in=%28K5-1%29&jql=issue+in+%28K5-1%29+ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-20T00:15:43.541+00:00 +"id","params","data","url","input","created_at" +13000,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20708"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20708"",""key"":""K5-2"",""changelog"":{""startAt"":0,""maxResults"":2,""total"":2,""histories"":[{""id"":""422892"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:30:23.343+0800"",""items"":[{""field"":""Epic Link"",""fieldtype"":""custom"",""fieldId"":""customfield_10014"",""from"":null,""fromString"":null,""to"":""20707"",""toString"":""K5-1""}]},{""id"":""422890"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:30:23.321+0800"",""items"":[{""field"":""IssueParentAssociation"",""fieldtype"":""jira"",""from"":null,""fromString"":null,""to"":""20707"",""toString"":""K5-1""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:29:49.427+0800"",""parent"":{""id"":""20707"",""key"":""K5-1"",""self"":""https://merico.atlassian.net/rest/api/2/issue/20707"",""fields"":{""summary"":""test epic"",""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1}}},""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""fixVersions"":[],""customfield_10077"":null,""customfield_10078"":null,""customfield_10079"":null,""resolution"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-16T07:10:31.302+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""epic"":{""id"":20707,""key"":""K5-1"",""self"":""https://merico.atlassian.net/rest/agile/1.0/epic/20707"",""name"":""Outside Epic"",""summary"":""test epic"",""color"":{""key"":""color_9""},""done"":false},""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10068"":null,""customfield_10101"":null,""customfield_10102"":null,""customfield_10103"":null,""labels"":[],""aggregatetimeoriginalestimate"":null,""timeestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10165"":null,""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-2/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10001"",""id"":""10001"",""description"":""具体一个功能点,以用户角度,大小适中,可以满足某一个需要为原则。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0},""timespent"":null,""customfield_10150"":null,""sprint"":{""id"":175,""self"":""https://merico.atlassian.net/rest/agile/1.0/sprint/175"",""state"":""active"",""name"":""K5 Sprint 1"",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z"",""originBoardId"":92,""goal"":""""},""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-2/watchers"",""watchCount"":1,""isWatching"":true},""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""created"":""2022-07-16T06:29:49.026+0800"",""customfield_10140"":null,""customfield_10141"":null,""customfield_10020"":[{""id"":175,""name"":""K5 Sprint 1"",""state"":""active"",""boardId"":92,""goal"":"""",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z""}],""customfield_10142"":null,""customfield_10021"":null,""customfield_10143"":null,""customfield_10022"":null,""customfield_10023"":null,""customfield_10024"":null,""customfield_10145"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10138"":null,""customfield_10017"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":false,""nonEditableReason"":{""reason"":""EPIC_LINK_SHOULD_BE_USED"",""message"":""To set an epic as the parent, use the epic link instead""}},""customfield_10019"":""0|i01oz7:"",""updated"":""2022-07-16T06:30:23.341+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""customfield_10130"":null,""customfield_10097"":null,""description"":null,""customfield_10098"":null,""customfield_10131"":null,""customfield_10010"":null,""customfield_10132"":null,""customfield_10099"":null,""customfield_10133"":null,""customfield_10134"":null,""customfield_10014"":""K5-1"",""customfield_10135"":null,""timetracking"":{},""customfield_10015"":null,""customfield_10136"":null,""customfield_10005"":null,""customfield_10126"":null,""customfield_10127"":null,""customfield_10006"":null,""security"":null,""customfield_10007"":null,""customfield_10128"":null,""customfield_10129"":null,""customfield_10008"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""first story"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10000"":""{}"",""customfield_10121"":null,""customfield_10088"":null,""customfield_10089"":null,""customfield_10122"":null,""customfield_10001"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10124"":null,""customfield_10003"":null,""customfield_10125"":null,""customfield_10004"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20708/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 +13001,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20709"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20709"",""key"":""K5-3"",""changelog"":{""startAt"":0,""maxResults"":2,""total"":2,""histories"":[{""id"":""422897"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.616+0800"",""items"":[{""field"":""Epic Link"",""fieldtype"":""custom"",""fieldId"":""customfield_10014"",""from"":null,""fromString"":null,""to"":""20710"",""toString"":""K5-4""}]},{""id"":""422895"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.588+0800"",""items"":[{""field"":""IssueParentAssociation"",""fieldtype"":""jira"",""from"":null,""fromString"":null,""to"":""20710"",""toString"":""K5-4""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:30:43.506+0800"",""parent"":{""id"":""20710"",""key"":""K5-4"",""self"":""https://merico.atlassian.net/rest/api/2/issue/20710"",""fields"":{""summary"":""K5 epic"",""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1}}},""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""fixVersions"":[],""customfield_10077"":null,""customfield_10078"":null,""resolution"":null,""customfield_10079"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-16T06:30:48.020+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""epic"":{""id"":20710,""key"":""K5-4"",""self"":""https://merico.atlassian.net/rest/agile/1.0/epic/20710"",""name"":""K5 Epic"",""summary"":""K5 epic"",""color"":{""key"":""color_3""},""done"":false},""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10068"":null,""customfield_10101"":null,""customfield_10102"":null,""labels"":[],""customfield_10103"":null,""timeestimate"":null,""aggregatetimeoriginalestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10165"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-3/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10001"",""id"":""10001"",""description"":""具体一个功能点,以用户角度,大小适中,可以满足某一个需要为原则。"",""iconUrl"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10315?size=medium"",""name"":""Story"",""subtask"":false,""avatarId"":10315,""hierarchyLevel"":0},""timespent"":null,""customfield_10150"":null,""sprint"":{""id"":175,""self"":""https://merico.atlassian.net/rest/agile/1.0/sprint/175"",""state"":""active"",""name"":""K5 Sprint 1"",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z"",""originBoardId"":92,""goal"":""""},""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""aggregatetimespent"":null,""customfield_10155"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-3/watchers"",""watchCount"":1,""isWatching"":true},""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""created"":""2022-07-16T06:30:43.178+0800"",""customfield_10140"":null,""customfield_10141"":null,""customfield_10020"":[{""id"":175,""name"":""K5 Sprint 1"",""state"":""active"",""boardId"":92,""goal"":"""",""startDate"":""2022-07-15T22:35:25.617Z"",""endDate"":""2022-07-29T22:35:00.000Z""}],""customfield_10142"":null,""customfield_10021"":null,""customfield_10143"":null,""customfield_10022"":null,""customfield_10023"":null,""customfield_10145"":null,""customfield_10024"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10017"":null,""customfield_10138"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":false,""nonEditableReason"":{""reason"":""EPIC_LINK_SHOULD_BE_USED"",""message"":""To set an epic as the parent, use the epic link instead""}},""customfield_10019"":""0|i01ozf:"",""updated"":""2022-07-16T06:31:38.612+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10130"":null,""customfield_10097"":null,""customfield_10098"":null,""customfield_10010"":null,""customfield_10131"":null,""customfield_10132"":null,""customfield_10099"":null,""customfield_10133"":null,""customfield_10134"":null,""customfield_10014"":""K5-4"",""customfield_10135"":null,""customfield_10136"":null,""customfield_10015"":null,""timetracking"":{},""customfield_10126"":null,""customfield_10005"":null,""customfield_10006"":null,""customfield_10127"":null,""customfield_10007"":null,""security"":null,""customfield_10128"":null,""customfield_10008"":null,""customfield_10129"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""second story"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10000"":""{}"",""customfield_10121"":null,""customfield_10088"":null,""customfield_10122"":null,""customfield_10089"":null,""customfield_10001"":null,""customfield_10002"":null,""customfield_10123"":null,""customfield_10003"":null,""customfield_10124"":null,""customfield_10125"":null,""customfield_10004"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20709/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 +13002,"{""ConnectionId"":1,""BoardId"":93}","{""expand"":""operations,versionedRepresentations,editmeta,changelog,renderedFields"",""id"":""20710"",""self"":""https://merico.atlassian.net/rest/agile/1.0/issue/20710"",""key"":""K5-4"",""changelog"":{""startAt"":0,""maxResults"":1,""total"":1,""histories"":[{""id"":""422896"",""author"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""created"":""2022-07-16T06:31:38.602+0800"",""items"":[{""field"":""Epic Child"",""fieldtype"":""custom"",""from"":null,""fromString"":null,""to"":""20709"",""toString"":""K5-3""}]}]},""fields"":{""statuscategorychangedate"":""2022-07-16T06:31:16.183+0800"",""customfield_10070"":null,""customfield_10071"":null,""customfield_10073"":[],""customfield_10074"":null,""customfield_10075"":null,""customfield_10076"":null,""customfield_10077"":null,""fixVersions"":[],""customfield_10078"":null,""customfield_10079"":null,""resolution"":null,""customfield_10113"":null,""customfield_10114"":null,""customfield_10104"":null,""customfield_10105"":null,""customfield_10106"":null,""customfield_10107"":null,""customfield_10108"":null,""customfield_10109"":null,""lastViewed"":""2022-07-20T01:43:28.123+0800"",""customfield_10060"":null,""customfield_10061"":null,""customfield_10062"":null,""customfield_10063"":null,""customfield_10064"":null,""customfield_10065"":null,""customfield_10066"":null,""customfield_10100"":null,""priority"":{""self"":""https://merico.atlassian.net/rest/api/2/priority/3"",""iconUrl"":""https://merico.atlassian.net/images/icons/priorities/medium.svg"",""name"":""Medium"",""id"":""3""},""customfield_10101"":null,""customfield_10068"":null,""customfield_10102"":null,""customfield_10103"":null,""labels"":[],""aggregatetimeoriginalestimate"":null,""timeestimate"":null,""versions"":[],""issuelinks"":[],""assignee"":null,""status"":{""self"":""https://merico.atlassian.net/rest/api/2/status/10033"",""description"":"""",""iconUrl"":""https://merico.atlassian.net/"",""name"":""To Do"",""id"":""10033"",""statusCategory"":{""self"":""https://merico.atlassian.net/rest/api/2/statuscategory/2"",""id"":2,""key"":""new"",""colorName"":""blue-gray"",""name"":""To Do""}},""components"":[],""aggregatetimeestimate"":null,""creator"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""subtasks"":[],""customfield_10161"":null,""customfield_10162"":null,""customfield_10163"":null,""customfield_10164"":null,""reporter"":{""self"":""https://merico.atlassian.net/rest/api/2/user?accountId=62a2d08d1be00a0068af1945"",""accountId"":""62a2d08d1be00a0068af1945"",""emailAddress"":""keon.amini@merico.dev"",""avatarUrls"":{""48x48"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""24x24"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""16x16"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png"",""32x32"":""https://secure.gravatar.com/avatar/bbcb28ea82de3c7a444461eaa42da9ea?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKA-3.png""},""displayName"":""Keon Amini"",""active"":true,""timeZone"":""Asia/Shanghai"",""accountType"":""atlassian""},""customfield_10165"":null,""aggregateprogress"":{""progress"":0,""total"":0},""customfield_10159"":null,""progress"":{""progress"":0,""total"":0},""votes"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-4/votes"",""votes"":0,""hasVoted"":false},""worklog"":{""startAt"":0,""maxResults"":20,""total"":0,""worklogs"":[]},""issuetype"":{""self"":""https://merico.atlassian.net/rest/api/2/issuetype/10000"",""id"":""10000"",""description"":""讲述一个业务,包含多个Story,可能垮Sprint的工作任务,例如效率报表。"",""iconUrl"":""https://merico.atlassian.net/images/icons/issuetypes/epic.svg"",""name"":""Epic"",""subtask"":false,""hierarchyLevel"":1},""timespent"":null,""customfield_10150"":null,""sprint"":null,""customfield_10151"":null,""project"":{""self"":""https://merico.atlassian.net/rest/api/2/project/10050"",""id"":""10050"",""key"":""K5"",""name"":""Keon_5"",""projectTypeKey"":""software"",""simplified"":false,""avatarUrls"":{""48x48"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410"",""24x24"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=small"",""16x16"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=xsmall"",""32x32"":""https://merico.atlassian.net/rest/api/2/universal_avatar/view/type/project/avatar/10410?size=medium""}},""customfield_10152"":null,""customfield_10153"":null,""customfield_10154"":null,""customfield_10155"":null,""aggregatetimespent"":null,""customfield_10156"":null,""customfield_10157"":null,""customfield_10158"":null,""customfield_10027"":null,""customfield_10028"":null,""resolutiondate"":null,""workratio"":-1,""issuerestriction"":{""issuerestrictions"":{},""shouldDisplay"":false},""watches"":{""self"":""https://merico.atlassian.net/rest/api/2/issue/K5-4/watchers"",""watchCount"":1,""isWatching"":true},""created"":""2022-07-16T06:31:15.981+0800"",""customfield_10140"":null,""customfield_10020"":null,""customfield_10141"":null,""customfield_10142"":null,""customfield_10021"":null,""customfield_10022"":null,""customfield_10143"":null,""customfield_10023"":null,""customfield_10024"":null,""customfield_10145"":null,""customfield_10146"":null,""customfield_10016"":null,""customfield_10137"":null,""customfield_10017"":""yellow"",""customfield_10138"":null,""customfield_10018"":{""hasEpicLinkFieldDependency"":false,""showField"":true},""customfield_10019"":""0|i01ozn:"",""updated"":""2022-07-16T06:31:38.598+0800"",""customfield_10090"":null,""customfield_10091"":null,""customfield_10092"":null,""customfield_10093"":null,""timeoriginalestimate"":null,""customfield_10095"":null,""customfield_10096"":null,""description"":null,""customfield_10130"":null,""customfield_10097"":null,""customfield_10098"":null,""customfield_10131"":null,""customfield_10010"":null,""customfield_10099"":null,""customfield_10011"":""K5 Epic"",""customfield_10132"":null,""customfield_10012"":{""self"":""https://merico.atlassian.net/rest/api/2/customFieldOption/10016"",""value"":""To Do"",""id"":""10016""},""customfield_10133"":null,""customfield_10134"":null,""customfield_10013"":""ghx-label-3"",""customfield_10135"":null,""customfield_10014"":null,""customfield_10015"":null,""timetracking"":{},""customfield_10136"":null,""customfield_10005"":null,""customfield_10126"":null,""customfield_10127"":null,""customfield_10006"":null,""customfield_10128"":null,""customfield_10007"":null,""security"":null,""customfield_10008"":null,""customfield_10129"":null,""attachment"":[],""customfield_10009"":null,""flagged"":false,""summary"":""K5 epic"",""customfield_10080"":null,""customfield_10081"":null,""customfield_10082"":null,""customfield_10083"":null,""customfield_10084"":null,""customfield_10085"":null,""customfield_10086"":null,""customfield_10087"":null,""customfield_10120"":null,""customfield_10088"":null,""customfield_10121"":null,""customfield_10000"":""{}"",""customfield_10089"":null,""customfield_10122"":null,""customfield_10001"":null,""customfield_10123"":null,""customfield_10002"":null,""customfield_10003"":null,""customfield_10124"":null,""customfield_10004"":null,""customfield_10125"":null,""customfield_10115"":null,""customfield_10116"":null,""customfield_10117"":null,""environment"":null,""customfield_10118"":null,""customfield_10119"":null,""duedate"":null,""comment"":{""comments"":[],""self"":""https://merico.atlassian.net/rest/api/2/issue/20710/comment"",""maxResults"":0,""total"":0,""startAt"":0}}}",https://merico.atlassian.net/rest/agile/1.0/board/93/issue?expand=changelog&jql=ORDER+BY+created+ASC&maxResults=100&startAt=0,null,2022-07-19T19:36:31.152+00:00 diff --git a/plugins/jira/tasks/external_epic_collector.go b/plugins/jira/tasks/epic_collector.go similarity index 71% rename from plugins/jira/tasks/external_epic_collector.go rename to plugins/jira/tasks/epic_collector.go index 56f24bea590..105d8530f43 100644 --- a/plugins/jira/tasks/external_epic_collector.go +++ b/plugins/jira/tasks/epic_collector.go @@ -23,19 +23,15 @@ import ( "github.com/apache/incubator-devlake/plugins/core/dal" "strings" + "encoding/json" "github.com/apache/incubator-devlake/plugins/helper" + "io/ioutil" "net/http" "net/url" ) -import ( - "encoding/json" - "io/ioutil" -) - -const RAW_EXTERNAL_EPIC_TABLE = "jira_external_epics" +const RAW_EPIC_TABLE = "jira_api_epics" -// this struct should be moved to `jira_api_common.go` type JiraEpicParams struct { ConnectionId uint64 BoardId uint64 @@ -43,18 +39,18 @@ type JiraEpicParams struct { var _ core.SubTaskEntryPoint = CollectIssues -var CollectExternalEpicsMeta = core.SubTaskMeta{ - Name: "collectExternalEpics", - EntryPoint: CollectExternalEpics, +var CollectEpicsMeta = core.SubTaskMeta{ + Name: "collectEpics", + EntryPoint: CollectEpics, EnabledByDefault: true, - Description: "collect Jira epics from other boards", + Description: "collect Jira epics from all boards", DomainTypes: []string{core.DOMAIN_TYPE_TICKET, core.DOMAIN_TYPE_CROSS}, } -func CollectExternalEpics(taskCtx core.SubTaskContext) error { +func CollectEpics(taskCtx core.SubTaskContext) error { db := taskCtx.GetDal() data := taskCtx.GetData().(*JiraTaskData) - externalEpicKeys, err := GetExternalEpicKeys(db, data) + externalEpicKeys, err := GetEpicKeys(db, data) if err != nil { return err } @@ -77,7 +73,7 @@ func CollectExternalEpics(taskCtx core.SubTaskContext) error { ConnectionId: data.Options.ConnectionId, BoardId: data.Options.BoardId, }, - Table: RAW_EXTERNAL_EPIC_TABLE, + Table: RAW_EPIC_TABLE, }, ApiClient: data.ApiClient, PageSize: 100, @@ -115,27 +111,24 @@ func CollectExternalEpics(taskCtx core.SubTaskContext) error { return collector.Execute() } -func GetExternalEpicKeys(db dal.Dal, data *JiraTaskData) ([]string, error) { - // union of - // 1. issues with epics not from this board and not in the issues table - // 2. issues with epics not from this board that ARE already in the issues table (from previous runs) - // the above two selections are mutually exclusive - cursor, err := db.RawCursor(fmt.Sprintf(` - SELECT tji.epic_key as epicKey FROM _tool_jira_issues tji - LEFT JOIN _tool_jira_board_issues tjbi - ON tji.issue_id = tjbi.issue_id - WHERE - tjbi.board_id = %d AND tji.epic_key != "" AND NOT EXISTS ( - SELECT issue_key FROM _tool_jira_issues tji2 - WHERE tji2.issue_key = tji.epic_key - ) - UNION - SELECT tji.issue_key as epicKey FROM _tool_jira_issues tji - LEFT JOIN _tool_jira_board_issues tjbi - ON tji.issue_id = tjbi.issue_id - WHERE - tjbi.issue_id IS NULL; - `, data.Options.BoardId)) +func GetEpicKeys(db dal.Dal, data *JiraTaskData) ([]string, error) { + cursor, err := db.RawCursor(` + select + distinct epic_key + from + _tool_jira_issues i + left join _tool_jira_board_issues bi on ( + i.connection_id = bi.connection_id + and + i.issue_id = bi.issue_id + ) + where + i.connection_id = ? + and + bi.board_id = ? + and + i.epic_key != '' + `, data.Options.ConnectionId, data.Options.BoardId) if err != nil { return nil, fmt.Errorf("unable to query for external epics: %v", err) } diff --git a/plugins/jira/tasks/epic_extractor.go b/plugins/jira/tasks/epic_extractor.go new file mode 100644 index 00000000000..44c7a183b21 --- /dev/null +++ b/plugins/jira/tasks/epic_extractor.go @@ -0,0 +1,63 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package tasks + +import ( + "github.com/apache/incubator-devlake/plugins/core" + "github.com/apache/incubator-devlake/plugins/helper" +) + +var _ core.SubTaskEntryPoint = ExtractIssues + +var ExtractEpicsMeta = core.SubTaskMeta{ + Name: "extractEpics", + EntryPoint: ExtractEpics, + EnabledByDefault: true, + Description: "extract Jira epics from all boards", + DomainTypes: []string{core.DOMAIN_TYPE_TICKET, core.DOMAIN_TYPE_CROSS}, +} + +func ExtractEpics(taskCtx core.SubTaskContext) error { + data := taskCtx.GetData().(*JiraTaskData) + db := taskCtx.GetDal() + connectionId := data.Options.ConnectionId + boardId := data.Options.BoardId + logger := taskCtx.GetLogger() + logger.Info("extract external epic Issues, connection_id=%d, board_id=%d", connectionId, boardId) + mappings, err := getTypeMappings(data, db) + if err != nil { + return err + } + extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{ + RawDataSubTaskArgs: helper.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: JiraEpicParams{ + ConnectionId: data.Options.ConnectionId, + BoardId: data.Options.BoardId, + }, + Table: RAW_EPIC_TABLE, + }, + Extract: func(row *helper.RawData) ([]interface{}, error) { + return extractIssues(data, mappings, true, row) + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/plugins/jira/tasks/external_epic_extractor.go b/plugins/jira/tasks/external_epic_extractor.go deleted file mode 100644 index 2b4ce9f7da5..00000000000 --- a/plugins/jira/tasks/external_epic_extractor.go +++ /dev/null @@ -1,136 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package tasks - -import ( - "encoding/json" - "github.com/apache/incubator-devlake/plugins/core" - "github.com/apache/incubator-devlake/plugins/helper" - "github.com/apache/incubator-devlake/plugins/jira/models" - "github.com/apache/incubator-devlake/plugins/jira/tasks/apiv2models" - "strconv" - "strings" - "time" -) - -var _ core.SubTaskEntryPoint = ExtractIssues - -var ExtractExternalEpicsMeta = core.SubTaskMeta{ - Name: "extractExternalEpics", - EntryPoint: ExtractExternalEpics, - EnabledByDefault: true, - Description: "extract Jira epics from other boards", - DomainTypes: []string{core.DOMAIN_TYPE_TICKET, core.DOMAIN_TYPE_CROSS}, -} - -func ExtractExternalEpics(taskCtx core.SubTaskContext) error { - data := taskCtx.GetData().(*JiraTaskData) - db := taskCtx.GetDal() - connectionId := data.Options.ConnectionId - boardId := data.Options.BoardId - logger := taskCtx.GetLogger() - logger.Info("extract external epic Issues, connection_id=%d, board_id=%d", connectionId, boardId) - mappings, err := getTypeMappings(data, db) - if err != nil { - return err - } - extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{ - RawDataSubTaskArgs: helper.RawDataSubTaskArgs{ - Ctx: taskCtx, - Params: JiraEpicParams{ - ConnectionId: data.Options.ConnectionId, - BoardId: data.Options.BoardId, - }, - Table: RAW_EXTERNAL_EPIC_TABLE, - }, - Extract: func(row *helper.RawData) ([]interface{}, error) { - var apiIssue apiv2models.Issue - err = 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{} - sprints, issue, 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 { - issue.LeadTimeMinutes = uint(issue.ResolutionDate.Unix()-issue.Created.Unix()) / 60 - } - if data.Options.TransformationRules.StoryPointField != "" { - strStoryPoint, _ := apiIssue.Fields.AllFields[data.Options.TransformationRules.StoryPointField].(string) - if strStoryPoint != "" { - issue.StoryPoint, _ = strconv.ParseFloat(strStoryPoint, 32) - } - } - issue.Type = mappings.typeIdMappings[issue.Type] - issue.StdStoryPoint = int64(issue.StoryPoint) - issue.StdType = mappings.stdTypeMappings[issue.Type] - if issue.StdType == "" { - issue.StdType = strings.ToUpper(issue.Type) - } - issue.StdStatus = getStdStatus(issue.StatusKey) - results = append(results, issue) - 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 - } - for _, changelog := range changelogs { - changelog.IssueUpdated = issueUpdated - results = append(results, changelog) - } - for _, changelogItem := range changelogItems { - results = append(results, changelogItem) - } - for _, user := range users { - results = append(results, user) - } - labels := apiIssue.Fields.Labels - for _, v := range labels { - issueLabel := &models.JiraIssueLabel{ - IssueId: issue.IssueId, - LabelName: v, - ConnectionId: data.Options.ConnectionId, - } - results = append(results, issueLabel) - } - return results, nil - }, - }) - if err != nil { - return err - } - return extractor.Execute() -} diff --git a/plugins/jira/tasks/issue_extractor.go b/plugins/jira/tasks/issue_extractor.go index 146bde17899..207bb33b919 100644 --- a/plugins/jira/tasks/issue_extractor.go +++ b/plugins/jira/tasks/issue_extractor.go @@ -73,79 +73,7 @@ func ExtractIssues(taskCtx core.SubTaskContext) error { Table: RAW_ISSUE_TABLE, }, Extract: func(row *helper.RawData) ([]interface{}, error) { - var apiIssue apiv2models.Issue - err := 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{} - sprints, issue, 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 { - issue.LeadTimeMinutes = uint(issue.ResolutionDate.Unix()-issue.Created.Unix()) / 60 - } - if data.Options.TransformationRules.StoryPointField != "" { - strStoryPoint, _ := apiIssue.Fields.AllFields[data.Options.TransformationRules.StoryPointField].(string) - if strStoryPoint != "" { - issue.StoryPoint, _ = strconv.ParseFloat(strStoryPoint, 32) - } - } - issue.Type = mappings.typeIdMappings[issue.Type] - issue.StdStoryPoint = int64(issue.StoryPoint) - issue.StdType = mappings.stdTypeMappings[issue.Type] - if issue.StdType == "" { - issue.StdType = strings.ToUpper(issue.Type) - } - issue.StdStatus = getStdStatus(issue.StatusKey) - results = append(results, issue) - 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 - } - for _, changelog := range changelogs { - changelog.IssueUpdated = issueUpdated - results = append(results, changelog) - } - for _, changelogItem := range changelogItems { - results = append(results, changelogItem) - } - for _, user := range users { - results = append(results, user) - } - results = append(results, &models.JiraBoardIssue{ - ConnectionId: connectionId, - BoardId: boardId, - IssueId: issue.IssueId, - }) - labels := apiIssue.Fields.Labels - for _, v := range labels { - issueLabel := &models.JiraIssueLabel{ - IssueId: issue.IssueId, - LabelName: v, - ConnectionId: data.Options.ConnectionId, - } - results = append(results, issueLabel) - } - return results, nil + return extractIssues(data, mappings, false, row) }, }) if err != nil { @@ -154,6 +82,84 @@ func ExtractIssues(taskCtx core.SubTaskContext) error { return extractor.Execute() } +func extractIssues(data *JiraTaskData, mappings *typeMappings, ignoreBoard bool, row *helper.RawData) ([]interface{}, error) { + var apiIssue apiv2models.Issue + err := 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{} + sprints, issue, 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 { + issue.LeadTimeMinutes = uint(issue.ResolutionDate.Unix()-issue.Created.Unix()) / 60 + } + if data.Options.TransformationRules.StoryPointField != "" { + strStoryPoint, _ := apiIssue.Fields.AllFields[data.Options.TransformationRules.StoryPointField].(string) + if strStoryPoint != "" { + issue.StoryPoint, _ = strconv.ParseFloat(strStoryPoint, 32) + } + } + issue.Type = mappings.typeIdMappings[issue.Type] + issue.StdStoryPoint = int64(issue.StoryPoint) + issue.StdType = mappings.stdTypeMappings[issue.Type] + if issue.StdType == "" { + issue.StdType = strings.ToUpper(issue.Type) + } + issue.StdStatus = getStdStatus(issue.StatusKey) + results = append(results, issue) + 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 + } + for _, changelog := range changelogs { + changelog.IssueUpdated = issueUpdated + results = append(results, changelog) + } + for _, changelogItem := range changelogItems { + results = append(results, changelogItem) + } + for _, user := range users { + results = append(results, user) + } + if !ignoreBoard { + results = append(results, &models.JiraBoardIssue{ + ConnectionId: data.Options.ConnectionId, + BoardId: data.Options.BoardId, + IssueId: issue.IssueId, + }) + } + labels := apiIssue.Fields.Labels + for _, v := range labels { + issueLabel := &models.JiraIssueLabel{ + IssueId: issue.IssueId, + LabelName: v, + ConnectionId: data.Options.ConnectionId, + } + results = append(results, issueLabel) + } + return results, nil +} + func getTypeMappings(data *JiraTaskData, db dal.Dal) (*typeMappings, error) { typeIdMapping := make(map[string]string) issueTypes := make([]models.JiraIssueType, 0) From 4d8968aa46aca4fdcbc40e4c8843c84c85ad64ae Mon Sep 17 00:00:00 2001 From: Keon Amini Date: Wed, 27 Jul 2022 00:46:53 -0500 Subject: [PATCH 4/7] fix: add new subtasks --- plugins/jira/impl/impl.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/jira/impl/impl.go b/plugins/jira/impl/impl.go index 63d5ddd5e34..cedd9f29577 100644 --- a/plugins/jira/impl/impl.go +++ b/plugins/jira/impl/impl.go @@ -100,6 +100,9 @@ func (plugin Jira) SubTaskMetas() []core.SubTaskMeta { tasks.ExtractAccountsMeta, tasks.ConvertAccountsMeta, + + tasks.CollectEpicsMeta, + tasks.ExtractEpicsMeta, } } From 3be8d83d3ccad38903697984703d19af74927d33 Mon Sep 17 00:00:00 2001 From: Keon Amini Date: Wed, 27 Jul 2022 22:33:53 -0500 Subject: [PATCH 5/7] fix: added batching via iterators to the epic collector + improvements to iterator framework --- plugins/helper/iterator.go | 64 +++++++++++++++---------- plugins/helper/list.go | 15 ++++-- plugins/helper/queue.go | 31 +++++++++++- plugins/jenkins/models/job.go | 2 +- plugins/jira/e2e/epic_test.go | 58 ++++++++++++++++++++-- plugins/jira/tasks/epic_collector.go | 72 ++++++++++++---------------- plugins/jira/tasks/epic_extractor.go | 4 +- 7 files changed, 165 insertions(+), 81 deletions(-) diff --git a/plugins/helper/iterator.go b/plugins/helper/iterator.go index 7c8953b2c1d..d0c7089d4d4 100644 --- a/plugins/helper/iterator.go +++ b/plugins/helper/iterator.go @@ -34,27 +34,41 @@ type Iterator interface { // DalCursorIterator FIXME ... type DalCursorIterator struct { - db dal.Dal - cursor *sql.Rows - elemType reflect.Type + db dal.Dal + cursor *sql.Rows + elemType reflect.Type + batchSize int } // NewDalCursorIterator FIXME ... func NewDalCursorIterator(db dal.Dal, cursor *sql.Rows, elemType reflect.Type) (*DalCursorIterator, error) { + return NewBatchedDalCursorIterator(db, cursor, elemType, -1) +} + +// NewBatchedDalCursorIterator FIXME ... +func NewBatchedDalCursorIterator(db dal.Dal, cursor *sql.Rows, elemType reflect.Type, batchSize int) (*DalCursorIterator, error) { return &DalCursorIterator{ - db: db, - cursor: cursor, - elemType: elemType, + db: db, + cursor: cursor, + elemType: elemType, + batchSize: batchSize, }, nil } -// HasNext FIXME ... +// HasNext increments the row curser. If we're at the end, it'll return false. func (c *DalCursorIterator) HasNext() bool { return c.cursor.Next() } -// Fetch FIXME ... +// Fetch if batching is disabled, it'll read a single row, otherwise it'll read as many rows up to the batch size, and the +// runtime return type will be []interface{}. Note, HasNext needs to have been called before invoking this. func (c *DalCursorIterator) Fetch() (interface{}, error) { + if c.batchSize > 0 { + return c.batchedFetch() + } + if c.batchSize != -1 { + panic("invalid batch size") + } elem := reflect.New(c.elemType).Interface() err := c.db.Fetch(c.cursor, elem) if err != nil { @@ -63,7 +77,23 @@ func (c *DalCursorIterator) Fetch() (interface{}, error) { return elem, nil } -// Close interator +func (c *DalCursorIterator) batchedFetch() (interface{}, error) { + var elems []interface{} + for i := 1; ; i++ { + elem := reflect.New(c.elemType).Interface() + err := c.cursor.Scan(elem) + if err != nil { + return nil, err + } + elems = append(elems, elem) + if i == c.batchSize || !c.HasNext() { + break + } + } + return elems, nil +} + +// Close iterator func (c *DalCursorIterator) Close() error { return c.cursor.Close() } @@ -114,22 +144,6 @@ func NewDateIterator(days int) (*DateIterator, error) { }, nil } -type QueueIteratorNode struct { - data interface{} - next *QueueIteratorNode -} - -func (q *QueueIteratorNode) Next() interface{} { - if q.next == nil { - return nil - } - return q.next -} - -func (q *QueueIteratorNode) SetNext(next interface{}) { - q.next, _ = next.(*QueueIteratorNode) -} - type QueueIterator struct { queue *Queue } diff --git a/plugins/helper/list.go b/plugins/helper/list.go index b3a1381b218..866f42229fb 100644 --- a/plugins/helper/list.go +++ b/plugins/helper/list.go @@ -17,22 +17,27 @@ limitations under the License. package helper +// ListBaseNode 'abstract' base struct for Nodes that are chained in a linked list manner type ListBaseNode struct { - next interface{} + next *ListBaseNode } -func (l *ListBaseNode) Next() interface{} { +func (l *ListBaseNode) Data() interface{} { + panic("list node Data() needs to be implemented by subclasses") +} + +func (l *ListBaseNode) Next() QueueNode { if l.next == nil { return nil } return l.next } -func (l *ListBaseNode) SetNext(next interface{}) { - l.next = next +func (l *ListBaseNode) SetNext(next QueueNode) { + l.next = next.(*ListBaseNode) } -// NewListBaseNode create and init a new node +// NewListBaseNode create and init a new node (only to be called by subclasses) func NewListBaseNode() *ListBaseNode { return &ListBaseNode{ next: nil, diff --git a/plugins/helper/queue.go b/plugins/helper/queue.go index b1e747834d6..2f20d6d089c 100644 --- a/plugins/helper/queue.go +++ b/plugins/helper/queue.go @@ -23,8 +23,9 @@ import ( ) type QueueNode interface { - Next() interface{} - SetNext(next interface{}) + Next() QueueNode + SetNext(next QueueNode) + Data() interface{} } type Queue struct { @@ -125,3 +126,29 @@ func NewQueue() *Queue { mux: sync.Mutex{}, } } + +type QueueIteratorNode struct { + next *QueueIteratorNode + data interface{} +} + +func (q *QueueIteratorNode) Next() QueueNode { + if q.next == nil { + return nil + } + return q.next +} + +func (q *QueueIteratorNode) SetNext(next QueueNode) { + q.next, _ = next.(*QueueIteratorNode) +} + +func (q *QueueIteratorNode) Data() interface{} { + return q.data +} + +func NewQueueIteratorNode(data interface{}) *QueueIteratorNode { + return &QueueIteratorNode{ + data: data, + } +} diff --git a/plugins/jenkins/models/job.go b/plugins/jenkins/models/job.go index 13b0fd9d0a8..0a406999488 100644 --- a/plugins/jenkins/models/job.go +++ b/plugins/jenkins/models/job.go @@ -44,8 +44,8 @@ func (JenkinsJob) TableName() string { } type FolderInput struct { - Path string *helper.ListBaseNode + Path string } func NewFolderInput(path string) *FolderInput { diff --git a/plugins/jira/e2e/epic_test.go b/plugins/jira/e2e/epic_test.go index 03ef7ab2946..e0f3ef3fa0d 100644 --- a/plugins/jira/e2e/epic_test.go +++ b/plugins/jira/e2e/epic_test.go @@ -1,3 +1,20 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package e2e import ( @@ -55,11 +72,42 @@ func TestEpicDataflow(t *testing.T) { IgnoreTypes: []interface{}{common.NoPKModel{}}, }, ) - - // run the part of the collector that queries tools data - keys, err := tasks.GetEpicKeys(ctx.GetDal(), taskData) - require.NoError(t, err) - require.Contains(t, keys, "K5-1") //epic not on the board + t.Run("batch_single", func(t *testing.T) { + // run the part of the collector that queries tools data + iter, err := tasks.GetEpicKeysIterator(ctx.GetDal(), taskData, 1) + require.NoError(t, err) + require.True(t, iter.HasNext()) + e1, err := iter.Fetch() + require.NoError(t, err) + require.True(t, iter.HasNext()) + e2, err := iter.Fetch() + require.NoError(t, err) + require.False(t, iter.HasNext()) + require.Equal(t, 1, len(e1.([]interface{}))) + require.Equal(t, 1, len(e2.([]interface{}))) + epicKeys := []string{ + *(e1.([]interface{})[0].(*string)), + *(e2.([]interface{})[0].(*string)), + } + require.Contains(t, epicKeys, "K5-1") + require.Contains(t, epicKeys, "K5-4") + }) + t.Run("batch_multiple", func(t *testing.T) { + // run the part of the collector that queries tools data + iter, err := tasks.GetEpicKeysIterator(ctx.GetDal(), taskData, 2) + require.NoError(t, err) + require.True(t, iter.HasNext()) + e, err := iter.Fetch() + require.NoError(t, err) + require.False(t, iter.HasNext()) + require.Equal(t, 2, len(e.([]interface{}))) + epicKeys := []string{ + *(e.([]interface{})[0].(*string)), + *(e.([]interface{})[1].(*string)), + } + require.Contains(t, epicKeys, "K5-1") + require.Contains(t, epicKeys, "K5-4") + }) require.NoError(t, tasks.ExtractEpicsMeta.EntryPoint(ctx)) diff --git a/plugins/jira/tasks/epic_collector.go b/plugins/jira/tasks/epic_collector.go index 105d8530f43..082b0398299 100644 --- a/plugins/jira/tasks/epic_collector.go +++ b/plugins/jira/tasks/epic_collector.go @@ -21,6 +21,7 @@ import ( "fmt" "github.com/apache/incubator-devlake/plugins/core" "github.com/apache/incubator-devlake/plugins/core/dal" + "reflect" "strings" "encoding/json" @@ -32,12 +33,7 @@ import ( const RAW_EPIC_TABLE = "jira_api_epics" -type JiraEpicParams struct { - ConnectionId uint64 - BoardId uint64 -} - -var _ core.SubTaskEntryPoint = CollectIssues +var _ core.SubTaskEntryPoint = CollectEpics var CollectEpicsMeta = core.SubTaskMeta{ Name: "collectEpics", @@ -50,26 +46,20 @@ var CollectEpicsMeta = core.SubTaskMeta{ func CollectEpics(taskCtx core.SubTaskContext) error { db := taskCtx.GetDal() data := taskCtx.GetData().(*JiraTaskData) - externalEpicKeys, err := GetEpicKeys(db, data) + epicIterator, err := GetEpicKeysIterator(db, data, 100) if err != nil { return err } - if len(externalEpicKeys) == 0 { - taskCtx.GetLogger().Info("no external epic keys found for Jira board %d", data.Options.BoardId) - return nil - } since := data.Since jql := "ORDER BY created ASC" if since != nil { // prepend a time range criteria if `since` was specified, either by user or from database jql = fmt.Sprintf("updated >= '%s' %s", since.Format("2006/01/02 15:04"), jql) } - jql = fmt.Sprintf("issue in (%s) %s", strings.Join(externalEpicKeys, ","), jql) - collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{ RawDataSubTaskArgs: helper.RawDataSubTaskArgs{ Ctx: taskCtx, - Params: JiraEpicParams{ + Params: JiraApiParams{ ConnectionId: data.Options.ConnectionId, BoardId: data.Options.BoardId, }, @@ -81,13 +71,18 @@ func CollectEpics(taskCtx core.SubTaskContext) error { UrlTemplate: "api/2/search", Query: func(reqData *helper.RequestData) (url.Values, error) { query := url.Values{} - query.Set("jql", jql) - query.Set("issue in", fmt.Sprintf("(%s)", strings.Join(externalEpicKeys, ","))) + epicKeys := []string{} + for _, e := range reqData.Input.([]interface{}) { + epicKeys = append(epicKeys, *e.(*string)) + } + localJQL := fmt.Sprintf("issue in (%s) %s", strings.Join(epicKeys, ","), jql) + query.Set("jql", localJQL) query.Set("startAt", fmt.Sprintf("%v", reqData.Pager.Skip)) query.Set("maxResults", fmt.Sprintf("%v", reqData.Pager.Size)) query.Set("expand", "changelog") return query, nil }, + Input: epicIterator, GetTotalPages: GetTotalPagesFromResponse, Concurrency: 10, ResponseParser: func(res *http.Response) ([]json.RawMessage, error) { @@ -111,35 +106,30 @@ func CollectEpics(taskCtx core.SubTaskContext) error { return collector.Execute() } -func GetEpicKeys(db dal.Dal, data *JiraTaskData) ([]string, error) { +func GetEpicKeysIterator(db dal.Dal, data *JiraTaskData, batchSize int) (helper.Iterator, error) { cursor, err := db.RawCursor(` - select - distinct epic_key - from - _tool_jira_issues i - left join _tool_jira_board_issues bi on ( - i.connection_id = bi.connection_id - and - i.issue_id = bi.issue_id - ) - where - i.connection_id = ? - and - bi.board_id = ? - and - i.epic_key != '' + SELECT + DISTINCT epic_key + FROM + _tool_jira_issues i + LEFT JOIN _tool_jira_board_issues bi ON ( + i.connection_id = bi.connection_id + AND + i.issue_id = bi.issue_id + ) + WHERE + i.connection_id = ? + AND + bi.board_id = ? + AND + i.epic_key != '' `, data.Options.ConnectionId, data.Options.BoardId) if err != nil { return nil, fmt.Errorf("unable to query for external epics: %v", err) } - var externalEpicKeys []string - for cursor.Next() { - epicKey := "" - err = cursor.Scan(&epicKey) - if err != nil { - return nil, fmt.Errorf("couldn't read returned epic key: %v", err) - } - externalEpicKeys = append(externalEpicKeys, epicKey) + iter, err := helper.NewBatchedDalCursorIterator(db, cursor, reflect.TypeOf(""), batchSize) + if err != nil { + return nil, err } - return externalEpicKeys, nil + return iter, nil } diff --git a/plugins/jira/tasks/epic_extractor.go b/plugins/jira/tasks/epic_extractor.go index 44c7a183b21..d6379c5e007 100644 --- a/plugins/jira/tasks/epic_extractor.go +++ b/plugins/jira/tasks/epic_extractor.go @@ -22,7 +22,7 @@ import ( "github.com/apache/incubator-devlake/plugins/helper" ) -var _ core.SubTaskEntryPoint = ExtractIssues +var _ core.SubTaskEntryPoint = ExtractEpics var ExtractEpicsMeta = core.SubTaskMeta{ Name: "extractEpics", @@ -46,7 +46,7 @@ func ExtractEpics(taskCtx core.SubTaskContext) error { extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{ RawDataSubTaskArgs: helper.RawDataSubTaskArgs{ Ctx: taskCtx, - Params: JiraEpicParams{ + Params: JiraApiParams{ ConnectionId: data.Options.ConnectionId, BoardId: data.Options.BoardId, }, From 0903ce93a63fb1ca1871abd4e796b53f7b2be333 Mon Sep 17 00:00:00 2001 From: Keon Amini Date: Wed, 27 Jul 2022 23:16:55 -0500 Subject: [PATCH 6/7] fix: troubleshooting --- go.mod | 8 +++++++- go.sum | 28 ++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index df773afb6b7..98cc2be4526 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( github.com/gin-gonic/gin v1.7.7 github.com/go-git/go-git/v5 v5.4.2 github.com/go-playground/validator/v10 v10.9.0 - github.com/gocarina/gocsv v0.0.0-20220707092902-b9da1f06c77e github.com/libgit2/git2go/v33 v33.0.6 github.com/magiconair/properties v1.8.5 github.com/manifoldco/promptui v0.9.0 @@ -37,7 +36,10 @@ require ( github.com/KyleBanks/depth v1.2.1 // indirect github.com/Microsoft/go-winio v0.5.0 // indirect github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/acomagu/bufpipe v1.0.3 // indirect + github.com/agiledragon/gomonkey/v2 v2.7.0 // indirect github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -45,6 +47,7 @@ require ( github.com/emirpasic/gods v1.12.0 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/ghodss/yaml v1.0.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect @@ -55,6 +58,7 @@ require ( github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect + github.com/gocarina/gocsv v0.0.0-20220707092902-b9da1f06c77e // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/status v1.1.0 // indirect @@ -103,7 +107,9 @@ require ( github.com/stretchr/objx v0.3.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/ugorji/go/codec v1.2.6 // indirect + github.com/urfave/cli/v2 v2.11.0 // indirect github.com/xanzy/ssh-agent v0.3.0 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.uber.org/atomic v1.9.0 // indirect golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e // indirect diff --git a/go.sum b/go.sum index c78c73503d0..fd15fd18acc 100644 --- a/go.sum +++ b/go.sum @@ -49,11 +49,15 @@ github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXG github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= +github.com/agiledragon/gomonkey/v2 v2.7.0 h1:CFT/xdr6xbsIN04Yll4OhKq/vPm0MVD8ykV99jDBesM= +github.com/agiledragon/gomonkey/v2 v2.7.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -115,6 +119,7 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/cors v1.3.1 h1:doAsuITavI4IOcd0Y19U4B+O0dNWihRyX//nn4sEmgA= github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzFA61xsmDk= @@ -147,13 +152,16 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/spec v0.20.6 h1:ich1RQ3WDbfoeTqTAb+5EIxNmpKVJZWBNah9RAT0jIQ= github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= @@ -411,6 +419,7 @@ github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaW github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -466,6 +475,7 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= @@ -555,6 +565,7 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w= github.com/swaggo/gin-swagger v1.4.3 h1:mHJz+yzJne0udgYnC5qlDf4e7KuxUbVNX2dhD/cw2rU= github.com/swaggo/gin-swagger v1.4.3/go.mod h1:hBg6tGeKJsUu/P79BH+WGUR8nq2LuGE0O160+s4iefo= +github.com/swaggo/swag v1.8.1 h1:JuARzFX1Z1njbCGz+ZytBR15TFJwF2Q7fu8puJHhQYI= github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ= github.com/swaggo/swag v1.8.3 h1:3pZSSCQ//gAH88lfmxM3Cd1+JCsxV8Md6f36b9hrZ5s= github.com/swaggo/swag v1.8.3/go.mod h1:jMLeXOOmYyjk8PvHTsXBdrubsNd9gUJTTCzL5iBnseg= @@ -565,17 +576,20 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/urfave/cli/v2 v2.11.0 h1:c6bD90aLd2iEsokxhxkY5Er0zA2V9fId2aJfwmrF+do= +github.com/urfave/cli/v2 v2.11.0/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= @@ -661,10 +675,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -708,8 +720,8 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -802,10 +814,9 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c h1:sSIdNI2Dd6vGv47bKc/xArpfxVmEz2+3j0E6I484xC4= golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e h1:NHvCuwuS43lGnYhten69ZWqi2QOj/CiDNcKbVqwVoew= golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -884,8 +895,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1033,6 +1044,7 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 8cbdc92b2fefaf7aa0bf2dbd29e16165d1449ed5 Mon Sep 17 00:00:00 2001 From: Keon Amini Date: Thu, 28 Jul 2022 01:46:35 -0500 Subject: [PATCH 7/7] fix: cyclic imports eliminated --- plugins/helper/iterator.go | 2 +- plugins/helper/list.go | 4 ++-- plugins/helper/queue.go | 16 ++++++++-------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/helper/iterator.go b/plugins/helper/iterator.go index d0c7089d4d4..873b9adf745 100644 --- a/plugins/helper/iterator.go +++ b/plugins/helper/iterator.go @@ -157,7 +157,7 @@ func (q *QueueIterator) Fetch() (interface{}, error) { } func (q *QueueIterator) Push(data QueueNode) { - q.queue.PushWitouLock(data) + q.queue.PushWithoutLock(data) } func (q *QueueIterator) Close() error { diff --git a/plugins/helper/list.go b/plugins/helper/list.go index 866f42229fb..a130bfa24e0 100644 --- a/plugins/helper/list.go +++ b/plugins/helper/list.go @@ -26,14 +26,14 @@ func (l *ListBaseNode) Data() interface{} { panic("list node Data() needs to be implemented by subclasses") } -func (l *ListBaseNode) Next() QueueNode { +func (l *ListBaseNode) Next() interface{} { if l.next == nil { return nil } return l.next } -func (l *ListBaseNode) SetNext(next QueueNode) { +func (l *ListBaseNode) SetNext(next interface{}) { l.next = next.(*ListBaseNode) } diff --git a/plugins/helper/queue.go b/plugins/helper/queue.go index 2f20d6d089c..edf58d62f20 100644 --- a/plugins/helper/queue.go +++ b/plugins/helper/queue.go @@ -23,8 +23,8 @@ import ( ) type QueueNode interface { - Next() QueueNode - SetNext(next QueueNode) + Next() interface{} + SetNext(next interface{}) Data() interface{} } @@ -39,7 +39,7 @@ type Queue struct { func (q *Queue) Push(node QueueNode) { q.mux.Lock() defer q.mux.Unlock() - q.PushWitouLock(node) + q.PushWithoutLock(node) } // Pull get a node from queue @@ -58,8 +58,8 @@ func (q *Queue) Pull(add *int64) QueueNode { return node } -// PushWitouLock is no lock mode of Push -func (q *Queue) PushWitouLock(node QueueNode) { +// PushWithoutLock is no lock mode of Push +func (q *Queue) PushWithoutLock(node QueueNode) { if q.tail == nil { q.head = node q.tail = node @@ -71,7 +71,7 @@ func (q *Queue) PushWitouLock(node QueueNode) { } } -// PullWitouLock is no lock mode of Pull +// PullWithOutLock is no lock mode of Pull func (q *Queue) PullWithOutLock() QueueNode { var node QueueNode = nil @@ -132,14 +132,14 @@ type QueueIteratorNode struct { data interface{} } -func (q *QueueIteratorNode) Next() QueueNode { +func (q *QueueIteratorNode) Next() interface{} { if q.next == nil { return nil } return q.next } -func (q *QueueIteratorNode) SetNext(next QueueNode) { +func (q *QueueIteratorNode) SetNext(next interface{}) { q.next, _ = next.(*QueueIteratorNode) }