From 86a3ac217509b6ab057c0ef2b88c259c9bf83ca5 Mon Sep 17 00:00:00 2001 From: "tamas.albert" Date: Thu, 26 Mar 2026 08:36:42 +0200 Subject: [PATCH 01/38] fix: Add backfill time window to ensure data consistency chore: Add backfill time window to ensure data consistency (cherry picked from commit 52a9555b782860f9c8ba9db409bd56e0c8f58272) --- .../tasks/enterprise_metrics_collector.go | 39 +---- .../tasks/metrics_collector_test.go | 76 +++++++++- .../gh-copilot/tasks/org_metrics_collector.go | 26 +--- .../tasks/report_download_helper.go | 133 ++++++++++++++++++ .../tasks/user_metrics_collector.go | 64 ++++----- 5 files changed, 244 insertions(+), 94 deletions(-) diff --git a/backend/plugins/gh-copilot/tasks/enterprise_metrics_collector.go b/backend/plugins/gh-copilot/tasks/enterprise_metrics_collector.go index 076b7df7799..60b80bfacc3 100644 --- a/backend/plugins/gh-copilot/tasks/enterprise_metrics_collector.go +++ b/backend/plugins/gh-copilot/tasks/enterprise_metrics_collector.go @@ -20,7 +20,6 @@ package tasks import ( "encoding/json" "fmt" - "io" "net/http" "net/url" "time" @@ -76,6 +75,7 @@ func CollectEnterpriseMetrics(taskCtx plugin.SubTaskContext) errors.Error { now := time.Now().UTC() start, until := computeReportDateRange(now, collector.GetSince()) + start = clampDailyMetricsStartForBackfill(start, until) logger := taskCtx.GetLogger() dayIter := newDayIterator(start, until) @@ -95,42 +95,7 @@ func CollectEnterpriseMetrics(taskCtx plugin.SubTaskContext) errors.Error { Concurrency: 1, AfterResponse: ignore404, ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { - // Parse metadata response to get download links - body, readErr := io.ReadAll(res.Body) - res.Body.Close() - if readErr != nil { - return nil, errors.Default.Wrap(readErr, "failed to read report metadata") - } - - var meta reportMetadataResponse - if jsonErr := json.Unmarshal(body, &meta); jsonErr != nil { - snippet := string(body) - if len(snippet) > 200 { - snippet = snippet[:200] - } - logger.Error(jsonErr, "failed to parse report metadata, body=%s", snippet) - return nil, errors.Default.Wrap(jsonErr, "failed to parse report metadata") - } - - if len(meta.DownloadLinks) == 0 { - logger.Info("No download links for report day=%s, skipping", meta.ReportDay) - return nil, nil - } - - // Download each report file and return contents as raw messages - var results []json.RawMessage - for _, link := range meta.DownloadLinks { - reportBody, dlErr := downloadReport(link, logger) - if dlErr != nil { - logger.Error(nil, "failed to download report for day=%s: %s", meta.ReportDay, dlErr.Error()) - return nil, dlErr - } - if reportBody == nil { - continue // blob not found, skip - } - results = append(results, json.RawMessage(reportBody)) - } - return results, nil + return parseRawReportResponse(res, logger) }, }) if err != nil { diff --git a/backend/plugins/gh-copilot/tasks/metrics_collector_test.go b/backend/plugins/gh-copilot/tasks/metrics_collector_test.go index cfbab30406c..10d820eaf4e 100644 --- a/backend/plugins/gh-copilot/tasks/metrics_collector_test.go +++ b/backend/plugins/gh-copilot/tasks/metrics_collector_test.go @@ -18,6 +18,8 @@ limitations under the License. package tasks import ( + "bytes" + "io" "net/http" "testing" "time" @@ -45,6 +47,7 @@ func TestComputeReportDateRangeDefaultLookback(t *testing.T) { } func TestComputeReportDateRangeUsesSince(t *testing.T) { + // since is far enough in the past that the lookback buffer doesn't apply. now := time.Date(2025, 1, 10, 12, 0, 0, 0, time.UTC) since := time.Date(2025, 1, 3, 12, 0, 0, 0, time.UTC) start, until := computeReportDateRange(now, &since) @@ -61,9 +64,80 @@ func TestComputeReportDateRangeClampsToLookback(t *testing.T) { } func TestComputeReportDateRangeClampsFutureSince(t *testing.T) { + // Future since is clamped to until, then the lookback buffer applies. now := time.Date(2025, 1, 10, 12, 0, 0, 0, time.UTC) since := now.Add(24 * time.Hour) start, until := computeReportDateRange(now, &since) require.Equal(t, time.Date(2025, 1, 9, 0, 0, 0, 0, time.UTC), until) - require.Equal(t, time.Date(2025, 1, 9, 0, 0, 0, 0, time.UTC), start) + require.Equal(t, time.Date(2025, 1, 7, 0, 0, 0, 0, time.UTC), start) +} + +func TestComputeReportDateRangeLookbackBuffer(t *testing.T) { + // since is yesterday: without the buffer we'd only request 1 day (yesterday). + // With the buffer we look back reportLookbackDays days to retry any 404'd days. + now := time.Date(2025, 1, 10, 0, 0, 0, 0, time.UTC) // midnight run + since := time.Date(2025, 1, 9, 0, 0, 0, 0, time.UTC) // LatestSuccessStart from previous midnight run + start, until := computeReportDateRange(now, &since) + require.Equal(t, time.Date(2025, 1, 9, 0, 0, 0, 0, time.UTC), until) + require.Equal(t, time.Date(2025, 1, 7, 0, 0, 0, 0, time.UTC), start) +} + +func TestClampDailyMetricsStartForBackfillRecentStart(t *testing.T) { + until := time.Date(2025, 1, 9, 0, 0, 0, 0, time.UTC) + start := time.Date(2025, 1, 7, 0, 0, 0, 0, time.UTC) + + clamped := clampDailyMetricsStartForBackfill(start, until) + require.Equal(t, time.Date(2025, 1, 6, 0, 0, 0, 0, time.UTC), clamped) +} + +func TestClampDailyMetricsStartForBackfillKeepsOlderStart(t *testing.T) { + until := time.Date(2025, 1, 9, 0, 0, 0, 0, time.UTC) + start := time.Date(2025, 1, 3, 0, 0, 0, 0, time.UTC) + + clamped := clampDailyMetricsStartForBackfill(start, until) + require.Equal(t, start, clamped) +} + +func TestUserMetricsDateRangeAppliesFourDayBackfillWindow(t *testing.T) { + now := time.Date(2025, 1, 10, 0, 0, 0, 0, time.UTC) + since := time.Date(2025, 1, 9, 0, 0, 0, 0, time.UTC) + + start, until := computeReportDateRange(now, &since) + start = clampDailyMetricsStartForBackfill(start, until) + + require.Equal(t, time.Date(2025, 1, 9, 0, 0, 0, 0, time.UTC), until) + require.Equal(t, time.Date(2025, 1, 6, 0, 0, 0, 0, time.UTC), start) +} + +func TestParseReportMetadataResponseNoContent(t *testing.T) { + res := &http.Response{ + StatusCode: http.StatusNoContent, + Body: io.NopCloser(bytes.NewReader(nil)), + } + + meta, err := parseReportMetadataResponse(res, nil) + require.NoError(t, err) + require.Nil(t, meta) +} + +func TestParseReportMetadataResponseEmptyBody(t *testing.T) { + res := &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(bytes.NewReader(nil)), + } + + meta, err := parseReportMetadataResponse(res, nil) + require.NoError(t, err) + require.Nil(t, meta) +} + +func TestParseReportMetadataResponseEmptyString(t *testing.T) { + res := &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(bytes.NewReader([]byte(`""`))), + } + + meta, err := parseReportMetadataResponse(res, nil) + require.NoError(t, err) + require.Nil(t, meta) } diff --git a/backend/plugins/gh-copilot/tasks/org_metrics_collector.go b/backend/plugins/gh-copilot/tasks/org_metrics_collector.go index 9eee0fe33fa..aa97c4bb9f6 100644 --- a/backend/plugins/gh-copilot/tasks/org_metrics_collector.go +++ b/backend/plugins/gh-copilot/tasks/org_metrics_collector.go @@ -20,7 +20,6 @@ package tasks import ( "encoding/json" "fmt" - "io" "net/http" "net/url" "time" @@ -70,6 +69,7 @@ func CollectOrgMetrics(taskCtx plugin.SubTaskContext) errors.Error { now := time.Now().UTC() start, until := computeReportDateRange(now, collector.GetSince()) + start = clampDailyMetricsStartForBackfill(start, until) logger := taskCtx.GetLogger() dayIter := newDayIterator(start, until) @@ -89,29 +89,7 @@ func CollectOrgMetrics(taskCtx plugin.SubTaskContext) errors.Error { Concurrency: 1, AfterResponse: ignore404, ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { - body, readErr := io.ReadAll(res.Body) - res.Body.Close() - if readErr != nil { - return nil, errors.Default.Wrap(readErr, "failed to read report metadata") - } - - var meta reportMetadataResponse - if jsonErr := json.Unmarshal(body, &meta); jsonErr != nil { - return nil, errors.Default.Wrap(jsonErr, "failed to parse report metadata") - } - - var results []json.RawMessage - for _, link := range meta.DownloadLinks { - reportBody, dlErr := downloadReport(link, logger) - if dlErr != nil { - return nil, dlErr - } - if reportBody == nil { - continue // blob not found, skip - } - results = append(results, json.RawMessage(reportBody)) - } - return results, nil + return parseRawReportResponse(res, logger) }, }) if err != nil { diff --git a/backend/plugins/gh-copilot/tasks/report_download_helper.go b/backend/plugins/gh-copilot/tasks/report_download_helper.go index 857712b8a30..009150ce36e 100644 --- a/backend/plugins/gh-copilot/tasks/report_download_helper.go +++ b/backend/plugins/gh-copilot/tasks/report_download_helper.go @@ -33,6 +33,14 @@ import ( // reportMaxDays is the maximum historical window the new report API supports (1 year). const reportMaxDays = 365 +// reportLookbackDays: extra days rewound from 'until' on incremental runs. +// GitHub reports are generated hours after midnight, so a midnight run gets 404 for the previous +// day. Without this buffer, 'LatestSuccessStart' advances past the missed day permanently. +const reportLookbackDays = 2 + +// dailyMetricsTrailingBackfillDays extends retries for delayed daily report generation. +const dailyMetricsTrailingBackfillDays = 4 + // copilotRawParams identifies a set of raw data records for a given connection/scope. type copilotRawParams struct { ConnectionId uint64 @@ -60,6 +68,14 @@ func ignore404(res *http.Response) errors.Error { return nil } +func clampDailyMetricsStartForBackfill(start, until time.Time) time.Time { + trailingStart := until.AddDate(0, 0, -(dailyMetricsTrailingBackfillDays - 1)) + if start.After(trailingStart) { + return trailingStart + } + return start +} + // reportMetadataResponse represents the JSON returned by the report metadata endpoints. type reportMetadataResponse struct { DownloadLinks []string `json:"download_links"` @@ -69,7 +85,120 @@ type reportMetadataResponse struct { ReportEndDay string `json:"report_end_day"` } +func readReportMetadataBody(res *http.Response) ([]byte, errors.Error) { + body, readErr := io.ReadAll(res.Body) + res.Body.Close() + if readErr != nil { + return nil, errors.Default.Wrap(readErr, "failed to read report metadata") + } + return body, nil +} + +func logReportMetadataParseError(body []byte, err error, logger log.Logger) { + if logger == nil { + return + } + snippet := string(body) + if len(snippet) > 200 { + snippet = snippet[:200] + } + logger.Error(err, "failed to parse report metadata, body=%s", snippet) +} + +func reportMetadataRange(meta reportMetadataResponse) string { + if meta.ReportDay != "" { + return meta.ReportDay + } + if meta.ReportStartDay != "" && meta.ReportEndDay != "" { + return fmt.Sprintf("%s..%s", meta.ReportStartDay, meta.ReportEndDay) + } + return "" +} + +func logMissingDownloadLinks(meta reportMetadataResponse, logger log.Logger) { + if logger == nil || len(meta.DownloadLinks) != 0 { + return + } + reportRange := reportMetadataRange(meta) + if reportRange != "" { + logger.Info("No download links for report day=%s, skipping", reportRange) + return + } + logger.Info("No download links in report metadata, skipping") +} + +func parseReportMetadata(body []byte, logger log.Logger) (*reportMetadataResponse, errors.Error) { + trimmed := bytes.TrimSpace(body) + if len(trimmed) == 0 { + if logger != nil { + logger.Info("Report metadata response was empty, skipping") + } + return nil, nil + } + + // Handle JSON-encoded empty string "" + if bytes.Equal(trimmed, []byte(`""`)) { + if logger != nil { + logger.Info("Report metadata response was empty string, skipping") + } + return nil, nil + } + + var meta reportMetadataResponse + if jsonErr := json.Unmarshal(trimmed, &meta); jsonErr != nil { + logReportMetadataParseError(trimmed, jsonErr, logger) + return nil, errors.Default.Wrap(jsonErr, "failed to parse report metadata") + } + + logMissingDownloadLinks(meta, logger) + + return &meta, nil +} + +func parseReportMetadataResponse(res *http.Response, logger log.Logger) (*reportMetadataResponse, errors.Error) { + if res.StatusCode == http.StatusNoContent { + if logger != nil { + logger.Info("Report metadata not ready yet (204), skipping for now") + } + res.Body.Close() + return nil, nil + } + + body, readErr := readReportMetadataBody(res) + if readErr != nil { + return nil, readErr + } + + return parseReportMetadata(body, logger) +} + +func collectRawReportRecords(downloadLinks []string, logger log.Logger) ([]json.RawMessage, errors.Error) { + var results []json.RawMessage + for _, link := range downloadLinks { + reportBody, dlErr := downloadReport(link, logger) + if dlErr != nil { + return nil, dlErr + } + if reportBody == nil { + continue + } + results = append(results, json.RawMessage(reportBody)) + } + return results, nil +} + +func parseRawReportResponse(res *http.Response, logger log.Logger) ([]json.RawMessage, errors.Error) { + meta, err := parseReportMetadataResponse(res, logger) + if err != nil || meta == nil { + return nil, err + } + + return collectRawReportRecords(meta.DownloadLinks, logger) +} + // computeReportDateRange returns the range of dates to collect, clamped to the API max. +// When 'since' is set, 'start' is rewound to at least 'until - reportLookbackDays' +// so days that returned 404 (report not yet generated) are retried on subsequent runs. func computeReportDateRange(now time.Time, since *time.Time) (start, until time.Time) { until = utcDate(now).AddDate(0, 0, -1) // reports are available for the previous day min := until.AddDate(0, 0, -(reportMaxDays - 1)) @@ -82,6 +211,10 @@ func computeReportDateRange(now time.Time, since *time.Time) (start, until time. if start.After(until) { start = until } + // Rewind 'start' by 'reportLookbackDays' so recently-missed days are retried. + if lookback := until.AddDate(0, 0, -reportLookbackDays); start.After(lookback) { + start = lookback + } } return start, until } diff --git a/backend/plugins/gh-copilot/tasks/user_metrics_collector.go b/backend/plugins/gh-copilot/tasks/user_metrics_collector.go index 526c13bf34b..91df9d79aab 100644 --- a/backend/plugins/gh-copilot/tasks/user_metrics_collector.go +++ b/backend/plugins/gh-copilot/tasks/user_metrics_collector.go @@ -20,18 +20,47 @@ package tasks import ( "encoding/json" "fmt" - "io" "net/http" "net/url" "time" "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/log" "github.com/apache/incubator-devlake/core/plugin" helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" ) const rawUserMetricsTable = "copilot_user_metrics" +func collectUserMetricsRecords(downloadLinks []string, logger log.Logger) ([]json.RawMessage, errors.Error) { + var results []json.RawMessage + for _, link := range downloadLinks { + reportBody, dlErr := downloadReport(link, logger) + if dlErr != nil { + return nil, dlErr + } + if reportBody == nil { + continue // blob not found, skip + } + // Parse JSONL: split by newlines and return each non-empty line. + userRecords, parseErr := parseJSONL(reportBody) + if parseErr != nil { + return nil, parseErr + } + results = append(results, userRecords...) + } + return results, nil +} + +func parseUserMetricsReportResponse(res *http.Response, logger log.Logger) ([]json.RawMessage, errors.Error) { + meta, err := parseReportMetadataResponse(res, logger) + if err != nil || meta == nil { + return nil, err + } + + return collectUserMetricsRecords(meta.DownloadLinks, logger) +} + // CollectUserMetrics collects enterprise user-level daily Copilot usage reports. // These reports are in JSONL format (one JSON object per line per user). // Only available for enterprise-scoped connections. @@ -71,6 +100,7 @@ func CollectUserMetrics(taskCtx plugin.SubTaskContext) errors.Error { now := time.Now().UTC() start, until := computeReportDateRange(now, collector.GetSince()) + start = clampDailyMetricsStartForBackfill(start, until) logger := taskCtx.GetLogger() dayIter := newDayIterator(start, until) @@ -90,37 +120,7 @@ func CollectUserMetrics(taskCtx plugin.SubTaskContext) errors.Error { Concurrency: 1, AfterResponse: ignore404, ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { - body, readErr := io.ReadAll(res.Body) - res.Body.Close() - if readErr != nil { - return nil, errors.Default.Wrap(readErr, "failed to read report metadata") - } - - var meta reportMetadataResponse - if jsonErr := json.Unmarshal(body, &meta); jsonErr != nil { - return nil, errors.Default.Wrap(jsonErr, "failed to parse report metadata") - } - - // User reports are JSONL — each download link returns one file where - // each line is a separate JSON object for one user's daily metrics. - // We download the file and split into individual JSON messages. - var results []json.RawMessage - for _, link := range meta.DownloadLinks { - reportBody, dlErr := downloadReport(link, logger) - if dlErr != nil { - return nil, dlErr - } - if reportBody == nil { - continue // blob not found, skip - } - // Parse JSONL: split by newlines and return each non-empty line - userRecords, parseErr := parseJSONL(reportBody) - if parseErr != nil { - return nil, parseErr - } - results = append(results, userRecords...) - } - return results, nil + return parseUserMetricsReportResponse(res, logger) }, }) if err != nil { From 2fea811f2c302dcf09386a36baf8cabff8cb9d4b Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sat, 28 Feb 2026 19:32:43 +0800 Subject: [PATCH 02/38] fix(q_dev): prevent data duplication in user_report and user_data tables (#8737) * fix(q_dev): prevent data duplication in user_report and user_data tables Replace auto-increment ID with composite primary keys so that CreateOrUpdate can properly deduplicate rows on re-extraction. - user_report PK: (connection_id, scope_id, user_id, date, client_type) - user_data PK: (connection_id, scope_id, user_id, date) - Switch db.Create() to db.CreateOrUpdate() in s3_data_extractor - Migration drops old tables, rebuilds with new PKs, resets s3_file_meta processed flag to trigger re-extraction * fix(q_dev): gofmt archived user_data_v2 model --- .../20260228_fix_dedup_user_tables.go | 60 ++++++++++++++ .../20260228_reset_s3_file_meta_processed.go | 51 ++++++++++++ .../migrationscripts/archived/user_data_v2.go | 81 +++++++++++++++++++ .../archived/user_report_v2.go | 46 +++++++++++ .../q_dev/models/migrationscripts/register.go | 2 + backend/plugins/q_dev/models/user_data.go | 10 +-- backend/plugins/q_dev/models/user_report.go | 10 +-- .../plugins/q_dev/tasks/s3_data_extractor.go | 5 +- 8 files changed, 252 insertions(+), 13 deletions(-) create mode 100644 backend/plugins/q_dev/models/migrationscripts/20260228_fix_dedup_user_tables.go create mode 100644 backend/plugins/q_dev/models/migrationscripts/20260228_reset_s3_file_meta_processed.go create mode 100644 backend/plugins/q_dev/models/migrationscripts/archived/user_data_v2.go create mode 100644 backend/plugins/q_dev/models/migrationscripts/archived/user_report_v2.go diff --git a/backend/plugins/q_dev/models/migrationscripts/20260228_fix_dedup_user_tables.go b/backend/plugins/q_dev/models/migrationscripts/20260228_fix_dedup_user_tables.go new file mode 100644 index 00000000000..94b7666a9a5 --- /dev/null +++ b/backend/plugins/q_dev/models/migrationscripts/20260228_fix_dedup_user_tables.go @@ -0,0 +1,60 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/helpers/migrationhelper" + "github.com/apache/incubator-devlake/plugins/q_dev/models/migrationscripts/archived" +) + +type fixDedupUserTables struct{} + +func (*fixDedupUserTables) Up(basicRes context.BasicRes) errors.Error { + db := basicRes.GetDal() + + // Drop old tables that used auto-increment ID (which caused data duplication) + err := db.DropTables( + "_tool_q_dev_user_report", + "_tool_q_dev_user_data", + ) + if err != nil { + return errors.Default.Wrap(err, "failed to drop old user tables") + } + + // Recreate tables with composite primary keys for proper deduplication + err = migrationhelper.AutoMigrateTables( + basicRes, + &archived.QDevUserReportV2{}, + &archived.QDevUserDataV2{}, + ) + if err != nil { + return errors.Default.Wrap(err, "failed to recreate user tables") + } + + return nil +} + +func (*fixDedupUserTables) Version() uint64 { + return 20260228000001 +} + +func (*fixDedupUserTables) Name() string { + return "Rebuild user_report and user_data tables with composite primary keys to fix data duplication" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/20260228_reset_s3_file_meta_processed.go b/backend/plugins/q_dev/models/migrationscripts/20260228_reset_s3_file_meta_processed.go new file mode 100644 index 00000000000..7d0b8ba1f4f --- /dev/null +++ b/backend/plugins/q_dev/models/migrationscripts/20260228_reset_s3_file_meta_processed.go @@ -0,0 +1,51 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" +) + +type resetS3FileMetaProcessed struct{} + +func (*resetS3FileMetaProcessed) Up(basicRes context.BasicRes) errors.Error { + db := basicRes.GetDal() + + // Reset processed flag so data will be re-extracted with the new + // dedup-safe composite-PK schema on next pipeline run + err := db.UpdateColumn( + "_tool_q_dev_s3_file_meta", + "processed", false, + dal.Where("1 = 1"), + ) + if err != nil { + return errors.Default.Wrap(err, "failed to reset s3_file_meta processed flag") + } + + return nil +} + +func (*resetS3FileMetaProcessed) Version() uint64 { + return 20260228000002 +} + +func (*resetS3FileMetaProcessed) Name() string { + return "Reset s3_file_meta processed flag to re-extract data with dedup-safe schema" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/archived/user_data_v2.go b/backend/plugins/q_dev/models/migrationscripts/archived/user_data_v2.go new file mode 100644 index 00000000000..8d5db8496a3 --- /dev/null +++ b/backend/plugins/q_dev/models/migrationscripts/archived/user_data_v2.go @@ -0,0 +1,81 @@ +/* +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 archived + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/migrationscripts/archived" +) + +type QDevUserDataV2 struct { + archived.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + UserId string `gorm:"primaryKey;type:varchar(255)" json:"userId"` + Date time.Time `gorm:"primaryKey;type:date" json:"date"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` + CodeReview_FindingsCount int + CodeReview_SucceededEventCount int + InlineChat_AcceptanceEventCount int + InlineChat_AcceptedLineAdditions int + InlineChat_AcceptedLineDeletions int + InlineChat_DismissalEventCount int + InlineChat_DismissedLineAdditions int + InlineChat_DismissedLineDeletions int + InlineChat_RejectedLineAdditions int + InlineChat_RejectedLineDeletions int + InlineChat_RejectionEventCount int + InlineChat_TotalEventCount int + Inline_AICodeLines int + Inline_AcceptanceCount int + Inline_SuggestionsCount int + Chat_AICodeLines int + Chat_MessagesInteracted int + Chat_MessagesSent int + CodeFix_AcceptanceEventCount int + CodeFix_AcceptedLines int + CodeFix_GeneratedLines int + CodeFix_GenerationEventCount int + CodeReview_FailedEventCount int + Dev_AcceptanceEventCount int + Dev_AcceptedLines int + Dev_GeneratedLines int + Dev_GenerationEventCount int + DocGeneration_AcceptedFileUpdates int + DocGeneration_AcceptedFilesCreations int + DocGeneration_AcceptedLineAdditions int + DocGeneration_AcceptedLineUpdates int + DocGeneration_EventCount int + DocGeneration_RejectedFileCreations int + DocGeneration_RejectedFileUpdates int + DocGeneration_RejectedLineAdditions int + DocGeneration_RejectedLineUpdates int + TestGeneration_AcceptedLines int + TestGeneration_AcceptedTests int + TestGeneration_EventCount int + TestGeneration_GeneratedLines int + TestGeneration_GeneratedTests int + Transformation_EventCount int + Transformation_LinesGenerated int + Transformation_LinesIngested int +} + +func (QDevUserDataV2) TableName() string { + return "_tool_q_dev_user_data" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/archived/user_report_v2.go b/backend/plugins/q_dev/models/migrationscripts/archived/user_report_v2.go new file mode 100644 index 00000000000..7045874851c --- /dev/null +++ b/backend/plugins/q_dev/models/migrationscripts/archived/user_report_v2.go @@ -0,0 +1,46 @@ +/* +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 archived + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/migrationscripts/archived" +) + +type QDevUserReportV2 struct { + archived.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + UserId string `gorm:"primaryKey;type:varchar(255)" json:"userId"` + Date time.Time `gorm:"primaryKey;type:date" json:"date"` + ClientType string `gorm:"primaryKey;type:varchar(50)" json:"clientType"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` + SubscriptionTier string `gorm:"type:varchar(50)" json:"subscriptionTier"` + ProfileId string `gorm:"type:varchar(512)" json:"profileId"` + ChatConversations int `json:"chatConversations"` + CreditsUsed float64 `json:"creditsUsed"` + OverageCap float64 `json:"overageCap"` + OverageCreditsUsed float64 `json:"overageCreditsUsed"` + OverageEnabled bool `json:"overageEnabled"` + TotalMessages int `json:"totalMessages"` +} + +func (QDevUserReportV2) TableName() string { + return "_tool_q_dev_user_report" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/register.go b/backend/plugins/q_dev/models/migrationscripts/register.go index 825ab5658a7..9c68ae8f815 100644 --- a/backend/plugins/q_dev/models/migrationscripts/register.go +++ b/backend/plugins/q_dev/models/migrationscripts/register.go @@ -33,5 +33,7 @@ func All() []plugin.MigrationScript { new(addScopeIdFields), new(addUserReportTable), new(addAccountIdToS3Slice), + new(fixDedupUserTables), + new(resetS3FileMetaProcessed), } } diff --git a/backend/plugins/q_dev/models/user_data.go b/backend/plugins/q_dev/models/user_data.go index a668db78bdd..3d59f965ade 100644 --- a/backend/plugins/q_dev/models/user_data.go +++ b/backend/plugins/q_dev/models/user_data.go @@ -25,12 +25,12 @@ import ( // QDevUserData 存储从CSV中提取的原始数据 type QDevUserData struct { - common.Model + common.NoPKModel ConnectionId uint64 `gorm:"primaryKey"` - UserId string `gorm:"index" json:"userId"` - Date time.Time `gorm:"index" json:"date"` - DisplayName string `gorm:"type:varchar(255)" json:"displayName"` // New field for user display name - ScopeId string `gorm:"index;type:varchar(255)" json:"scopeId"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + UserId string `gorm:"primaryKey;type:varchar(255)" json:"userId"` + Date time.Time `gorm:"primaryKey;type:date" json:"date"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` CodeReview_FindingsCount int CodeReview_SucceededEventCount int diff --git a/backend/plugins/q_dev/models/user_report.go b/backend/plugins/q_dev/models/user_report.go index f64090e8980..17c4ac07daa 100644 --- a/backend/plugins/q_dev/models/user_report.go +++ b/backend/plugins/q_dev/models/user_report.go @@ -24,13 +24,13 @@ import ( ) type QDevUserReport struct { - common.Model + common.NoPKModel ConnectionId uint64 `gorm:"primaryKey"` - UserId string `gorm:"index" json:"userId"` - Date time.Time `gorm:"index" json:"date"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + UserId string `gorm:"primaryKey;type:varchar(255)" json:"userId"` + Date time.Time `gorm:"primaryKey;type:date" json:"date"` + ClientType string `gorm:"primaryKey;type:varchar(50)" json:"clientType"` DisplayName string `gorm:"type:varchar(255)" json:"displayName"` - ScopeId string `gorm:"index;type:varchar(255)" json:"scopeId"` - ClientType string `gorm:"type:varchar(50)" json:"clientType"` SubscriptionTier string `gorm:"type:varchar(50)" json:"subscriptionTier"` ProfileId string `gorm:"type:varchar(512)" json:"profileId"` ChatConversations int `json:"chatConversations"` diff --git a/backend/plugins/q_dev/tasks/s3_data_extractor.go b/backend/plugins/q_dev/tasks/s3_data_extractor.go index 919c4dbe60a..1cf2a9f2ef5 100644 --- a/backend/plugins/q_dev/tasks/s3_data_extractor.go +++ b/backend/plugins/q_dev/tasks/s3_data_extractor.go @@ -147,7 +147,7 @@ func processCSVData(taskCtx plugin.SubTaskContext, db dal.Dal, reader io.ReadClo if err != nil { return errors.Default.Wrap(err, "failed to create user report data") } - err = db.Create(reportData) + err = db.CreateOrUpdate(reportData) if err != nil { return errors.Default.Wrap(err, "failed to save user report data") } @@ -158,8 +158,7 @@ func processCSVData(taskCtx plugin.SubTaskContext, db dal.Dal, reader io.ReadClo return errors.Default.Wrap(err, "failed to create user data") } - // Save to database - no need to check for duplicates since we're processing each file only once - err = db.Create(userData) + err = db.CreateOrUpdate(userData) if err != nil { return errors.Default.Wrap(err, "failed to save user data") } From 0856e29999b3184291aedae50f639b0ec4de8d80 Mon Sep 17 00:00:00 2001 From: Ema Abitante Date: Mon, 2 Mar 2026 13:33:59 +0100 Subject: [PATCH 03/38] feat(github): Extend exclusion of file extensions to github plugin (#8719) * feat(github): extend PR size exclusion for specified file extension to github plugin * fix: register migration script * fix: move PR size to 'Additional settings' and change so the comma doesn't get removed while typing * fix: linting --- backend/plugins/github/api/blueprint_v200.go | 15 +++--- ...0260216_add_pr_size_excluded_extensions.go | 50 +++++++++++++++++++ .../models/migrationscripts/register.go | 1 + backend/plugins/github/models/scope_config.go | 29 +++++------ .../src/plugins/register/github/config.tsx | 1 + .../register/github/transformation.tsx | 33 ++++++++++++ 6 files changed, 108 insertions(+), 21 deletions(-) create mode 100644 backend/plugins/github/models/migrationscripts/20260216_add_pr_size_excluded_extensions.go diff --git a/backend/plugins/github/api/blueprint_v200.go b/backend/plugins/github/api/blueprint_v200.go index 708a941b689..6515f24b72c 100644 --- a/backend/plugins/github/api/blueprint_v200.go +++ b/backend/plugins/github/api/blueprint_v200.go @@ -128,13 +128,14 @@ func makeDataSourcePipelinePlanV200( stage = append(stage, &coreModels.PipelineTask{ Plugin: "gitextractor", Options: map[string]interface{}{ - "url": cloneUrl.String(), - "name": githubRepo.FullName, - "fullName": githubRepo.FullName, - "repoId": didgen.NewDomainIdGenerator(&models.GithubRepo{}).Generate(connection.ID, githubRepo.GithubId), - "proxy": connection.Proxy, - "connectionId": githubRepo.ConnectionId, - "pluginName": "github", + "url": cloneUrl.String(), + "name": githubRepo.FullName, + "fullName": githubRepo.FullName, + "repoId": didgen.NewDomainIdGenerator(&models.GithubRepo{}).Generate(connection.ID, githubRepo.GithubId), + "proxy": connection.Proxy, + "connectionId": githubRepo.ConnectionId, + "pluginName": "github", + "excludeFileExtensions": scopeConfig.PrSizeExcludedFileExtensions, }, }) diff --git a/backend/plugins/github/models/migrationscripts/20260216_add_pr_size_excluded_extensions.go b/backend/plugins/github/models/migrationscripts/20260216_add_pr_size_excluded_extensions.go new file mode 100644 index 00000000000..cfc4337c528 --- /dev/null +++ b/backend/plugins/github/models/migrationscripts/20260216_add_pr_size_excluded_extensions.go @@ -0,0 +1,50 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/migrationhelper" +) + +var _ plugin.MigrationScript = (*addPrSizeExcludedFileExtensions)(nil) + +type githubScopeConfig20260216 struct { + PrSizeExcludedFileExtensions []string `gorm:"type:json" json:"prSizeExcludedFileExtensions" mapstructure:"prSizeExcludedFileExtensions"` +} + +func (githubScopeConfig20260216) TableName() string { + return "_tool_github_scope_configs" +} + +type addPrSizeExcludedFileExtensions struct{} + +func (script *addPrSizeExcludedFileExtensions) Up(basicRes context.BasicRes) errors.Error { + return migrationhelper.AutoMigrateTables( + basicRes, + &githubScopeConfig20260216{}, + ) +} + +func (*addPrSizeExcludedFileExtensions) Version() uint64 { return 20260216100000 } + +func (*addPrSizeExcludedFileExtensions) Name() string { + return "add pr_size_excluded_file_extensions to _tool_github_scope_configs" +} diff --git a/backend/plugins/github/models/migrationscripts/register.go b/backend/plugins/github/models/migrationscripts/register.go index 0094972890e..65f538f31c1 100644 --- a/backend/plugins/github/models/migrationscripts/register.go +++ b/backend/plugins/github/models/migrationscripts/register.go @@ -57,5 +57,6 @@ func All() []plugin.MigrationScript { new(addIndexToGithubJobs), new(addRefreshTokenFields), new(modifyTokenExpiresAtToNullable), + new(addPrSizeExcludedFileExtensions), } } diff --git a/backend/plugins/github/models/scope_config.go b/backend/plugins/github/models/scope_config.go index 60b298d363c..a19f33db6f3 100644 --- a/backend/plugins/github/models/scope_config.go +++ b/backend/plugins/github/models/scope_config.go @@ -26,20 +26,21 @@ import ( var _ plugin.ToolLayerScopeConfig = (*GithubScopeConfig)(nil) type GithubScopeConfig struct { - common.ScopeConfig `mapstructure:",squash" json:",inline" gorm:"embedded"` - PrType string `mapstructure:"prType,omitempty" json:"prType" gorm:"type:varchar(255)"` - PrComponent string `mapstructure:"prComponent,omitempty" json:"prComponent" gorm:"type:varchar(255)"` - PrBodyClosePattern string `mapstructure:"prBodyClosePattern,omitempty" json:"prBodyClosePattern" gorm:"type:varchar(255)"` - IssueSeverity string `mapstructure:"issueSeverity,omitempty" json:"issueSeverity" gorm:"type:varchar(255)"` - IssuePriority string `mapstructure:"issuePriority,omitempty" json:"issuePriority" gorm:"type:varchar(255)"` - IssueComponent string `mapstructure:"issueComponent,omitempty" json:"issueComponent" gorm:"type:varchar(255)"` - IssueTypeBug string `mapstructure:"issueTypeBug,omitempty" json:"issueTypeBug" gorm:"type:varchar(255)"` - IssueTypeIncident string `mapstructure:"issueTypeIncident,omitempty" json:"issueTypeIncident" gorm:"type:varchar(255)"` - IssueTypeRequirement string `mapstructure:"issueTypeRequirement,omitempty" json:"issueTypeRequirement" gorm:"type:varchar(255)"` - DeploymentPattern string `mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern" gorm:"type:varchar(255)"` - ProductionPattern string `mapstructure:"productionPattern,omitempty" json:"productionPattern" gorm:"type:varchar(255)"` - EnvNamePattern string `mapstructure:"envNamePattern,omitempty" json:"envNamePattern" gorm:"type:varchar(255)"` - Refdiff datatypes.JSONMap `mapstructure:"refdiff,omitempty" json:"refdiff" swaggertype:"object" format:"json"` + common.ScopeConfig `mapstructure:",squash" json:",inline" gorm:"embedded"` + PrType string `mapstructure:"prType,omitempty" json:"prType" gorm:"type:varchar(255)"` + PrComponent string `mapstructure:"prComponent,omitempty" json:"prComponent" gorm:"type:varchar(255)"` + PrBodyClosePattern string `mapstructure:"prBodyClosePattern,omitempty" json:"prBodyClosePattern" gorm:"type:varchar(255)"` + IssueSeverity string `mapstructure:"issueSeverity,omitempty" json:"issueSeverity" gorm:"type:varchar(255)"` + IssuePriority string `mapstructure:"issuePriority,omitempty" json:"issuePriority" gorm:"type:varchar(255)"` + IssueComponent string `mapstructure:"issueComponent,omitempty" json:"issueComponent" gorm:"type:varchar(255)"` + IssueTypeBug string `mapstructure:"issueTypeBug,omitempty" json:"issueTypeBug" gorm:"type:varchar(255)"` + IssueTypeIncident string `mapstructure:"issueTypeIncident,omitempty" json:"issueTypeIncident" gorm:"type:varchar(255)"` + IssueTypeRequirement string `mapstructure:"issueTypeRequirement,omitempty" json:"issueTypeRequirement" gorm:"type:varchar(255)"` + DeploymentPattern string `mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern" gorm:"type:varchar(255)"` + ProductionPattern string `mapstructure:"productionPattern,omitempty" json:"productionPattern" gorm:"type:varchar(255)"` + EnvNamePattern string `mapstructure:"envNamePattern,omitempty" json:"envNamePattern" gorm:"type:varchar(255)"` + Refdiff datatypes.JSONMap `mapstructure:"refdiff,omitempty" json:"refdiff" swaggertype:"object" format:"json"` + PrSizeExcludedFileExtensions []string `mapstructure:"prSizeExcludedFileExtensions" json:"prSizeExcludedFileExtensions" gorm:"type:json;serializer:json"` } // GetConnectionId implements plugin.ToolLayerScopeConfig. diff --git a/config-ui/src/plugins/register/github/config.tsx b/config-ui/src/plugins/register/github/config.tsx index 9a372f98471..587f00cb9ea 100644 --- a/config-ui/src/plugins/register/github/config.tsx +++ b/config-ui/src/plugins/register/github/config.tsx @@ -117,6 +117,7 @@ export const GitHubConfig: IPluginConfig = { tagsLimit: 10, tagsPattern: '/v\\d+\\.\\d+(\\.\\d+(-rc)*\\d*)*$/', }, + prSizeExcludedFileExtensions: [], }, }, }; diff --git a/config-ui/src/plugins/register/github/transformation.tsx b/config-ui/src/plugins/register/github/transformation.tsx index 0d6473c4d8a..ef9d4d7473f 100644 --- a/config-ui/src/plugins/register/github/transformation.tsx +++ b/config-ui/src/plugins/register/github/transformation.tsx @@ -442,6 +442,39 @@ const renderCollapseItems = ({ /> for calculation +

+ PR Size Exclusions +

+
+ Exclude file extensions (comma-separated, e.g. .md,.txt,.json) + { + // Don't filter during onChange to allow typing commas freely + const extensions = e.target.value + .split(',') + .map((s: string) => s.trim()); + onChangeTransformation({ + ...transformation, + prSizeExcludedFileExtensions: extensions, + }); + }} + onBlur={(e) => { + // Clean up empty entries when user leaves the field + const extensions = e.target.value + .split(',') + .map((s: string) => s.trim()) + .filter((s: string) => s.length > 0); + onChangeTransformation({ + ...transformation, + prSizeExcludedFileExtensions: extensions, + }); + }} + /> + +
), }, From 646251c06e3829a3b95d2dbfee9a0947b0b63929 Mon Sep 17 00:00:00 2001 From: Spiff Azeta <35563797+spiffaz@users.noreply.github.com> Date: Mon, 2 Mar 2026 14:00:54 +0100 Subject: [PATCH 04/38] fix(doc): update expired Slack invite links in README (#8739) The Slack invite links in README.md were expired and returning "This link is no longer active." Updated both occurrences (badge and community section) to match the current link on the official DevLake website. Closes #8738 Co-authored-by: Spiff Azeta --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c31c0ffd3db..ce0a23215e0 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ limitations under the License. [![Dockerhub pulls](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fhub.docker.com%2Fv2%2Frepositories%2Fapache%2Fdevlake&query=%24.pull_count&label=Dockerhub%20pulls)](https://hub.docker.com/r/apache/devlake) [![unit-test](https://github.com/apache/incubator-devlake/actions/workflows/test.yml/badge.svg)](https://github.com/apache/incubator-devlake/actions/workflows/test.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/apache/incubator-devlake)](https://goreportcard.com/report/github.com/apache/incubator-devlake) -[![Slack](https://img.shields.io/badge/slack-join_chat-success.svg?logo=slack)](https://join.slack.com/t/devlake-io/shared_invite/zt-18uayb6ut-cHOjiYcBwERQ8VVPZ9cQQw) +[![Slack](https://img.shields.io/badge/slack-join_chat-success.svg?logo=slack)](https://join.slack.com/t/devlake-io/shared_invite/zt-1lkgbdmys-AU2azidzO1u~mtjlg9my7A) [![Twitter](https://badgen.net/badge/icon/twitter?icon=twitter&label)](https://twitter.com/ApacheDevLake) @@ -121,7 +121,7 @@ One of the best ways to get started contributing is by improving DevLake's docum ## 💙 Community -Message us on Slack +Message us on Slack ## 📄 License From 499c68d5a7c14e5f16ea3084d804ea1feb63c9a5 Mon Sep 17 00:00:00 2001 From: Eldrick Wega Date: Mon, 2 Mar 2026 16:10:22 +0300 Subject: [PATCH 05/38] docs: add gh-devlake CLI to Getting Started installation options (#8733) Adds gh-devlake as a third installation method alongside Docker Compose and Helm. gh-devlake is a GitHub CLI extension that automates DevLake deployment, configuration, and monitoring from the terminal. Closes #8732 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ce0a23215e0..185ebe2a299 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ You can set up Apache DevLake by following our step-by-step instructions for eit - [Install via Docker Compose](https://devlake.apache.org/docs/GettingStarted/DockerComposeSetup) - [Install via Helm](https://devlake.apache.org/docs/GettingStarted/HelmSetup) +- [Install via gh-devlake CLI](https://github.com/DevExpGBB/gh-devlake) — A GitHub CLI extension that deploys, configures, and monitors DevLake entirely from the terminal. Supports local Docker and Azure deployments. ## 🤓 Usage From 8140074178b58195e7b1e5670161f9d626ed10d6 Mon Sep 17 00:00:00 2001 From: Spiff Azeta <35563797+spiffaz@users.noreply.github.com> Date: Mon, 2 Mar 2026 14:11:40 +0100 Subject: [PATCH 06/38] fix(gitlab): add missing repos scope in project_mapping (#8743) GitLab's makeScopeV200 did not create a repos scope when scopeConfig.Entities was empty or only contained CROSS. This caused project_mapping to have no table='repos' row, breaking downstream DORA metrics, PR-issue linking, and all PR dashboard panels that join on project_mapping. The fix aligns GitLab with the GitHub plugin by: 1. Defaulting empty entities to plugin.DOMAIN_TYPES 2. Adding DOMAIN_TYPE_CROSS to the repo scope condition Closes #8742 Co-authored-by: Spiff Azeta --- .../plugins/gitlab/api/blueprint_V200_test.go | 64 +++++++++++++++++++ backend/plugins/gitlab/api/blueprint_v200.go | 8 ++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/backend/plugins/gitlab/api/blueprint_V200_test.go b/backend/plugins/gitlab/api/blueprint_V200_test.go index 34f1175de9b..fde792ffd86 100644 --- a/backend/plugins/gitlab/api/blueprint_V200_test.go +++ b/backend/plugins/gitlab/api/blueprint_V200_test.go @@ -72,6 +72,70 @@ func TestMakeScopes(t *testing.T) { assert.Equal(t, actualScopes[2].ScopeId(), expectDomainScopeId) } +func TestMakeScopesWithEmptyEntities(t *testing.T) { + mockGitlabPlugin(t) + + const connectionId = 1 + const gitlabProjectId = 37 + const expectDomainScopeId = "gitlab:GitlabProject:1:37" + + actualScopes, err := makeScopeV200( + connectionId, + []*srvhelper.ScopeDetail[models.GitlabProject, models.GitlabScopeConfig]{ + { + Scope: models.GitlabProject{ + Scope: common.Scope{ + ConnectionId: connectionId, + }, + GitlabId: gitlabProjectId, + }, + ScopeConfig: &models.GitlabScopeConfig{ + ScopeConfig: common.ScopeConfig{ + Entities: []string{}, + }, + }, + }, + }, + ) + assert.Nil(t, err) + // empty entities should default to all domain types, producing repo + cicd + board scopes + assert.Equal(t, 3, len(actualScopes)) + assert.Equal(t, actualScopes[0].ScopeId(), expectDomainScopeId) +} + +func TestMakeScopesWithCrossEntity(t *testing.T) { + mockGitlabPlugin(t) + + const connectionId = 1 + const gitlabProjectId = 37 + const expectDomainScopeId = "gitlab:GitlabProject:1:37" + + actualScopes, err := makeScopeV200( + connectionId, + []*srvhelper.ScopeDetail[models.GitlabProject, models.GitlabScopeConfig]{ + { + Scope: models.GitlabProject{ + Scope: common.Scope{ + ConnectionId: connectionId, + }, + GitlabId: gitlabProjectId, + }, + ScopeConfig: &models.GitlabScopeConfig{ + ScopeConfig: common.ScopeConfig{ + Entities: []string{plugin.DOMAIN_TYPE_CROSS, plugin.DOMAIN_TYPE_TICKET}, + }, + }, + }, + }, + ) + assert.Nil(t, err) + // CROSS entity should trigger repo scope creation, plus ticket = board scope + assert.Equal(t, 2, len(actualScopes)) + assert.Equal(t, actualScopes[0].ScopeId(), expectDomainScopeId) + assert.Equal(t, "repos", actualScopes[0].TableName()) + assert.Equal(t, "boards", actualScopes[1].TableName()) +} + func TestMakeDataSourcePipelinePlanV200(t *testing.T) { mockGitlabPlugin(t) diff --git a/backend/plugins/gitlab/api/blueprint_v200.go b/backend/plugins/gitlab/api/blueprint_v200.go index dbe14905df1..515e8967f22 100644 --- a/backend/plugins/gitlab/api/blueprint_v200.go +++ b/backend/plugins/gitlab/api/blueprint_v200.go @@ -78,8 +78,14 @@ func makeScopeV200( gitlabProject, scopeConfig := scope.Scope, scope.ScopeConfig id := didgen.NewDomainIdGenerator(&models.GitlabProject{}).Generate(connectionId, gitlabProject.GitlabId) + // if no entities specified, use all entities enabled by default + if len(scopeConfig.Entities) == 0 { + scopeConfig.Entities = plugin.DOMAIN_TYPES + } + if utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CODE_REVIEW) || - utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CODE) { + utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CODE) || + utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CROSS) { // if we don't need to collect gitex, we need to add repo to scopes here scopeRepo := code.NewRepo(id, gitlabProject.PathWithNamespace) From 6b21b2adca74dff5a7a468db3b1e577e4d445830 Mon Sep 17 00:00:00 2001 From: Spiff Azeta <35563797+spiffaz@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:00:45 +0100 Subject: [PATCH 07/38] fix(grafana): update dashboard descriptions to list all supported data sources (#8741) Several dashboard introduction panels hardcoded "GitHub and Jira" as required data sources, even though the underlying queries use generic domain layer tables that work with any supported Git tool or issue tracker. Updated to list all supported sources following the pattern already used by DORA and WorkLogs dashboards. Closes #8740 Co-authored-by: Spiff Azeta --- grafana/dashboards/EngineeringOverview.json | 2 +- grafana/dashboards/EngineeringThroughputAndCycleTime.json | 2 +- .../dashboards/EngineeringThroughputAndCycleTimeTeamView.json | 2 +- grafana/dashboards/WeeklyBugRetro.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/grafana/dashboards/EngineeringOverview.json b/grafana/dashboards/EngineeringOverview.json index e2e6cdede52..00ca588768e 100644 --- a/grafana/dashboards/EngineeringOverview.json +++ b/grafana/dashboards/EngineeringOverview.json @@ -40,7 +40,7 @@ "showLineNumbers": false, "showMiniMap": false }, - "content": "- Use Cases: This dashboard is to overview the Git and project management metrics.\n- Data Source Required: Jira + GitHub, or Jira + GitLab.", + "content": "- Use Cases: This dashboard is to overview the Git and project management metrics.\n- Data Sources Required:\n - One of the Git tools, e.g. [GitHub](https://devlake.apache.org/docs/Configuration/GitHub), [GitLab](https://devlake.apache.org/docs/Configuration/GitLab), [Bitbucket](https://devlake.apache.org/docs/Configuration/BitBucket) or [Azure DevOps](https://devlake.apache.org/docs/Configuration/AzureDevOps)\n - One of the issue tracking tools, e.g. [Jira](https://devlake.apache.org/docs/Configuration/Jira)", "mode": "markdown" }, "pluginVersion": "11.0.0", diff --git a/grafana/dashboards/EngineeringThroughputAndCycleTime.json b/grafana/dashboards/EngineeringThroughputAndCycleTime.json index a9f1c9e48b3..6d3b5ecc72d 100644 --- a/grafana/dashboards/EngineeringThroughputAndCycleTime.json +++ b/grafana/dashboards/EngineeringThroughputAndCycleTime.json @@ -39,7 +39,7 @@ "showLineNumbers": false, "showMiniMap": false }, - "content": "- Use Cases: This dashboard shows the engineering throughput and and cycle time, which helps to identify productivity and bottlenecks of the development process.\n- Data Source Required: GitHub and Jira([transformation](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required to tell DevLake what the story_points field is)", + "content": "- Use Cases: This dashboard shows the engineering throughput and and cycle time, which helps to identify productivity and bottlenecks of the development process.\n- Data Sources Required:\n - One of the Git tools, e.g. [GitHub](https://devlake.apache.org/docs/Configuration/GitHub), [GitLab](https://devlake.apache.org/docs/Configuration/GitLab), [Bitbucket](https://devlake.apache.org/docs/Configuration/BitBucket) or [Azure DevOps](https://devlake.apache.org/docs/Configuration/AzureDevOps)\n - One of the issue tracking tools, e.g. [Jira](https://devlake.apache.org/docs/Configuration/Jira) ([Scope Config](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required to tell DevLake what the story_points field is)", "mode": "markdown" }, "pluginVersion": "11.0.0", diff --git a/grafana/dashboards/EngineeringThroughputAndCycleTimeTeamView.json b/grafana/dashboards/EngineeringThroughputAndCycleTimeTeamView.json index c9cd453387c..82251d97eab 100644 --- a/grafana/dashboards/EngineeringThroughputAndCycleTimeTeamView.json +++ b/grafana/dashboards/EngineeringThroughputAndCycleTimeTeamView.json @@ -40,7 +40,7 @@ "showLineNumbers": false, "showMiniMap": false }, - "content": "- Use Cases: This dashboard shows the engineering throughput and and cycle time, which helps to identify productivity and bottlenecks of the development process.\n- Data Source Required: GitHub and Jira([transformation](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required to tell DevLake what the story_points field is). You also need to do [team configuration](https://devlake.apache.org/docs/Configuration/TeamConfiguration) to use this dashboard.", + "content": "- Use Cases: This dashboard shows the engineering throughput and and cycle time, which helps to identify productivity and bottlenecks of the development process.\n- Data Sources Required:\n - One of the Git tools, e.g. [GitHub](https://devlake.apache.org/docs/Configuration/GitHub), [GitLab](https://devlake.apache.org/docs/Configuration/GitLab), [Bitbucket](https://devlake.apache.org/docs/Configuration/BitBucket) or [Azure DevOps](https://devlake.apache.org/docs/Configuration/AzureDevOps)\n - One of the issue tracking tools, e.g. [Jira](https://devlake.apache.org/docs/Configuration/Jira) ([Scope Config](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required to tell DevLake what the story_points field is)\n- You also need to do [team configuration](https://devlake.apache.org/docs/Configuration/TeamConfiguration) to use this dashboard.", "mode": "markdown" }, "pluginVersion": "11.0.0", diff --git a/grafana/dashboards/WeeklyBugRetro.json b/grafana/dashboards/WeeklyBugRetro.json index 63746d0740d..f6351bf0e9d 100644 --- a/grafana/dashboards/WeeklyBugRetro.json +++ b/grafana/dashboards/WeeklyBugRetro.json @@ -40,7 +40,7 @@ "showLineNumbers": false, "showMiniMap": false }, - "content": "- Use Cases: This dashboard can be used to track bugs with metrics such as [Bug Age](https://devlake.apache.org/docs/Metrics/BugAge).\n- Data Source Required: GitHub ([Scope Config](https://devlake.apache.org/docs/UserManuals/ConfigUI/GitHub#step-3---adding-transformation-rules-optional) required) or Jira ([Scope Config](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) required). Scope config is the settings to define which issues are bugs.", + "content": "- Use Cases: This dashboard can be used to track bugs with metrics such as [Bug Age](https://devlake.apache.org/docs/Metrics/BugAge).\n- Data Source Required: One of the issue tracking tools, e.g. [GitHub](https://devlake.apache.org/docs/UserManuals/ConfigUI/GitHub#step-3---adding-transformation-rules-optional), [GitLab](https://devlake.apache.org/docs/Configuration/GitLab) or [Jira](https://devlake.apache.org/docs/UserManuals/ConfigUI/Jira#step-3---adding-transformation-rules-optional) (Scope Config required to define which issues are bugs).", "mode": "markdown" }, "pluginVersion": "11.0.0", From f39fb804fe4e3584eeeef9384204a9fabd887d37 Mon Sep 17 00:00:00 2001 From: Dan Crews Date: Thu, 5 Mar 2026 06:05:20 -0800 Subject: [PATCH 08/38] fix: modify cicd_deployments name from varchar to text (#8724) * fix: modify cicd_deployments name from varchar to text * fix: update the year --- .../domainlayer/devops/cicd_deployment.go | 2 +- ...0260217_modify_cicd_deployments_to_text.go | 66 +++++++++++++++++++ .../core/models/migrationscripts/register.go | 1 + 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 backend/core/models/migrationscripts/20260217_modify_cicd_deployments_to_text.go diff --git a/backend/core/models/domainlayer/devops/cicd_deployment.go b/backend/core/models/domainlayer/devops/cicd_deployment.go index b3071077253..e1f9049ded6 100644 --- a/backend/core/models/domainlayer/devops/cicd_deployment.go +++ b/backend/core/models/domainlayer/devops/cicd_deployment.go @@ -24,7 +24,7 @@ import ( type CICDDeployment struct { domainlayer.DomainEntity CicdScopeId string `gorm:"index;type:varchar(255)"` - Name string `gorm:"type:varchar(255)"` + Name string `gorm:"type:text"` DisplayTitle string Url string Result string `gorm:"type:varchar(100)"` diff --git a/backend/core/models/migrationscripts/20260217_modify_cicd_deployments_to_text.go b/backend/core/models/migrationscripts/20260217_modify_cicd_deployments_to_text.go new file mode 100644 index 00000000000..348099cea94 --- /dev/null +++ b/backend/core/models/migrationscripts/20260217_modify_cicd_deployments_to_text.go @@ -0,0 +1,66 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/migrationhelper" +) + +var _ plugin.MigrationScript = (*modifyCicdDeploymentsToText)(nil) + +type modifyCicdDeploymentsToText struct{} + +type cicdDeployment20260217 struct { + Name string +} + +func (cicdDeployment20260217) TableName() string { + return "cicd_deployments" +} + +func (script *modifyCicdDeploymentsToText) Up(basicRes context.BasicRes) errors.Error { + // cicd_deployments.name might be text, we ought to change the type + // for the column from `varchar(255)` to `text` + db := basicRes.GetDal() + return migrationhelper.ChangeColumnsType[cicdDeployment20260217]( + basicRes, + script, + cicdDeployment20260217{}.TableName(), + []string{"name"}, + func(tmpColumnParams []interface{}) errors.Error { + return db.UpdateColumn( + &cicdDeployment20260217{}, + "name", + dal.DalClause{Expr: " ? ", Params: tmpColumnParams}, + dal.Where("? != '' ", tmpColumnParams...), + ) + }, + ) +} + +func (*modifyCicdDeploymentsToText) Version() uint64 { + return 20260217145125 +} + +func (*modifyCicdDeploymentsToText) Name() string { + return "modify cicd_deployments name from varchar to text" +} diff --git a/backend/core/models/migrationscripts/register.go b/backend/core/models/migrationscripts/register.go index 363de1b5e3f..5b682b66222 100644 --- a/backend/core/models/migrationscripts/register.go +++ b/backend/core/models/migrationscripts/register.go @@ -141,5 +141,6 @@ func All() []plugin.MigrationScript { new(addIssueFixVerion), new(addPipelinePriority), new(fixNullPriority), + new(modifyCicdDeploymentsToText), } } From 498ca8b40e2e7a7feb146cec75f0866832664a68 Mon Sep 17 00:00:00 2001 From: Tomoya Kawaguchi <68677002+yamoyamoto@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:21:03 +0900 Subject: [PATCH 09/38] fix(q_dev): replace MariaDB-specific IF NOT EXISTS syntax with DAL methods for MySQL 8.x compatibility (#8745) --- .../20251209_add_scope_id_fields.go | 26 ++++++++----------- .../20260220_add_account_id_to_s3_slice.go | 12 ++++----- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/backend/plugins/q_dev/models/migrationscripts/20251209_add_scope_id_fields.go b/backend/plugins/q_dev/models/migrationscripts/20251209_add_scope_id_fields.go index d7819ff6160..a4448b01248 100644 --- a/backend/plugins/q_dev/models/migrationscripts/20251209_add_scope_id_fields.go +++ b/backend/plugins/q_dev/models/migrationscripts/20251209_add_scope_id_fields.go @@ -19,6 +19,7 @@ package migrationscripts import ( "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/dal" "github.com/apache/incubator-devlake/core/errors" "github.com/apache/incubator-devlake/core/plugin" ) @@ -32,29 +33,24 @@ func (*addScopeIdFields) Up(basicRes context.BasicRes) errors.Error { // Add scope_id column to _tool_q_dev_user_data table // This field links user data to QDevS3Slice scope, which can then be mapped to projects via project_mapping - err := db.Exec(` - ALTER TABLE _tool_q_dev_user_data - ADD COLUMN IF NOT EXISTS scope_id VARCHAR(255) DEFAULT NULL - `) - if err != nil { - // Try alternative syntax for databases that don't support IF NOT EXISTS - _ = db.Exec(`ALTER TABLE _tool_q_dev_user_data ADD COLUMN scope_id VARCHAR(255) DEFAULT NULL`) + if !db.HasColumn("_tool_q_dev_user_data", "scope_id") { + if err := db.AddColumn("_tool_q_dev_user_data", "scope_id", dal.Varchar); err != nil { + return errors.Default.Wrap(err, "failed to add scope_id to _tool_q_dev_user_data") + } } // Add index on scope_id for better query performance - _ = db.Exec(`CREATE INDEX IF NOT EXISTS idx_q_dev_user_data_scope_id ON _tool_q_dev_user_data(scope_id)`) + _ = db.Exec(`CREATE INDEX idx_q_dev_user_data_scope_id ON _tool_q_dev_user_data(scope_id)`) // Add scope_id column to _tool_q_dev_s3_file_meta table - err = db.Exec(` - ALTER TABLE _tool_q_dev_s3_file_meta - ADD COLUMN IF NOT EXISTS scope_id VARCHAR(255) DEFAULT NULL - `) - if err != nil { - _ = db.Exec(`ALTER TABLE _tool_q_dev_s3_file_meta ADD COLUMN scope_id VARCHAR(255) DEFAULT NULL`) + if !db.HasColumn("_tool_q_dev_s3_file_meta", "scope_id") { + if err := db.AddColumn("_tool_q_dev_s3_file_meta", "scope_id", dal.Varchar); err != nil { + return errors.Default.Wrap(err, "failed to add scope_id to _tool_q_dev_s3_file_meta") + } } // Add index on scope_id - _ = db.Exec(`CREATE INDEX IF NOT EXISTS idx_q_dev_s3_file_meta_scope_id ON _tool_q_dev_s3_file_meta(scope_id)`) + _ = db.Exec(`CREATE INDEX idx_q_dev_s3_file_meta_scope_id ON _tool_q_dev_s3_file_meta(scope_id)`) return nil } diff --git a/backend/plugins/q_dev/models/migrationscripts/20260220_add_account_id_to_s3_slice.go b/backend/plugins/q_dev/models/migrationscripts/20260220_add_account_id_to_s3_slice.go index 71a13c7b259..f0b0b897fa6 100644 --- a/backend/plugins/q_dev/models/migrationscripts/20260220_add_account_id_to_s3_slice.go +++ b/backend/plugins/q_dev/models/migrationscripts/20260220_add_account_id_to_s3_slice.go @@ -19,6 +19,7 @@ package migrationscripts import ( "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/dal" "github.com/apache/incubator-devlake/core/errors" "github.com/apache/incubator-devlake/core/plugin" ) @@ -30,13 +31,10 @@ type addAccountIdToS3Slice struct{} func (*addAccountIdToS3Slice) Up(basicRes context.BasicRes) errors.Error { db := basicRes.GetDal() - err := db.Exec(` - ALTER TABLE _tool_q_dev_s3_slices - ADD COLUMN IF NOT EXISTS account_id VARCHAR(255) DEFAULT NULL - `) - if err != nil { - // Try alternative syntax for databases that don't support IF NOT EXISTS - _ = db.Exec(`ALTER TABLE _tool_q_dev_s3_slices ADD COLUMN account_id VARCHAR(255) DEFAULT NULL`) + if !db.HasColumn("_tool_q_dev_s3_slices", "account_id") { + if err := db.AddColumn("_tool_q_dev_s3_slices", "account_id", dal.Varchar); err != nil { + return errors.Default.Wrap(err, "failed to add account_id to _tool_q_dev_s3_slices") + } } return nil From 4f7b4b3afe99392f762c9323222d5f71e7b64593 Mon Sep 17 00:00:00 2001 From: Spiff Azeta <35563797+spiffaz@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:21:24 +0100 Subject: [PATCH 10/38] fix(azuredevops): default empty entities and add CROSS to repo scope in makeScopeV200 (#8751) When scopeConfig.Entities is empty (common when no entities are explicitly selected in the UI), makeScopeV200 produced zero scopes, leaving project_mapping with no rows. Additionally, the repo scope condition did not check for DOMAIN_TYPE_CROSS, so selecting only CROSS would not create a repo scope, breaking DORA metrics. This adds the same fixes applied to GitLab in #8743. Closes #8749 --- .../azuredevops_go/api/blueprint_v200.go | 8 ++- .../azuredevops_go/api/blueprint_v200_test.go | 58 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/backend/plugins/azuredevops_go/api/blueprint_v200.go b/backend/plugins/azuredevops_go/api/blueprint_v200.go index 59a587b7803..018d9d1d77e 100644 --- a/backend/plugins/azuredevops_go/api/blueprint_v200.go +++ b/backend/plugins/azuredevops_go/api/blueprint_v200.go @@ -77,8 +77,14 @@ func makeScopeV200( } id := didgen.NewDomainIdGenerator(&models.AzuredevopsRepo{}).Generate(connectionId, azuredevopsRepo.Id) + // if no entities specified, use all entities enabled by default + if len(scopeConfig.Entities) == 0 { + scopeConfig.Entities = plugin.DOMAIN_TYPES + } + if utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CODE_REVIEW) || - utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CODE) { + utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CODE) || + utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CROSS) { // if we don't need to collect gitex, we need to add repo to scopes here scopeRepo := code.NewRepo(id, azuredevopsRepo.Name) sc = append(sc, scopeRepo) diff --git a/backend/plugins/azuredevops_go/api/blueprint_v200_test.go b/backend/plugins/azuredevops_go/api/blueprint_v200_test.go index ceddcda680d..fd40353f7a8 100644 --- a/backend/plugins/azuredevops_go/api/blueprint_v200_test.go +++ b/backend/plugins/azuredevops_go/api/blueprint_v200_test.go @@ -78,6 +78,64 @@ func TestMakeScopes(t *testing.T) { assert.Equal(t, actualScopes[2].ScopeId(), expectDomainScopeId) } +func TestMakeScopesWithEmptyEntities(t *testing.T) { + mockAzuredevopsPlugin(t) + + actualScopes, err := makeScopeV200( + connectionID, + []*srvhelper.ScopeDetail[models.AzuredevopsRepo, models.AzuredevopsScopeConfig]{ + { + Scope: models.AzuredevopsRepo{ + Scope: common.Scope{ + ConnectionId: connectionID, + }, + Id: azuredevopsRepoId, + Type: models.RepositoryTypeADO, + }, + ScopeConfig: &models.AzuredevopsScopeConfig{ + ScopeConfig: common.ScopeConfig{ + Entities: []string{}, + }, + }, + }, + }, + ) + assert.Nil(t, err) + // empty entities should default to all domain types, producing repo + cicd + board scopes + assert.Equal(t, 3, len(actualScopes)) + assert.Equal(t, actualScopes[0].ScopeId(), expectDomainScopeId) +} + +func TestMakeScopesWithCrossEntity(t *testing.T) { + mockAzuredevopsPlugin(t) + + actualScopes, err := makeScopeV200( + connectionID, + []*srvhelper.ScopeDetail[models.AzuredevopsRepo, models.AzuredevopsScopeConfig]{ + { + Scope: models.AzuredevopsRepo{ + Scope: common.Scope{ + ConnectionId: connectionID, + }, + Id: azuredevopsRepoId, + Type: models.RepositoryTypeADO, + }, + ScopeConfig: &models.AzuredevopsScopeConfig{ + ScopeConfig: common.ScopeConfig{ + Entities: []string{plugin.DOMAIN_TYPE_CROSS, plugin.DOMAIN_TYPE_TICKET}, + }, + }, + }, + }, + ) + assert.Nil(t, err) + // CROSS entity should trigger repo scope creation, plus ticket = board scope + assert.Equal(t, 2, len(actualScopes)) + assert.Equal(t, actualScopes[0].ScopeId(), expectDomainScopeId) + assert.Equal(t, "repos", actualScopes[0].TableName()) + assert.Equal(t, "boards", actualScopes[1].TableName()) +} + func TestMakeDataSourcePipelinePlanV200(t *testing.T) { mockAzuredevopsPlugin(t) From a51d2bb5c94892d05d4f6ed70d18917830f74bd0 Mon Sep 17 00:00:00 2001 From: Spiff Azeta <35563797+spiffaz@users.noreply.github.com> Date: Fri, 6 Mar 2026 08:04:27 +0100 Subject: [PATCH 11/38] fix(bitbucket): default empty entities to all domain types in makeScopesV200 (#8750) When scopeConfig.Entities is empty (common when no entities are explicitly selected in the UI), makeScopesV200 produced zero scopes, leaving project_mapping with no repo rows. This adds the same empty-entities default applied to GitLab in #8743. Closes #8748 --- .../plugins/bitbucket/api/blueprint_v200.go | 5 + .../bitbucket/api/blueprint_v200_test.go | 153 ++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 backend/plugins/bitbucket/api/blueprint_v200_test.go diff --git a/backend/plugins/bitbucket/api/blueprint_v200.go b/backend/plugins/bitbucket/api/blueprint_v200.go index 0e2477e80fe..6fedb0df298 100644 --- a/backend/plugins/bitbucket/api/blueprint_v200.go +++ b/backend/plugins/bitbucket/api/blueprint_v200.go @@ -154,6 +154,11 @@ func makeScopesV200( scope, scopeConfig := scopeDetail.Scope, scopeDetail.ScopeConfig id := idgen.Generate(connection.ID, scope.BitbucketId) + // if no entities specified, use all entities enabled by default + if len(scopeConfig.Entities) == 0 { + scopeConfig.Entities = plugin.DOMAIN_TYPES + } + if utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CODE_REVIEW) || utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CODE) || utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CROSS) { diff --git a/backend/plugins/bitbucket/api/blueprint_v200_test.go b/backend/plugins/bitbucket/api/blueprint_v200_test.go new file mode 100644 index 00000000000..cd46decc2c3 --- /dev/null +++ b/backend/plugins/bitbucket/api/blueprint_v200_test.go @@ -0,0 +1,153 @@ +/* +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 api + +import ( + "testing" + + mockplugin "github.com/apache/incubator-devlake/mocks/core/plugin" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/helpers/srvhelper" + "github.com/apache/incubator-devlake/plugins/bitbucket/models" + "github.com/stretchr/testify/assert" +) + +func mockBitbucketPlugin(t *testing.T) { + mockMeta := mockplugin.NewPluginMeta(t) + mockMeta.On("RootPkgPath").Return("github.com/apache/incubator-devlake/plugins/bitbucket") + mockMeta.On("Name").Return("dummy").Maybe() + err := plugin.RegisterPlugin("bitbucket", mockMeta) + assert.Equal(t, err, nil) +} + +func TestMakeScopes(t *testing.T) { + mockBitbucketPlugin(t) + + const connectionId uint64 = 1 + const bitbucketId = "owner/repo" + const expectDomainScopeId = "bitbucket:BitbucketRepo:1:owner/repo" + + actualScopes, err := makeScopesV200( + []*srvhelper.ScopeDetail[models.BitbucketRepo, models.BitbucketScopeConfig]{ + { + Scope: models.BitbucketRepo{ + Scope: common.Scope{ + ConnectionId: connectionId, + }, + BitbucketId: bitbucketId, + }, + ScopeConfig: &models.BitbucketScopeConfig{ + ScopeConfig: common.ScopeConfig{ + Entities: []string{plugin.DOMAIN_TYPE_CODE, plugin.DOMAIN_TYPE_TICKET, plugin.DOMAIN_TYPE_CICD}, + }, + }, + }, + }, + &models.BitbucketConnection{ + BaseConnection: api.BaseConnection{ + Model: common.Model{ + ID: connectionId, + }, + }, + }, + ) + assert.Nil(t, err) + assert.Equal(t, 3, len(actualScopes)) + assert.Equal(t, expectDomainScopeId, actualScopes[0].ScopeId()) + assert.Equal(t, expectDomainScopeId, actualScopes[1].ScopeId()) + assert.Equal(t, expectDomainScopeId, actualScopes[2].ScopeId()) +} + +func TestMakeScopesWithEmptyEntities(t *testing.T) { + mockBitbucketPlugin(t) + + const connectionId uint64 = 1 + const bitbucketId = "owner/repo" + const expectDomainScopeId = "bitbucket:BitbucketRepo:1:owner/repo" + + actualScopes, err := makeScopesV200( + []*srvhelper.ScopeDetail[models.BitbucketRepo, models.BitbucketScopeConfig]{ + { + Scope: models.BitbucketRepo{ + Scope: common.Scope{ + ConnectionId: connectionId, + }, + BitbucketId: bitbucketId, + }, + ScopeConfig: &models.BitbucketScopeConfig{ + ScopeConfig: common.ScopeConfig{ + Entities: []string{}, + }, + }, + }, + }, + &models.BitbucketConnection{ + BaseConnection: api.BaseConnection{ + Model: common.Model{ + ID: connectionId, + }, + }, + }, + ) + assert.Nil(t, err) + // empty entities should default to all domain types, producing repo + cicd + board scopes + assert.Equal(t, 3, len(actualScopes)) + assert.Equal(t, expectDomainScopeId, actualScopes[0].ScopeId()) +} + +func TestMakeScopesWithCrossEntity(t *testing.T) { + mockBitbucketPlugin(t) + + const connectionId uint64 = 1 + const bitbucketId = "owner/repo" + const expectDomainScopeId = "bitbucket:BitbucketRepo:1:owner/repo" + + actualScopes, err := makeScopesV200( + []*srvhelper.ScopeDetail[models.BitbucketRepo, models.BitbucketScopeConfig]{ + { + Scope: models.BitbucketRepo{ + Scope: common.Scope{ + ConnectionId: connectionId, + }, + BitbucketId: bitbucketId, + }, + ScopeConfig: &models.BitbucketScopeConfig{ + ScopeConfig: common.ScopeConfig{ + Entities: []string{plugin.DOMAIN_TYPE_CROSS, plugin.DOMAIN_TYPE_TICKET}, + }, + }, + }, + }, + &models.BitbucketConnection{ + BaseConnection: api.BaseConnection{ + Model: common.Model{ + ID: connectionId, + }, + }, + }, + ) + assert.Nil(t, err) + // CROSS entity should trigger repo scope creation, plus ticket = board scope + assert.Equal(t, 2, len(actualScopes)) + assert.Equal(t, expectDomainScopeId, actualScopes[0].ScopeId()) + assert.Equal(t, "repos", actualScopes[0].TableName()) + assert.Equal(t, "boards", actualScopes[1].TableName()) +} From cbd68dff90fca7e076d2355bb1fe5facfd5430dd Mon Sep 17 00:00:00 2001 From: Joshua Smith Date: Tue, 10 Mar 2026 06:25:54 -0600 Subject: [PATCH 12/38] feat(circleci): add server version requirement and endpoint help text (#8757) Update CircleCI connection form to indicate Server v4.x+ requirement and provide guidance for server endpoint configuration. Signed-off-by: Joshua Smith --- config-ui/src/plugins/register/circleci/config.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config-ui/src/plugins/register/circleci/config.tsx b/config-ui/src/plugins/register/circleci/config.tsx index f6fcf06ccbe..64deb5f4ade 100644 --- a/config-ui/src/plugins/register/circleci/config.tsx +++ b/config-ui/src/plugins/register/circleci/config.tsx @@ -34,8 +34,10 @@ export const CircleCIConfig: IPluginConfig = { key: 'endpoint', multipleVersions: { cloud: 'https://circleci.com/api/', - server: '', + server: '(v4.x+)', }, + subLabel: + 'If you are using CircleCI Server, please enter the endpoint URL. E.g. https://circleci.your-company.com/api/', }, 'token', 'proxy', From 2d4a1f506af1d62d293d6bd26df4a0126bb2acef Mon Sep 17 00:00:00 2001 From: jawad khan Date: Thu, 12 Mar 2026 17:27:57 +0500 Subject: [PATCH 13/38] feat(asana): add Asana plugin for project and task collection (#8758) Add a new Asana plugin that integrates with Asana's REST API to collect projects, sections, tasks, subtasks, stories (comments), tags, and users, mapping them to DevLake's ticket/board domain model. Backend: - Plugin implementation with all required interfaces (PluginMeta, PluginTask, PluginModel, PluginMigration, PluginSource, PluginApi, DataSourcePluginBlueprintV200) - Collectors, extractors, and converters for projects, sections, tasks, subtasks, stories, tags, and users - Remote API scope picker (Workspaces -> Teams/Portfolios -> Projects) - Scope config with issue-type regex transformation rules - Migration scripts for schema evolution - E2E tests with CSV fixtures for project and task data flows Config UI: - Plugin registration with connection form (PAT auth, endpoint, proxy) - Scope config transformation form for issue-type mapping - Dashboard URL integration for onboarding flow Grafana: - Asana dashboard with task metrics and visualizations Made-with: Cursor --- backend/plugins/asana/api/blueprint_v200.go | 101 ++ backend/plugins/asana/api/connection_api.go | 124 ++ backend/plugins/asana/api/init.go | 54 + backend/plugins/asana/api/remote_api.go | 632 +++++++++ backend/plugins/asana/api/scope_api.go | 48 + backend/plugins/asana/api/scope_config_api.go | 47 + backend/plugins/asana/api/swagger.go | 32 + backend/plugins/asana/asana.go | 42 + backend/plugins/asana/e2e/e2e_path_test.go | 38 + backend/plugins/asana/e2e/project_test.go | 96 ++ .../e2e/raw_tables/_raw_asana_projects.csv | 2 + .../asana/e2e/raw_tables/_raw_asana_tasks.csv | 2 + .../snapshot_tables/_tool_asana_projects.csv | 2 + ..._tool_asana_projects_with_scope_config.csv | 2 + .../_tool_asana_scope_configs.csv | 2 + .../e2e/snapshot_tables/_tool_asana_tasks.csv | 2 + .../asana/e2e/snapshot_tables/boards.csv | 2 + backend/plugins/asana/e2e/task_test.go | 49 + backend/plugins/asana/impl/impl.go | 223 +++ backend/plugins/asana/models/connection.go | 71 + backend/plugins/asana/models/custom_field.go | 59 + backend/plugins/asana/models/membership.go | 48 + .../20250203_add_init_tables.go | 56 + .../20250212_add_missing_tables.go | 51 + ...0212_add_scope_config_issue_type_fields.go | 51 + ...20250212_add_task_transformation_fields.go | 71 + .../20250212_add_user_photo_url.go | 51 + ...0219_add_connection_id_to_scope_configs.go | 51 + .../migrationscripts/archived/models.go | 264 ++++ .../asana/models/migrationscripts/register.go | 34 + backend/plugins/asana/models/project.go | 63 + backend/plugins/asana/models/scope_config.go | 41 + backend/plugins/asana/models/section.go | 35 + backend/plugins/asana/models/story.go | 47 + backend/plugins/asana/models/tag.go | 50 + backend/plugins/asana/models/task.go | 66 + backend/plugins/asana/models/team.go | 38 + backend/plugins/asana/models/user.go | 37 + backend/plugins/asana/models/workspace.go | 35 + backend/plugins/asana/tasks/api_client.go | 40 + .../plugins/asana/tasks/project_collector.go | 75 ++ .../plugins/asana/tasks/project_convertor.go | 80 ++ .../plugins/asana/tasks/project_extractor.go | 88 ++ .../plugins/asana/tasks/section_collector.go | 72 + .../plugins/asana/tasks/section_extractor.go | 83 ++ .../plugins/asana/tasks/story_collector.go | 100 ++ .../plugins/asana/tasks/story_convertor.go | 88 ++ .../plugins/asana/tasks/story_extractor.go | 119 ++ .../plugins/asana/tasks/subtask_collector.go | 97 ++ .../plugins/asana/tasks/subtask_extractor.go | 124 ++ backend/plugins/asana/tasks/tag_collector.go | 96 ++ backend/plugins/asana/tasks/tag_extractor.go | 98 ++ backend/plugins/asana/tasks/task_collector.go | 102 ++ backend/plugins/asana/tasks/task_convertor.go | 298 +++++ backend/plugins/asana/tasks/task_data.go | 49 + backend/plugins/asana/tasks/task_extractor.go | 162 +++ backend/plugins/asana/tasks/user_collector.go | 101 ++ backend/plugins/asana/tasks/user_convertor.go | 80 ++ backend/plugins/asana/tasks/user_extractor.go | 85 ++ backend/plugins/table_info_test.go | 2 + config-ui/env.example | 1 + .../components/scope-config-form/index.tsx | 10 + .../plugins/register/asana/assets/icon.svg | 20 + .../src/plugins/register/asana/config.tsx | 66 + config-ui/src/plugins/register/asana/index.ts | 20 + .../plugins/register/asana/transformation.tsx | 116 ++ config-ui/src/plugins/register/index.ts | 2 + config-ui/src/plugins/utils.ts | 2 + config-ui/src/release/stable.ts | 4 + config-ui/src/routes/onboard/step-4.tsx | 1 + config-ui/src/vite-env.d.ts | 1 + grafana/dashboards/Asana.json | 1192 +++++++++++++++++ 72 files changed, 6193 insertions(+) create mode 100644 backend/plugins/asana/api/blueprint_v200.go create mode 100644 backend/plugins/asana/api/connection_api.go create mode 100644 backend/plugins/asana/api/init.go create mode 100644 backend/plugins/asana/api/remote_api.go create mode 100644 backend/plugins/asana/api/scope_api.go create mode 100644 backend/plugins/asana/api/scope_config_api.go create mode 100644 backend/plugins/asana/api/swagger.go create mode 100644 backend/plugins/asana/asana.go create mode 100644 backend/plugins/asana/e2e/e2e_path_test.go create mode 100644 backend/plugins/asana/e2e/project_test.go create mode 100644 backend/plugins/asana/e2e/raw_tables/_raw_asana_projects.csv create mode 100644 backend/plugins/asana/e2e/raw_tables/_raw_asana_tasks.csv create mode 100644 backend/plugins/asana/e2e/snapshot_tables/_tool_asana_projects.csv create mode 100644 backend/plugins/asana/e2e/snapshot_tables/_tool_asana_projects_with_scope_config.csv create mode 100644 backend/plugins/asana/e2e/snapshot_tables/_tool_asana_scope_configs.csv create mode 100644 backend/plugins/asana/e2e/snapshot_tables/_tool_asana_tasks.csv create mode 100644 backend/plugins/asana/e2e/snapshot_tables/boards.csv create mode 100644 backend/plugins/asana/e2e/task_test.go create mode 100644 backend/plugins/asana/impl/impl.go create mode 100644 backend/plugins/asana/models/connection.go create mode 100644 backend/plugins/asana/models/custom_field.go create mode 100644 backend/plugins/asana/models/membership.go create mode 100644 backend/plugins/asana/models/migrationscripts/20250203_add_init_tables.go create mode 100644 backend/plugins/asana/models/migrationscripts/20250212_add_missing_tables.go create mode 100644 backend/plugins/asana/models/migrationscripts/20250212_add_scope_config_issue_type_fields.go create mode 100644 backend/plugins/asana/models/migrationscripts/20250212_add_task_transformation_fields.go create mode 100644 backend/plugins/asana/models/migrationscripts/20250212_add_user_photo_url.go create mode 100644 backend/plugins/asana/models/migrationscripts/20250219_add_connection_id_to_scope_configs.go create mode 100644 backend/plugins/asana/models/migrationscripts/archived/models.go create mode 100644 backend/plugins/asana/models/migrationscripts/register.go create mode 100644 backend/plugins/asana/models/project.go create mode 100644 backend/plugins/asana/models/scope_config.go create mode 100644 backend/plugins/asana/models/section.go create mode 100644 backend/plugins/asana/models/story.go create mode 100644 backend/plugins/asana/models/tag.go create mode 100644 backend/plugins/asana/models/task.go create mode 100644 backend/plugins/asana/models/team.go create mode 100644 backend/plugins/asana/models/user.go create mode 100644 backend/plugins/asana/models/workspace.go create mode 100644 backend/plugins/asana/tasks/api_client.go create mode 100644 backend/plugins/asana/tasks/project_collector.go create mode 100644 backend/plugins/asana/tasks/project_convertor.go create mode 100644 backend/plugins/asana/tasks/project_extractor.go create mode 100644 backend/plugins/asana/tasks/section_collector.go create mode 100644 backend/plugins/asana/tasks/section_extractor.go create mode 100644 backend/plugins/asana/tasks/story_collector.go create mode 100644 backend/plugins/asana/tasks/story_convertor.go create mode 100644 backend/plugins/asana/tasks/story_extractor.go create mode 100644 backend/plugins/asana/tasks/subtask_collector.go create mode 100644 backend/plugins/asana/tasks/subtask_extractor.go create mode 100644 backend/plugins/asana/tasks/tag_collector.go create mode 100644 backend/plugins/asana/tasks/tag_extractor.go create mode 100644 backend/plugins/asana/tasks/task_collector.go create mode 100644 backend/plugins/asana/tasks/task_convertor.go create mode 100644 backend/plugins/asana/tasks/task_data.go create mode 100644 backend/plugins/asana/tasks/task_extractor.go create mode 100644 backend/plugins/asana/tasks/user_collector.go create mode 100644 backend/plugins/asana/tasks/user_convertor.go create mode 100644 backend/plugins/asana/tasks/user_extractor.go create mode 100644 config-ui/src/plugins/register/asana/assets/icon.svg create mode 100644 config-ui/src/plugins/register/asana/config.tsx create mode 100644 config-ui/src/plugins/register/asana/index.ts create mode 100644 config-ui/src/plugins/register/asana/transformation.tsx create mode 100644 grafana/dashboards/Asana.json diff --git a/backend/plugins/asana/api/blueprint_v200.go b/backend/plugins/asana/api/blueprint_v200.go new file mode 100644 index 00000000000..2820593e350 --- /dev/null +++ b/backend/plugins/asana/api/blueprint_v200.go @@ -0,0 +1,101 @@ +/* +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 api + +import ( + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + + "github.com/apache/incubator-devlake/plugins/asana/models" + "github.com/apache/incubator-devlake/plugins/asana/tasks" + + "github.com/apache/incubator-devlake/core/errors" + coreModels "github.com/apache/incubator-devlake/core/models" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/core/utils" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/helpers/srvhelper" +) + +func MakePipelinePlanV200( + subtaskMetas []plugin.SubTaskMeta, + connectionId uint64, + bpScopes []*coreModels.BlueprintScope, +) (coreModels.PipelinePlan, []plugin.Scope, errors.Error) { + connection, err := dsHelper.ConnSrv.FindByPk(connectionId) + if err != nil { + return nil, nil, err + } + scopeDetails, err := dsHelper.ScopeSrv.MapScopeDetails(connectionId, bpScopes) + if err != nil { + return nil, nil, err + } + plan, err := makePipelinePlanV200(subtaskMetas, scopeDetails, connection) + if err != nil { + return nil, nil, err + } + scopes, err := makeScopesV200(scopeDetails, connection) + return plan, scopes, err +} + +func makePipelinePlanV200( + subtaskMetas []plugin.SubTaskMeta, + scopeDetails []*srvhelper.ScopeDetail[models.AsanaProject, models.AsanaScopeConfig], + connection *models.AsanaConnection, +) (coreModels.PipelinePlan, errors.Error) { + plan := make(coreModels.PipelinePlan, len(scopeDetails)) + for i, scopeDetail := range scopeDetails { + stage := plan[i] + if stage == nil { + stage = coreModels.PipelineStage{} + } + scope, scopeConfig := scopeDetail.Scope, scopeDetail.ScopeConfig + task, err := helper.MakePipelinePlanTask( + "asana", + subtaskMetas, + scopeConfig.Entities, + tasks.AsanaOptions{ + ConnectionId: connection.ID, + ProjectId: scope.Gid, + ScopeConfigId: scopeConfig.ID, + }, + ) + if err != nil { + return nil, err + } + stage = append(stage, task) + plan[i] = stage + } + return plan, nil +} + +func makeScopesV200( + scopeDetails []*srvhelper.ScopeDetail[models.AsanaProject, models.AsanaScopeConfig], + connection *models.AsanaConnection, +) ([]plugin.Scope, errors.Error) { + scopes := make([]plugin.Scope, 0, len(scopeDetails)) + idgen := didgen.NewDomainIdGenerator(&models.AsanaProject{}) + for _, scopeDetail := range scopeDetails { + scope, scopeConfig := scopeDetail.Scope, scopeDetail.ScopeConfig + id := idgen.Generate(connection.ID, scope.Gid) + if utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_TICKET) { + scopes = append(scopes, ticket.NewBoard(id, scope.Name)) + } + } + return scopes, nil +} diff --git a/backend/plugins/asana/api/connection_api.go b/backend/plugins/asana/api/connection_api.go new file mode 100644 index 00000000000..6d69c8c4ee4 --- /dev/null +++ b/backend/plugins/asana/api/connection_api.go @@ -0,0 +1,124 @@ +/* +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 api + +import ( + "context" + "net/http" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" + "github.com/apache/incubator-devlake/server/api/shared" +) + +type AsanaTestConnResponse struct { + shared.ApiBody + Connection *models.AsanaConn +} + +func testConnection(ctx context.Context, connection models.AsanaConn) (*AsanaTestConnResponse, errors.Error) { + if vld != nil { + if err := vld.Struct(connection); err != nil { + return nil, errors.Default.Wrap(err, "error validating target") + } + } + if connection.GetEndpoint() == "" { + connection.Endpoint = defaultAsanaEndpoint + } + apiClient, err := helper.NewApiClientFromConnection(ctx, basicRes, &connection) + if err != nil { + return nil, err + } + res, err := apiClient.Get("users/me", nil, nil) + if err != nil { + return nil, errors.BadInput.Wrap(err, "verify token failed") + } + if res.StatusCode == http.StatusUnauthorized { + return nil, errors.HttpStatus(http.StatusBadRequest).New("StatusUnauthorized error while testing connection") + } + if res.StatusCode != http.StatusOK { + return nil, errors.HttpStatus(res.StatusCode).New("unexpected status code while testing connection") + } + connection = connection.Sanitize() + body := AsanaTestConnResponse{} + body.Success = true + body.Message = "success" + body.Connection = &connection + return &body, nil +} + +func TestConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + var connection models.AsanaConn + err := helper.Decode(input.Body, &connection, vld) + if err != nil { + return nil, err + } + if connection.Endpoint == "" { + connection.Endpoint = defaultAsanaEndpoint + } + result, err := testConnection(context.TODO(), connection) + if err != nil { + return nil, plugin.WrapTestConnectionErrResp(basicRes, err) + } + return &plugin.ApiResourceOutput{Body: result, Status: http.StatusOK}, nil +} + +func TestExistingConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + connection, err := dsHelper.ConnApi.GetMergedConnection(input) + if err != nil { + return nil, errors.BadInput.Wrap(err, "find connection from db") + } + if err := helper.DecodeMapStruct(input.Body, connection, false); err != nil { + return nil, err + } + if connection.Endpoint == "" { + connection.Endpoint = defaultAsanaEndpoint + } + testConnectionResult, testConnectionErr := testConnection(context.TODO(), connection.AsanaConn) + if testConnectionErr != nil { + return nil, plugin.WrapTestConnectionErrResp(basicRes, testConnectionErr) + } + return &plugin.ApiResourceOutput{Body: testConnectionResult, Status: http.StatusOK}, nil +} + +func PostConnections(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + if input.Body != nil { + if endpoint, ok := input.Body["endpoint"]; !ok || endpoint == nil || endpoint == "" { + input.Body["endpoint"] = defaultAsanaEndpoint + } + } + return dsHelper.ConnApi.Post(input) +} + +func PatchConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.Patch(input) +} + +func DeleteConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.Delete(input) +} + +func ListConnections(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.GetAll(input) +} + +func GetConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.GetDetail(input) +} diff --git a/backend/plugins/asana/api/init.go b/backend/plugins/asana/api/init.go new file mode 100644 index 00000000000..d13865b184c --- /dev/null +++ b/backend/plugins/asana/api/init.go @@ -0,0 +1,54 @@ +/* +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 api + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" + "github.com/go-playground/validator/v10" +) + +const defaultAsanaEndpoint = "https://app.asana.com/api/1.0/" + +var vld *validator.Validate +var basicRes context.BasicRes + +var dsHelper *api.DsHelper[models.AsanaConnection, models.AsanaProject, models.AsanaScopeConfig] +var raProxy *api.DsRemoteApiProxyHelper[models.AsanaConnection] +var raScopeList *api.DsRemoteApiScopeListHelper[models.AsanaConnection, models.AsanaProject, AsanaRemotePagination] + +func Init(br context.BasicRes, p plugin.PluginMeta) { + basicRes = br + vld = validator.New() + dsHelper = api.NewDataSourceHelper[ + models.AsanaConnection, models.AsanaProject, models.AsanaScopeConfig, + ]( + br, + p.Name(), + []string{"name"}, + func(c models.AsanaConnection) models.AsanaConnection { + return c.Sanitize() + }, + nil, + nil, + ) + raProxy = api.NewDsRemoteApiProxyHelper[models.AsanaConnection](dsHelper.ConnApi.ModelApiHelper) + raScopeList = api.NewDsRemoteApiScopeListHelper[models.AsanaConnection, models.AsanaProject, AsanaRemotePagination](raProxy, listAsanaRemoteScopes) +} diff --git a/backend/plugins/asana/api/remote_api.go b/backend/plugins/asana/api/remote_api.go new file mode 100644 index 00000000000..0245cb6008b --- /dev/null +++ b/backend/plugins/asana/api/remote_api.go @@ -0,0 +1,632 @@ +/* +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 api + +import ( + "fmt" + "net/url" + "strings" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + dsmodels "github.com/apache/incubator-devlake/helpers/pluginhelper/api/models" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +type AsanaRemotePagination struct { + Offset string `json:"offset"` + Limit int `json:"limit"` +} + +// Response types for Asana API +type asanaWorkspaceResponse struct { + Gid string `json:"gid"` + Name string `json:"name"` + ResourceType string `json:"resource_type"` + IsOrganization bool `json:"is_organization"` +} + +type asanaWorkspacesListResponse struct { + Data []asanaWorkspaceResponse `json:"data"` + NextPage *asanaNextPage `json:"next_page"` +} + +type asanaNextPage struct { + Offset string `json:"offset"` + Path string `json:"path"` + URI string `json:"uri"` +} + +type asanaTeamResponse struct { + Gid string `json:"gid"` + Name string `json:"name"` + ResourceType string `json:"resource_type"` + Description string `json:"description"` + PermalinkUrl string `json:"permalink_url"` +} + +type asanaTeamsListResponse struct { + Data []asanaTeamResponse `json:"data"` + NextPage *asanaNextPage `json:"next_page"` +} + +type asanaPortfolioResponse struct { + Gid string `json:"gid"` + Name string `json:"name"` + ResourceType string `json:"resource_type"` + PermalinkUrl string `json:"permalink_url"` +} + +type asanaPortfoliosListResponse struct { + Data []asanaPortfolioResponse `json:"data"` + NextPage *asanaNextPage `json:"next_page"` +} + +type asanaGoalResponse struct { + Gid string `json:"gid"` + Name string `json:"name"` + ResourceType string `json:"resource_type"` + Notes string `json:"notes"` +} + +type asanaGoalsListResponse struct { + Data []asanaGoalResponse `json:"data"` + NextPage *asanaNextPage `json:"next_page"` +} + +type asanaProjectResponse struct { + Gid string `json:"gid"` + Name string `json:"name"` + ResourceType string `json:"resource_type"` + Archived bool `json:"archived"` + PermalinkUrl string `json:"permalink_url"` + Workspace *struct { + Gid string `json:"gid"` + } `json:"workspace"` + Team *struct { + Gid string `json:"gid"` + Name string `json:"name"` + } `json:"team"` +} + +type asanaProjectsListResponse struct { + Data []asanaProjectResponse `json:"data"` + NextPage *asanaNextPage `json:"next_page"` +} + +// Scope type constants +const ( + ScopeTypeTeam = "team" + ScopeTypePortfolio = "portfolio" + ScopeTypeGoal = "goal" +) + +func listAsanaRemoteScopes( + connection *models.AsanaConnection, + apiClient plugin.ApiClient, + groupId string, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + if page.Limit == 0 { + page.Limit = 100 + } + + // Level 1: No groupId - list workspaces + if groupId == "" { + return listAsanaWorkspaces(apiClient, page) + } + + // Parse hierarchical groupId + // Format examples: + // - "workspace/{gid}" -> show Teams, Portfolios, Goals options + // - "workspace/{gid}/team/{teamGid}" -> list projects in team + // - "workspace/{gid}/portfolio/{portfolioGid}" -> list projects in portfolio + // - "workspace/{gid}/goal/{goalGid}" -> list projects for goal + + if strings.HasPrefix(groupId, "workspace/") { + parts := strings.Split(groupId[10:], "/") // Remove "workspace/" prefix + + if len(parts) == 1 { + // Level 2: Workspace selected - show Teams, Portfolios, Goals as categories + workspaceGid := parts[0] + return listAsanaScopeCategories(apiClient, workspaceGid, page) + } + + if len(parts) >= 3 { + workspaceGid := parts[0] + scopeType := parts[1] + scopeGid := parts[2] + + switch scopeType { + case ScopeTypeTeam: + // Level 4: List projects in team + return listAsanaTeamProjects(apiClient, workspaceGid, scopeGid, page) + case ScopeTypePortfolio: + // Level 4: List projects in portfolio + return listAsanaPortfolioProjects(apiClient, workspaceGid, scopeGid, page) + case ScopeTypeGoal: + // Level 4: List projects for goal + return listAsanaGoalProjects(apiClient, workspaceGid, scopeGid, page) + } + } + + if len(parts) == 2 { + workspaceGid := parts[0] + scopeType := parts[1] + + switch scopeType { + case ScopeTypeTeam: + // Level 3: List all teams + return listAsanaTeams(apiClient, workspaceGid, page) + case ScopeTypePortfolio: + // Level 3: List all portfolios + return listAsanaPortfolios(apiClient, workspaceGid, page) + case ScopeTypeGoal: + // Level 3: List all goals + return listAsanaGoals(apiClient, workspaceGid, page) + } + } + } + + return nil, nil, errors.BadInput.New("invalid groupId format") +} + +// Level 1: List workspaces +func listAsanaWorkspaces( + apiClient plugin.ApiClient, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + query := url.Values{} + query.Set("limit", fmt.Sprintf("%d", page.Limit)) + query.Set("opt_fields", "name,resource_type,is_organization") + if page.Offset != "" { + query.Set("offset", page.Offset) + } + + res, err := apiClient.Get("workspaces", query, nil) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to fetch workspaces from Asana API") + } + + var response asanaWorkspacesListResponse + err = api.UnmarshalResponse(res, &response) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to unmarshal Asana workspaces response") + } + + for _, workspace := range response.Data { + groupId := fmt.Sprintf("workspace/%s", workspace.Gid) + children = append(children, dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject]{ + Type: api.RAS_ENTRY_TYPE_GROUP, + ParentId: nil, // Root level, no parent + Id: groupId, + Name: workspace.Name, + FullName: workspace.Name, + }) + } + + if response.NextPage != nil && response.NextPage.Offset != "" { + nextPage = &AsanaRemotePagination{ + Offset: response.NextPage.Offset, + Limit: page.Limit, + } + } + + return children, nextPage, nil +} + +// Level 2: Show scope categories (Teams, Portfolios, Goals) +func listAsanaScopeCategories( + apiClient plugin.ApiClient, + workspaceGid string, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + // Parent is the workspace + parentId := fmt.Sprintf("workspace/%s", workspaceGid) + + // Return the three main categories: Teams, Portfolios, Goals + children = []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject]{ + { + Type: api.RAS_ENTRY_TYPE_GROUP, + ParentId: &parentId, + Id: fmt.Sprintf("workspace/%s/%s", workspaceGid, ScopeTypeTeam), + Name: "🏢 Teams", + FullName: "Teams", + }, + { + Type: api.RAS_ENTRY_TYPE_GROUP, + ParentId: &parentId, + Id: fmt.Sprintf("workspace/%s/%s", workspaceGid, ScopeTypePortfolio), + Name: "📁 Portfolios", + FullName: "Portfolios", + }, + { + Type: api.RAS_ENTRY_TYPE_GROUP, + ParentId: &parentId, + Id: fmt.Sprintf("workspace/%s/%s", workspaceGid, ScopeTypeGoal), + Name: "🎯 Goals", + FullName: "Goals", + }, + } + + return children, nil, nil +} + +// Level 3: List teams in workspace +func listAsanaTeams( + apiClient plugin.ApiClient, + workspaceGid string, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + // Parent is the "Teams" category + parentId := fmt.Sprintf("workspace/%s/%s", workspaceGid, ScopeTypeTeam) + + query := url.Values{} + query.Set("limit", fmt.Sprintf("%d", page.Limit)) + query.Set("opt_fields", "name,resource_type,description,permalink_url") + if page.Offset != "" { + query.Set("offset", page.Offset) + } + + apiPath := fmt.Sprintf("workspaces/%s/teams", workspaceGid) + res, err := apiClient.Get(apiPath, query, nil) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to fetch teams from Asana API") + } + + var response asanaTeamsListResponse + err = api.UnmarshalResponse(res, &response) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to unmarshal Asana teams response") + } + + for _, team := range response.Data { + groupId := fmt.Sprintf("workspace/%s/%s/%s", workspaceGid, ScopeTypeTeam, team.Gid) + children = append(children, dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject]{ + Type: api.RAS_ENTRY_TYPE_GROUP, + ParentId: &parentId, + Id: groupId, + Name: team.Name, + FullName: team.Name, + }) + } + + if response.NextPage != nil && response.NextPage.Offset != "" { + nextPage = &AsanaRemotePagination{ + Offset: response.NextPage.Offset, + Limit: page.Limit, + } + } + + return children, nextPage, nil +} + +// Level 3: List portfolios in workspace +func listAsanaPortfolios( + apiClient plugin.ApiClient, + workspaceGid string, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + // Parent is the "Portfolios" category + parentId := fmt.Sprintf("workspace/%s/%s", workspaceGid, ScopeTypePortfolio) + + query := url.Values{} + query.Set("limit", fmt.Sprintf("%d", page.Limit)) + query.Set("workspace", workspaceGid) + query.Set("owner", "me") + query.Set("opt_fields", "name,resource_type,permalink_url") + if page.Offset != "" { + query.Set("offset", page.Offset) + } + + res, err := apiClient.Get("portfolios", query, nil) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to fetch portfolios from Asana API") + } + + var response asanaPortfoliosListResponse + err = api.UnmarshalResponse(res, &response) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to unmarshal Asana portfolios response") + } + + for _, portfolio := range response.Data { + groupId := fmt.Sprintf("workspace/%s/%s/%s", workspaceGid, ScopeTypePortfolio, portfolio.Gid) + children = append(children, dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject]{ + Type: api.RAS_ENTRY_TYPE_GROUP, + ParentId: &parentId, + Id: groupId, + Name: portfolio.Name, + FullName: portfolio.Name, + }) + } + + if response.NextPage != nil && response.NextPage.Offset != "" { + nextPage = &AsanaRemotePagination{ + Offset: response.NextPage.Offset, + Limit: page.Limit, + } + } + + return children, nextPage, nil +} + +// Level 3: List goals in workspace +func listAsanaGoals( + apiClient plugin.ApiClient, + workspaceGid string, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + // Parent is the "Goals" category + parentId := fmt.Sprintf("workspace/%s/%s", workspaceGid, ScopeTypeGoal) + + query := url.Values{} + query.Set("limit", fmt.Sprintf("%d", page.Limit)) + query.Set("workspace", workspaceGid) + query.Set("opt_fields", "name,resource_type,notes") + if page.Offset != "" { + query.Set("offset", page.Offset) + } + + res, err := apiClient.Get("goals", query, nil) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to fetch goals from Asana API") + } + + var response asanaGoalsListResponse + err = api.UnmarshalResponse(res, &response) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to unmarshal Asana goals response") + } + + for _, goal := range response.Data { + groupId := fmt.Sprintf("workspace/%s/%s/%s", workspaceGid, ScopeTypeGoal, goal.Gid) + children = append(children, dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject]{ + Type: api.RAS_ENTRY_TYPE_GROUP, + ParentId: &parentId, + Id: groupId, + Name: goal.Name, + FullName: goal.Name, + }) + } + + if response.NextPage != nil && response.NextPage.Offset != "" { + nextPage = &AsanaRemotePagination{ + Offset: response.NextPage.Offset, + Limit: page.Limit, + } + } + + return children, nextPage, nil +} + +// Level 4: List projects in a team +func listAsanaTeamProjects( + apiClient plugin.ApiClient, + workspaceGid string, + teamGid string, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + // Parent is the specific team + parentId := fmt.Sprintf("workspace/%s/%s/%s", workspaceGid, ScopeTypeTeam, teamGid) + + query := url.Values{} + query.Set("limit", fmt.Sprintf("%d", page.Limit)) + query.Set("opt_fields", "name,resource_type,archived,permalink_url,workspace,team") + if page.Offset != "" { + query.Set("offset", page.Offset) + } + + apiPath := fmt.Sprintf("teams/%s/projects", teamGid) + res, err := apiClient.Get(apiPath, query, nil) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to fetch team projects from Asana API") + } + + var response asanaProjectsListResponse + err = api.UnmarshalResponse(res, &response) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to unmarshal Asana team projects response") + } + + children = convertProjectsToScopes(response.Data, workspaceGid, &parentId) + + if response.NextPage != nil && response.NextPage.Offset != "" { + nextPage = &AsanaRemotePagination{ + Offset: response.NextPage.Offset, + Limit: page.Limit, + } + } + + return children, nextPage, nil +} + +// Level 4: List projects in a portfolio +func listAsanaPortfolioProjects( + apiClient plugin.ApiClient, + workspaceGid string, + portfolioGid string, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + // Parent is the specific portfolio + parentId := fmt.Sprintf("workspace/%s/%s/%s", workspaceGid, ScopeTypePortfolio, portfolioGid) + + query := url.Values{} + query.Set("limit", fmt.Sprintf("%d", page.Limit)) + query.Set("opt_fields", "name,resource_type,archived,permalink_url,workspace,team") + if page.Offset != "" { + query.Set("offset", page.Offset) + } + + apiPath := fmt.Sprintf("portfolios/%s/items", portfolioGid) + res, err := apiClient.Get(apiPath, query, nil) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to fetch portfolio items from Asana API") + } + + var response asanaProjectsListResponse + err = api.UnmarshalResponse(res, &response) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to unmarshal Asana portfolio items response") + } + + children = convertProjectsToScopes(response.Data, workspaceGid, &parentId) + + if response.NextPage != nil && response.NextPage.Offset != "" { + nextPage = &AsanaRemotePagination{ + Offset: response.NextPage.Offset, + Limit: page.Limit, + } + } + + return children, nextPage, nil +} + +// Level 4: List projects associated with a goal +func listAsanaGoalProjects( + apiClient plugin.ApiClient, + workspaceGid string, + goalGid string, + page AsanaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject], + nextPage *AsanaRemotePagination, + err errors.Error, +) { + // Parent is the specific goal + parentId := fmt.Sprintf("workspace/%s/%s/%s", workspaceGid, ScopeTypeGoal, goalGid) + + query := url.Values{} + query.Set("limit", fmt.Sprintf("%d", page.Limit)) + query.Set("opt_fields", "name,resource_type,archived,permalink_url,workspace,team") + if page.Offset != "" { + query.Set("offset", page.Offset) + } + + // Goals API: GET /goals/{goal_gid}/parentGoals for related projects + // Note: Asana's goal-to-project relationship is through supporting work + apiPath := fmt.Sprintf("goals/%s/supportingWork", goalGid) + res, err := apiClient.Get(apiPath, query, nil) + if err != nil { + // If supporting work API fails, return empty list + return children, nil, nil + } + + var response asanaProjectsListResponse + err = api.UnmarshalResponse(res, &response) + if err != nil { + return nil, nil, errors.Default.Wrap(err, "failed to unmarshal Asana goal supporting work response") + } + + children = convertProjectsToScopes(response.Data, workspaceGid, &parentId) + + if response.NextPage != nil && response.NextPage.Offset != "" { + nextPage = &AsanaRemotePagination{ + Offset: response.NextPage.Offset, + Limit: page.Limit, + } + } + + return children, nextPage, nil +} + +// Helper function to convert Asana projects to scope entries +func convertProjectsToScopes( + projects []asanaProjectResponse, + workspaceGid string, + parentId *string, +) []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject] { + var children []dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject] + + for _, project := range projects { + workspaceGidVal := workspaceGid + if project.Workspace != nil { + workspaceGidVal = project.Workspace.Gid + } + children = append(children, dsmodels.DsRemoteApiScopeListEntry[models.AsanaProject]{ + Type: api.RAS_ENTRY_TYPE_SCOPE, + ParentId: parentId, + Id: project.Gid, + Name: project.Name, + FullName: project.Name, + Data: &models.AsanaProject{ + Gid: project.Gid, + Name: project.Name, + ResourceType: project.ResourceType, + Archived: project.Archived, + PermalinkUrl: project.PermalinkUrl, + WorkspaceGid: workspaceGidVal, + }, + }) + } + + return children +} + +// RemoteScopes list all available scopes (projects) for this connection +// @Summary list all available scopes (projects) for this connection +// @Description list all available scopes (projects) for this connection +// @Tags plugins/asana +// @Accept application/json +// @Param connectionId path int false "connection ID" +// @Param groupId query string false "group ID" +// @Param pageToken query string false "page Token" +// @Success 200 {object} RemoteScopesOutput +// @Failure 400 {object} shared.ApiBody "Bad Request" +// @Failure 500 {object} shared.ApiBody "Internal Error" +// @Router /plugins/asana/connections/{connectionId}/remote-scopes [GET] +func RemoteScopes(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return raScopeList.Get(input) +} + +func Proxy(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return raProxy.Proxy(input) +} diff --git a/backend/plugins/asana/api/scope_api.go b/backend/plugins/asana/api/scope_api.go new file mode 100644 index 00000000000..afbc8486583 --- /dev/null +++ b/backend/plugins/asana/api/scope_api.go @@ -0,0 +1,48 @@ +/* +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 api + +import ( + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +type PutScopesReqBody api.PutScopesReqBody[models.AsanaProject] +type ScopeDetail api.ScopeDetail[models.AsanaProject, models.AsanaScopeConfig] + +func PutScopes(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.PutMultiple(input) +} + +func PatchScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.Patch(input) +} + +func GetScopeList(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.GetPage(input) +} + +func GetScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.GetScopeDetail(input) +} + +func DeleteScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.Delete(input) +} diff --git a/backend/plugins/asana/api/scope_config_api.go b/backend/plugins/asana/api/scope_config_api.go new file mode 100644 index 00000000000..d7e5b541b11 --- /dev/null +++ b/backend/plugins/asana/api/scope_config_api.go @@ -0,0 +1,47 @@ +/* +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 api + +import ( + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" +) + +func PostScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.Post(input) +} + +func PatchScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.Patch(input) +} + +func GetScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.GetDetail(input) +} + +func GetScopeConfigList(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.GetAll(input) +} + +func GetProjectsByScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.GetProjectsByScopeConfig(input) +} + +func DeleteScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.Delete(input) +} diff --git a/backend/plugins/asana/api/swagger.go b/backend/plugins/asana/api/swagger.go new file mode 100644 index 00000000000..43897adf9ba --- /dev/null +++ b/backend/plugins/asana/api/swagger.go @@ -0,0 +1,32 @@ +/* +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 api + +import ( + "github.com/apache/incubator-devlake/plugins/asana/tasks" +) + +type AsanaTaskOptions tasks.AsanaOptions + +// @Summary asana task options for pipelines +// @Description Task options for asana pipelines +// @Tags plugins/asana +// @Accept application/json +// @Param pipeline body AsanaTaskOptions true "json" +// @Router /pipelines/asana/pipeline-task [post] +func _() {} diff --git a/backend/plugins/asana/asana.go b/backend/plugins/asana/asana.go new file mode 100644 index 00000000000..4bfbbf5b098 --- /dev/null +++ b/backend/plugins/asana/asana.go @@ -0,0 +1,42 @@ +/* +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 main + +import ( + "github.com/apache/incubator-devlake/core/runner" + "github.com/apache/incubator-devlake/plugins/asana/impl" + "github.com/spf13/cobra" +) + +var PluginEntry impl.Asana //nolint + +func main() { + cmd := &cobra.Command{Use: "asana"} + connectionId := cmd.Flags().Uint64P("connection", "c", 0, "asana connection id") + projectId := cmd.Flags().StringP("project", "p", "", "asana project gid") + timeAfter := cmd.Flags().StringP("timeAfter", "a", "", "collect data that are created after specified time, ie 2006-01-02T15:04:05Z") + _ = cmd.MarkFlagRequired("connection") + _ = cmd.MarkFlagRequired("project") + cmd.Run = func(c *cobra.Command, args []string) { + runner.DirectRun(c, args, PluginEntry, map[string]interface{}{ + "connectionId": *connectionId, + "projectId": *projectId, + }, *timeAfter) + } + runner.RunCmd(cmd) +} diff --git a/backend/plugins/asana/e2e/e2e_path_test.go b/backend/plugins/asana/e2e/e2e_path_test.go new file mode 100644 index 00000000000..36858800890 --- /dev/null +++ b/backend/plugins/asana/e2e/e2e_path_test.go @@ -0,0 +1,38 @@ +/* +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 ( + "path/filepath" + "runtime" +) + +// e2eDir returns the directory of the asana e2e package so CSV paths work when +// tests run from backend/ (CI) or from the e2e directory. +func e2eDir() string { + _, file, _, _ := runtime.Caller(0) + return filepath.Dir(file) +} + +func rawTablePath(name string) string { + return filepath.Join(e2eDir(), "raw_tables", name) +} + +func snapshotPath(name string) string { + return filepath.Join(e2eDir(), "snapshot_tables", name) +} diff --git a/backend/plugins/asana/e2e/project_test.go b/backend/plugins/asana/e2e/project_test.go new file mode 100644 index 00000000000..3fbc6308ea5 --- /dev/null +++ b/backend/plugins/asana/e2e/project_test.go @@ -0,0 +1,96 @@ +/* +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 ( + "testing" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/plugins/asana/impl" + "github.com/apache/incubator-devlake/plugins/asana/models" + "github.com/apache/incubator-devlake/plugins/asana/tasks" +) + +func TestAsanaProjectDataFlow(t *testing.T) { + var asana impl.Asana + dataflowTester := e2ehelper.NewDataFlowTester(t, "asana", asana) + + taskData := &tasks.AsanaTaskData{ + Options: &tasks.AsanaOptions{ + ConnectionId: 1, + ProjectId: "1234567890", + }, + } + + // Import raw data for projects + dataflowTester.ImportCsvIntoRawTable(rawTablePath("_raw_asana_projects.csv"), "_raw_asana_projects") + + // Verify project extraction + dataflowTester.FlushTabler(&models.AsanaProject{}) + dataflowTester.Subtask(tasks.ExtractProjectMeta, taskData) + + dataflowTester.VerifyTableWithOptions(models.AsanaProject{}, e2ehelper.TableOptions{ + CSVRelPath: snapshotPath("_tool_asana_projects.csv"), + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + + // Verify project conversion to domain layer board + dataflowTester.FlushTabler(&ticket.Board{}) + dataflowTester.Subtask(tasks.ConvertProjectMeta, taskData) + + dataflowTester.VerifyTable( + ticket.Board{}, + snapshotPath("boards.csv"), + []string{ + "id", + "name", + "description", + "url", + "created_date", + }, + ) +} + +func TestAsanaProjectWithScopeConfig(t *testing.T) { + var asana impl.Asana + dataflowTester := e2ehelper.NewDataFlowTester(t, "asana", asana) + + taskData := &tasks.AsanaTaskData{ + Options: &tasks.AsanaOptions{ + ConnectionId: 1, + ProjectId: "1234567890", + ScopeConfigId: 1, + }, + } + + // Import project with scope config association + dataflowTester.ImportCsvIntoRawTable(rawTablePath("_raw_asana_projects.csv"), "_raw_asana_projects") + dataflowTester.ImportCsvIntoTabler(snapshotPath("_tool_asana_scope_configs.csv"), &models.AsanaScopeConfig{}) + + // Extract project + dataflowTester.FlushTabler(&models.AsanaProject{}) + dataflowTester.Subtask(tasks.ExtractProjectMeta, taskData) + + // Verify project has scope_config_id + dataflowTester.VerifyTableWithOptions(models.AsanaProject{}, e2ehelper.TableOptions{ + CSVRelPath: snapshotPath("_tool_asana_projects_with_scope_config.csv"), + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) +} diff --git a/backend/plugins/asana/e2e/raw_tables/_raw_asana_projects.csv b/backend/plugins/asana/e2e/raw_tables/_raw_asana_projects.csv new file mode 100644 index 00000000000..fcc941f85de --- /dev/null +++ b/backend/plugins/asana/e2e/raw_tables/_raw_asana_projects.csv @@ -0,0 +1,2 @@ +id,params,data,url,input,created_at +1,"{""ConnectionId"":1,""ProjectId"":""1234567890""}","{""gid"":""1234567890"",""name"":""Test Project"",""resource_type"":""project"",""archived"":false,""permalink_url"":""https://app.asana.com/0/1234567890"",""workspace"":{""gid"":""ws123""}}",https://app.asana.com/api/1.0/projects/1234567890,null,2025-02-03 12:00:00 diff --git a/backend/plugins/asana/e2e/raw_tables/_raw_asana_tasks.csv b/backend/plugins/asana/e2e/raw_tables/_raw_asana_tasks.csv new file mode 100644 index 00000000000..59815e7308c --- /dev/null +++ b/backend/plugins/asana/e2e/raw_tables/_raw_asana_tasks.csv @@ -0,0 +1,2 @@ +id,params,data,url,input,created_at +1,"{""ConnectionId"":1,""ProjectId"":""123456789""}","{""gid"":""987654321"",""name"":""Test Task"",""notes"":""Notes here"",""resource_type"":""task"",""resource_subtype"":""default_task"",""completed"":false,""due_on"":""2025-02-15"",""created_at"":""2025-02-01T10:00:00.000Z"",""permalink_url"":""https://app.asana.com/0/123/987654321"",""memberships"":[{""project"":{""gid"":""123456789""},""section"":{""gid"":""111""}}]}",https://app.asana.com/api/1.0/projects/123456789/tasks,null,2025-02-03 12:00:00 diff --git a/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_projects.csv b/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_projects.csv new file mode 100644 index 00000000000..e05e3d2bad2 --- /dev/null +++ b/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_projects.csv @@ -0,0 +1,2 @@ +connection_id,scope_config_id,gid,name,resource_type,archived,workspace_gid,permalink_url +1,0,1234567890,Test Project,project,0,ws123,https://app.asana.com/0/1234567890 diff --git a/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_projects_with_scope_config.csv b/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_projects_with_scope_config.csv new file mode 100644 index 00000000000..12e7ee7aee3 --- /dev/null +++ b/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_projects_with_scope_config.csv @@ -0,0 +1,2 @@ +connection_id,scope_config_id,gid,name,resource_type,archived,workspace_gid,permalink_url +1,1,1234567890,Test Project,project,0,ws123,https://app.asana.com/0/1234567890 diff --git a/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_scope_configs.csv b/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_scope_configs.csv new file mode 100644 index 00000000000..7fd96f9c494 --- /dev/null +++ b/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_scope_configs.csv @@ -0,0 +1,2 @@ +id,connection_id,name,entities,issue_type_requirement,issue_type_bug,issue_type_incident +1,1,default,"[""TICKET""]",(feat|feature|story|requirement),(bug|defect|broken),(incident|outage|failure) diff --git a/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_tasks.csv b/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_tasks.csv new file mode 100644 index 00000000000..e4bde6d2b35 --- /dev/null +++ b/backend/plugins/asana/e2e/snapshot_tables/_tool_asana_tasks.csv @@ -0,0 +1,2 @@ +connection_id,gid,name,notes,resource_type,resource_subtype,completed,completed_at,due_on,created_at,modified_at,permalink_url,project_gid,section_gid,section_name,assignee_gid,assignee_name,creator_gid,creator_name,parent_gid,num_subtasks,std_type,std_status,priority,story_point,severity,lead_time_minutes +1,987654321,Test Task,Notes here,task,default_task,0,,2025-02-15T00:00:00.000+00:00,2025-02-01T10:00:00.000+00:00,,https://app.asana.com/0/123/987654321,123456789,111,,,,,,,0,,,,,, diff --git a/backend/plugins/asana/e2e/snapshot_tables/boards.csv b/backend/plugins/asana/e2e/snapshot_tables/boards.csv new file mode 100644 index 00000000000..8dd0e8c6780 --- /dev/null +++ b/backend/plugins/asana/e2e/snapshot_tables/boards.csv @@ -0,0 +1,2 @@ +id,name,description,url,created_date +asana:AsanaProject:1:1234567890,Test Project,,https://app.asana.com/0/1234567890, diff --git a/backend/plugins/asana/e2e/task_test.go b/backend/plugins/asana/e2e/task_test.go new file mode 100644 index 00000000000..5687ceb7c5b --- /dev/null +++ b/backend/plugins/asana/e2e/task_test.go @@ -0,0 +1,49 @@ +/* +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 ( + "testing" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/plugins/asana/impl" + "github.com/apache/incubator-devlake/plugins/asana/models" + "github.com/apache/incubator-devlake/plugins/asana/tasks" +) + +func TestAsanaTaskDataFlow(t *testing.T) { + var asana impl.Asana + dataflowTester := e2ehelper.NewDataFlowTester(t, "asana", asana) + + taskData := &tasks.AsanaTaskData{ + Options: &tasks.AsanaOptions{ + ConnectionId: 1, + ProjectId: "123456789", + }, + } + + dataflowTester.ImportCsvIntoRawTable(rawTablePath("_raw_asana_tasks.csv"), "_raw_asana_tasks") + + dataflowTester.FlushTabler(&models.AsanaTask{}) + dataflowTester.Subtask(tasks.ExtractTaskMeta, taskData) + dataflowTester.VerifyTableWithOptions(models.AsanaTask{}, e2ehelper.TableOptions{ + CSVRelPath: snapshotPath("_tool_asana_tasks.csv"), + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) +} diff --git a/backend/plugins/asana/impl/impl.go b/backend/plugins/asana/impl/impl.go new file mode 100644 index 00000000000..42ac786ae5f --- /dev/null +++ b/backend/plugins/asana/impl/impl.go @@ -0,0 +1,223 @@ +/* +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 impl + +import ( + "fmt" + + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + coreModels "github.com/apache/incubator-devlake/core/models" + "github.com/apache/incubator-devlake/core/plugin" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/api" + "github.com/apache/incubator-devlake/plugins/asana/models" + "github.com/apache/incubator-devlake/plugins/asana/models/migrationscripts" + "github.com/apache/incubator-devlake/plugins/asana/tasks" +) + +var _ interface { + plugin.PluginTask + plugin.PluginMeta + plugin.PluginInit + plugin.PluginApi + plugin.PluginModel + plugin.PluginMigration + plugin.PluginSource + plugin.CloseablePluginTask + plugin.DataSourcePluginBlueprintV200 +} = (*Asana)(nil) + +type Asana struct{} + +func (p Asana) Init(basicRes context.BasicRes) errors.Error { + api.Init(basicRes, p) + return nil +} + +func (p Asana) GetTablesInfo() []dal.Tabler { + return []dal.Tabler{ + &models.AsanaConnection{}, + &models.AsanaProject{}, + &models.AsanaScopeConfig{}, + &models.AsanaTask{}, + &models.AsanaSection{}, + &models.AsanaUser{}, + &models.AsanaWorkspace{}, + &models.AsanaTeam{}, + &models.AsanaStory{}, + &models.AsanaTag{}, + &models.AsanaTaskTag{}, + &models.AsanaCustomField{}, + &models.AsanaTaskCustomFieldValue{}, + &models.AsanaProjectMembership{}, + &models.AsanaTeamMembership{}, + } +} + +func (p Asana) Description() string { + return "To collect and enrich data from Asana" +} + +func (p Asana) Name() string { + return "asana" +} + +func (p Asana) SubTaskMetas() []plugin.SubTaskMeta { + return []plugin.SubTaskMeta{ + // Collect and extract in hierarchical order + // 1. Project (scope) + tasks.CollectProjectMeta, + tasks.ExtractProjectMeta, + // 2. Users (project members) + tasks.CollectUserMeta, + tasks.ExtractUserMeta, + // 3. Sections + tasks.CollectSectionMeta, + tasks.ExtractSectionMeta, + // 4. Tasks + tasks.CollectTaskMeta, + tasks.ExtractTaskMeta, + // 5. Subtasks (children of tasks) + tasks.CollectSubtaskMeta, + tasks.ExtractSubtaskMeta, + // 6. Stories (comments on tasks) + tasks.CollectStoryMeta, + tasks.ExtractStoryMeta, + // 7. Tags (on tasks) + tasks.CollectTagMeta, + tasks.ExtractTagMeta, + // Convert to domain layer + tasks.ConvertProjectMeta, + tasks.ConvertUserMeta, + tasks.ConvertTaskMeta, + tasks.ConvertStoryMeta, + } +} + +func (p Asana) PrepareTaskData(taskCtx plugin.TaskContext, options map[string]interface{}) (interface{}, errors.Error) { + var op tasks.AsanaOptions + err := helper.Decode(options, &op, nil) + if err != nil { + return nil, errors.Default.Wrap(err, "Asana plugin could not decode options") + } + if op.ProjectId == "" { + return nil, errors.BadInput.New("asana projectId is required") + } + if op.ConnectionId == 0 { + return nil, errors.BadInput.New("asana connectionId is invalid") + } + connection := &models.AsanaConnection{} + connectionHelper := helper.NewConnectionHelper(taskCtx, nil, p.Name()) + err = connectionHelper.FirstById(connection, op.ConnectionId) + if err != nil { + return nil, errors.Default.Wrap(err, "error getting connection for Asana plugin") + } + apiClient, err := tasks.CreateApiClient(taskCtx, connection) + if err != nil { + return nil, err + } + return &tasks.AsanaTaskData{ + Options: &op, + ApiClient: apiClient, + }, nil +} + +func (p Asana) RootPkgPath() string { + return "github.com/apache/incubator-devlake/plugins/asana" +} + +func (p Asana) MigrationScripts() []plugin.MigrationScript { + return migrationscripts.All() +} + +func (p Asana) Connection() dal.Tabler { + return &models.AsanaConnection{} +} + +func (p Asana) Scope() plugin.ToolLayerScope { + return &models.AsanaProject{} +} + +func (p Asana) ScopeConfig() dal.Tabler { + return &models.AsanaScopeConfig{} +} + +func (p Asana) ApiResources() map[string]map[string]plugin.ApiResourceHandler { + return map[string]map[string]plugin.ApiResourceHandler{ + "test": { + "POST": api.TestConnection, + }, + "connections": { + "POST": api.PostConnections, + "GET": api.ListConnections, + }, + "connections/:connectionId": { + "PATCH": api.PatchConnection, + "DELETE": api.DeleteConnection, + "GET": api.GetConnection, + }, + "connections/:connectionId/test": { + "POST": api.TestExistingConnection, + }, + "connections/:connectionId/proxy/rest/*path": { + "GET": api.Proxy, + }, + "connections/:connectionId/remote-scopes": { + "GET": api.RemoteScopes, + }, + "connections/:connectionId/scope-configs": { + "POST": api.PostScopeConfig, + "GET": api.GetScopeConfigList, + }, + "connections/:connectionId/scope-configs/:scopeConfigId": { + "PATCH": api.PatchScopeConfig, + "GET": api.GetScopeConfig, + "DELETE": api.DeleteScopeConfig, + }, + "connections/:connectionId/scopes/:scopeId": { + "GET": api.GetScope, + "PATCH": api.PatchScope, + "DELETE": api.DeleteScope, + }, + "connections/:connectionId/scopes": { + "GET": api.GetScopeList, + "PUT": api.PutScopes, + }, + "scope-config/:scopeConfigId/projects": { + "GET": api.GetProjectsByScopeConfig, + }, + } +} + +func (p Asana) MakeDataSourcePipelinePlanV200( + connectionId uint64, + scopes []*coreModels.BlueprintScope, +) (coreModels.PipelinePlan, []plugin.Scope, errors.Error) { + return api.MakePipelinePlanV200(p.SubTaskMetas(), connectionId, scopes) +} + +func (p Asana) Close(taskCtx plugin.TaskContext) errors.Error { + data, ok := taskCtx.GetData().(*tasks.AsanaTaskData) + if !ok { + return errors.Default.New(fmt.Sprintf("GetData failed when try to close %+v", taskCtx)) + } + data.ApiClient.Release() + return nil +} diff --git a/backend/plugins/asana/models/connection.go b/backend/plugins/asana/models/connection.go new file mode 100644 index 00000000000..ecd49f1aa7a --- /dev/null +++ b/backend/plugins/asana/models/connection.go @@ -0,0 +1,71 @@ +/* +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 models + +import ( + "fmt" + "net/http" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/utils" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" +) + +// AsanaConn holds the essential information to connect to the Asana API +type AsanaConn struct { + helper.RestConnection `mapstructure:",squash"` + Token string `mapstructure:"token" json:"token" encrypt:"yes"` +} + +func (ac *AsanaConn) Sanitize() AsanaConn { + ac.Token = utils.SanitizeString(ac.Token) + return *ac +} + +// AsanaConnection holds AsanaConn plus ID/Name for database storage +type AsanaConnection struct { + helper.BaseConnection `mapstructure:",squash"` + AsanaConn `mapstructure:",squash"` +} + +func (connection *AsanaConnection) MergeFromRequest(target *AsanaConnection, body map[string]interface{}) error { + token := target.Token + if err := helper.DecodeMapStruct(body, target, true); err != nil { + return err + } + modifiedToken := target.Token + if modifiedToken == "" || modifiedToken == utils.SanitizeString(token) { + target.Token = token + } + return nil +} + +func (connection AsanaConnection) Sanitize() AsanaConnection { + connection.AsanaConn = connection.AsanaConn.Sanitize() + return connection +} + +// SetupAuthentication sets up the HTTP Request Authentication (Bearer token) +func (ac *AsanaConn) SetupAuthentication(req *http.Request) errors.Error { + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", ac.Token)) + return nil +} + +func (AsanaConnection) TableName() string { + return "_tool_asana_connections" +} diff --git a/backend/plugins/asana/models/custom_field.go b/backend/plugins/asana/models/custom_field.go new file mode 100644 index 00000000000..aabade05f84 --- /dev/null +++ b/backend/plugins/asana/models/custom_field.go @@ -0,0 +1,59 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" +) + +// AsanaCustomField represents a custom field definition +type AsanaCustomField struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + ResourceSubtype string `gorm:"type:varchar(32)"` + Type string `gorm:"type:varchar(32)"` + Description string `gorm:"type:text"` + Precision int `json:"precision"` + IsGlobalToWorkspace bool `json:"isGlobalToWorkspace"` + HasNotificationsEnabled bool `json:"hasNotificationsEnabled"` + common.NoPKModel +} + +func (AsanaCustomField) TableName() string { + return "_tool_asana_custom_fields" +} + +// AsanaTaskCustomFieldValue represents a custom field value on a task +type AsanaTaskCustomFieldValue struct { + ConnectionId uint64 `gorm:"primaryKey"` + TaskGid string `gorm:"primaryKey;type:varchar(255)"` + CustomFieldGid string `gorm:"primaryKey;type:varchar(255)"` + CustomFieldName string `gorm:"type:varchar(255)"` + DisplayValue string `gorm:"type:text"` + TextValue string `gorm:"type:text"` + NumberValue *float64 `json:"numberValue"` + EnumValueGid string `gorm:"type:varchar(255)"` + EnumValueName string `gorm:"type:varchar(255)"` + common.NoPKModel +} + +func (AsanaTaskCustomFieldValue) TableName() string { + return "_tool_asana_task_custom_field_values" +} diff --git a/backend/plugins/asana/models/membership.go b/backend/plugins/asana/models/membership.go new file mode 100644 index 00000000000..572e2464ecd --- /dev/null +++ b/backend/plugins/asana/models/membership.go @@ -0,0 +1,48 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" +) + +// AsanaProjectMembership links users to projects with their role +type AsanaProjectMembership struct { + ConnectionId uint64 `gorm:"primaryKey"` + ProjectGid string `gorm:"primaryKey;type:varchar(255)"` + UserGid string `gorm:"primaryKey;type:varchar(255)"` + Role string `gorm:"type:varchar(32)"` + common.NoPKModel +} + +func (AsanaProjectMembership) TableName() string { + return "_tool_asana_project_memberships" +} + +// AsanaTeamMembership links users to teams +type AsanaTeamMembership struct { + ConnectionId uint64 `gorm:"primaryKey"` + TeamGid string `gorm:"primaryKey;type:varchar(255)"` + UserGid string `gorm:"primaryKey;type:varchar(255)"` + IsGuest bool `json:"isGuest"` + common.NoPKModel +} + +func (AsanaTeamMembership) TableName() string { + return "_tool_asana_team_memberships" +} diff --git a/backend/plugins/asana/models/migrationscripts/20250203_add_init_tables.go b/backend/plugins/asana/models/migrationscripts/20250203_add_init_tables.go new file mode 100644 index 00000000000..a2dae698bd0 --- /dev/null +++ b/backend/plugins/asana/models/migrationscripts/20250203_add_init_tables.go @@ -0,0 +1,56 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/helpers/migrationhelper" + "github.com/apache/incubator-devlake/plugins/asana/models/migrationscripts/archived" +) + +type addInitTables struct{} + +func (*addInitTables) Up(basicRes context.BasicRes) errors.Error { + return migrationhelper.AutoMigrateTables( + basicRes, + &archived.AsanaConnection{}, + &archived.AsanaProject{}, + &archived.AsanaScopeConfig{}, + &archived.AsanaTask{}, + &archived.AsanaSection{}, + &archived.AsanaUser{}, + &archived.AsanaWorkspace{}, + &archived.AsanaTeam{}, + &archived.AsanaStory{}, + &archived.AsanaTag{}, + &archived.AsanaTaskTag{}, + &archived.AsanaCustomField{}, + &archived.AsanaTaskCustomFieldValue{}, + &archived.AsanaProjectMembership{}, + &archived.AsanaTeamMembership{}, + ) +} + +func (*addInitTables) Version() uint64 { + return 20250203000001 +} + +func (*addInitTables) Name() string { + return "asana init schemas" +} diff --git a/backend/plugins/asana/models/migrationscripts/20250212_add_missing_tables.go b/backend/plugins/asana/models/migrationscripts/20250212_add_missing_tables.go new file mode 100644 index 00000000000..35c482d271c --- /dev/null +++ b/backend/plugins/asana/models/migrationscripts/20250212_add_missing_tables.go @@ -0,0 +1,51 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/helpers/migrationhelper" + "github.com/apache/incubator-devlake/plugins/asana/models/migrationscripts/archived" +) + +type addMissingTables struct{} + +func (*addMissingTables) Up(basicRes context.BasicRes) errors.Error { + // Add all the new tables that were added after the initial migration + return migrationhelper.AutoMigrateTables( + basicRes, + &archived.AsanaWorkspace{}, + &archived.AsanaTeam{}, + &archived.AsanaStory{}, + &archived.AsanaTag{}, + &archived.AsanaTaskTag{}, + &archived.AsanaCustomField{}, + &archived.AsanaTaskCustomFieldValue{}, + &archived.AsanaProjectMembership{}, + &archived.AsanaTeamMembership{}, + ) +} + +func (*addMissingTables) Version() uint64 { + return 20250212000002 +} + +func (*addMissingTables) Name() string { + return "asana add missing tables for hierarchical data" +} diff --git a/backend/plugins/asana/models/migrationscripts/20250212_add_scope_config_issue_type_fields.go b/backend/plugins/asana/models/migrationscripts/20250212_add_scope_config_issue_type_fields.go new file mode 100644 index 00000000000..e092290c6ad --- /dev/null +++ b/backend/plugins/asana/models/migrationscripts/20250212_add_scope_config_issue_type_fields.go @@ -0,0 +1,51 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" +) + +var _ plugin.MigrationScript = (*addScopeConfigIssueTypeFields)(nil) + +type addScopeConfigIssueTypeFields struct{} + +type asanaScopeConfig20250212v2 struct { + IssueTypeRequirement string `gorm:"type:varchar(255)"` + IssueTypeBug string `gorm:"type:varchar(255)"` + IssueTypeIncident string `gorm:"type:varchar(255)"` +} + +func (asanaScopeConfig20250212v2) TableName() string { + return "_tool_asana_scope_configs" +} + +func (*addScopeConfigIssueTypeFields) Up(basicRes context.BasicRes) errors.Error { + db := basicRes.GetDal() + return db.AutoMigrate(&asanaScopeConfig20250212v2{}) +} + +func (*addScopeConfigIssueTypeFields) Version() uint64 { + return 20250212000004 +} + +func (*addScopeConfigIssueTypeFields) Name() string { + return "asana add issue type fields to scope config" +} diff --git a/backend/plugins/asana/models/migrationscripts/20250212_add_task_transformation_fields.go b/backend/plugins/asana/models/migrationscripts/20250212_add_task_transformation_fields.go new file mode 100644 index 00000000000..7af1404489b --- /dev/null +++ b/backend/plugins/asana/models/migrationscripts/20250212_add_task_transformation_fields.go @@ -0,0 +1,71 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" +) + +var _ plugin.MigrationScript = (*addTaskTransformationFields)(nil) + +type addTaskTransformationFields struct{} + +type asanaTask20250212 struct { + SectionName string `gorm:"type:varchar(255)"` + StdType string `gorm:"type:varchar(255)"` + StdStatus string `gorm:"type:varchar(255)"` + Priority string `gorm:"type:varchar(255)"` + StoryPoint *float64 `gorm:"type:double"` + Severity string `gorm:"type:varchar(255)"` + LeadTimeMinutes *uint `gorm:"type:int unsigned"` +} + +func (asanaTask20250212) TableName() string { + return "_tool_asana_tasks" +} + +type asanaScopeConfig20250212 struct { + // Regex patterns for tag-based type classification (like GitHub) + IssueTypeRequirement string `gorm:"type:varchar(255)"` + IssueTypeBug string `gorm:"type:varchar(255)"` + IssueTypeIncident string `gorm:"type:varchar(255)"` +} + +func (asanaScopeConfig20250212) TableName() string { + return "_tool_asana_scope_configs" +} + +func (*addTaskTransformationFields) Up(basicRes context.BasicRes) errors.Error { + db := basicRes.GetDal() + // Add transformation fields to tasks table + if err := db.AutoMigrate(&asanaTask20250212{}); err != nil { + return err + } + // Add transformation config fields to scope_configs table + return db.AutoMigrate(&asanaScopeConfig20250212{}) +} + +func (*addTaskTransformationFields) Version() uint64 { + return 20250212000003 +} + +func (*addTaskTransformationFields) Name() string { + return "asana add task transformation fields for issue tracking" +} diff --git a/backend/plugins/asana/models/migrationscripts/20250212_add_user_photo_url.go b/backend/plugins/asana/models/migrationscripts/20250212_add_user_photo_url.go new file mode 100644 index 00000000000..fc87c9fa1aa --- /dev/null +++ b/backend/plugins/asana/models/migrationscripts/20250212_add_user_photo_url.go @@ -0,0 +1,51 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" +) + +var _ plugin.MigrationScript = (*addUserPhotoUrl)(nil) + +type addUserPhotoUrl struct{} + +type asanaUser20250212 struct { + PhotoUrl string `gorm:"type:varchar(512)"` + WorkspaceGids string `gorm:"type:text"` +} + +func (asanaUser20250212) TableName() string { + return "_tool_asana_users" +} + +func (*addUserPhotoUrl) Up(basicRes context.BasicRes) errors.Error { + db := basicRes.GetDal() + // Add photo_url and workspace_gids columns to _tool_asana_users table + return db.AutoMigrate(&asanaUser20250212{}) +} + +func (*addUserPhotoUrl) Version() uint64 { + return 20250212000001 +} + +func (*addUserPhotoUrl) Name() string { + return "asana add photo_url and workspace_gids to users table" +} diff --git a/backend/plugins/asana/models/migrationscripts/20250219_add_connection_id_to_scope_configs.go b/backend/plugins/asana/models/migrationscripts/20250219_add_connection_id_to_scope_configs.go new file mode 100644 index 00000000000..dff72ee5c15 --- /dev/null +++ b/backend/plugins/asana/models/migrationscripts/20250219_add_connection_id_to_scope_configs.go @@ -0,0 +1,51 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" +) + +var _ plugin.MigrationScript = (*addConnectionIdToAsanaScopeConfigs)(nil) + +// asanaScopeConfig20250219 adds connection_id and name to match common.ScopeConfig. +// The init migration used archived.ScopeConfig which did not have these columns. +type asanaScopeConfig20250219 struct { + ConnectionId uint64 `json:"connectionId" gorm:"index" mapstructure:"connectionId,omitempty"` + Name string `mapstructure:"name" json:"name" gorm:"type:varchar(255);uniqueIndex"` +} + +func (asanaScopeConfig20250219) TableName() string { + return "_tool_asana_scope_configs" +} + +type addConnectionIdToAsanaScopeConfigs struct{} + +func (*addConnectionIdToAsanaScopeConfigs) Up(basicRes context.BasicRes) errors.Error { + return basicRes.GetDal().AutoMigrate(&asanaScopeConfig20250219{}) +} + +func (*addConnectionIdToAsanaScopeConfigs) Version() uint64 { + return 20250219000001 +} + +func (*addConnectionIdToAsanaScopeConfigs) Name() string { + return "add connection_id and name to _tool_asana_scope_configs" +} diff --git a/backend/plugins/asana/models/migrationscripts/archived/models.go b/backend/plugins/asana/models/migrationscripts/archived/models.go new file mode 100644 index 00000000000..1551cad6115 --- /dev/null +++ b/backend/plugins/asana/models/migrationscripts/archived/models.go @@ -0,0 +1,264 @@ +/* +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 archived + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/migrationscripts/archived" +) + +type AsanaConnection struct { + archived.Model + Name string `gorm:"type:varchar(150);uniqueIndex" json:"name" validate:"required"` + Endpoint string `mapstructure:"endpoint" json:"endpoint" validate:"required"` + Proxy string `mapstructure:"proxy" json:"proxy"` + RateLimitPerHour int `comment:"api request rate limit per hour" json:"rateLimitPerHour"` + Token string `mapstructure:"token" json:"token" gorm:"serializer:encdec" encrypt:"yes"` +} + +func (AsanaConnection) TableName() string { + return "_tool_asana_connections" +} + +type AsanaProject struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `json:"gid" gorm:"type:varchar(255);primaryKey"` + Name string `json:"name" gorm:"type:varchar(255)"` + ResourceType string `json:"resourceType" gorm:"type:varchar(32)"` + Archived bool `json:"archived"` + WorkspaceGid string `json:"workspaceGid" gorm:"type:varchar(255)"` + PermalinkUrl string `json:"permalinkUrl" gorm:"type:varchar(512)"` + ScopeConfigId uint64 `json:"scopeConfigId,omitempty" mapstructure:"scopeConfigId"` + archived.NoPKModel +} + +func (AsanaProject) TableName() string { + return "_tool_asana_projects" +} + +type AsanaScopeConfig struct { + archived.ScopeConfig + IssueTypeRequirement string `mapstructure:"issueTypeRequirement,omitempty" json:"issueTypeRequirement" gorm:"type:varchar(255)"` + IssueTypeBug string `mapstructure:"issueTypeBug,omitempty" json:"issueTypeBug" gorm:"type:varchar(255)"` + IssueTypeIncident string `mapstructure:"issueTypeIncident,omitempty" json:"issueTypeIncident" gorm:"type:varchar(255)"` +} + +func (AsanaScopeConfig) TableName() string { + return "_tool_asana_scope_configs" +} + +type AsanaTask struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(512)"` + Notes string `gorm:"type:text"` + ResourceType string `gorm:"type:varchar(32)"` + ResourceSubtype string `gorm:"type:varchar(32)"` + Completed bool `json:"completed"` + CompletedAt *time.Time `json:"completedAt"` + DueOn *time.Time `gorm:"type:date" json:"dueOn"` + CreatedAt time.Time `json:"createdAt"` + ModifiedAt *time.Time `json:"modifiedAt"` + PermalinkUrl string `gorm:"type:varchar(512)"` + ProjectGid string `gorm:"type:varchar(255);index"` + SectionGid string `gorm:"type:varchar(255);index"` + SectionName string `gorm:"type:varchar(255)"` + AssigneeGid string `gorm:"type:varchar(255)"` + AssigneeName string `gorm:"type:varchar(255)"` + CreatorGid string `gorm:"type:varchar(255)"` + CreatorName string `gorm:"type:varchar(255)"` + ParentGid string `gorm:"type:varchar(255);index"` + NumSubtasks int `json:"numSubtasks"` + StdType string `gorm:"type:varchar(255)"` + StdStatus string `gorm:"type:varchar(255)"` + Priority string `gorm:"type:varchar(255)"` + StoryPoint *float64 `json:"storyPoint"` + Severity string `gorm:"type:varchar(255)"` + LeadTimeMinutes *uint `json:"leadTimeMinutes"` + archived.NoPKModel +} + +func (AsanaTask) TableName() string { + return "_tool_asana_tasks" +} + +type AsanaSection struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + ProjectGid string `gorm:"type:varchar(255);index"` + archived.NoPKModel +} + +func (AsanaSection) TableName() string { + return "_tool_asana_sections" +} + +type AsanaUser struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + Email string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + PhotoUrl string `gorm:"type:varchar(512)"` + WorkspaceGids string `gorm:"type:text"` + archived.NoPKModel +} + +func (AsanaUser) TableName() string { + return "_tool_asana_users" +} + +type AsanaWorkspace struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + IsOrganization bool `json:"isOrganization"` + archived.NoPKModel +} + +func (AsanaWorkspace) TableName() string { + return "_tool_asana_workspaces" +} + +type AsanaTeam struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + Description string `gorm:"type:text"` + HtmlDescription string `gorm:"type:text"` + OrganizationGid string `gorm:"type:varchar(255);index"` + PermalinkUrl string `gorm:"type:varchar(512)"` + archived.NoPKModel +} + +func (AsanaTeam) TableName() string { + return "_tool_asana_teams" +} + +type AsanaStory struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + ResourceSubtype string `gorm:"type:varchar(64)"` + Text string `gorm:"type:text"` + HtmlText string `gorm:"type:text"` + IsPinned bool `json:"isPinned"` + IsEdited bool `json:"isEdited"` + StickerName string `gorm:"type:varchar(64)"` + CreatedAt time.Time `json:"createdAt"` + CreatedByGid string `gorm:"type:varchar(255)"` + CreatedByName string `gorm:"type:varchar(255)"` + TaskGid string `gorm:"type:varchar(255);index"` + TargetGid string `gorm:"type:varchar(255);index"` + archived.NoPKModel +} + +func (AsanaStory) TableName() string { + return "_tool_asana_stories" +} + +type AsanaTag struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + Color string `gorm:"type:varchar(32)"` + Notes string `gorm:"type:text"` + WorkspaceGid string `gorm:"type:varchar(255);index"` + PermalinkUrl string `gorm:"type:varchar(512)"` + archived.NoPKModel +} + +func (AsanaTag) TableName() string { + return "_tool_asana_tags" +} + +type AsanaTaskTag struct { + ConnectionId uint64 `gorm:"primaryKey"` + TaskGid string `gorm:"primaryKey;type:varchar(255)"` + TagGid string `gorm:"primaryKey;type:varchar(255)"` + archived.NoPKModel +} + +func (AsanaTaskTag) TableName() string { + return "_tool_asana_task_tags" +} + +type AsanaCustomField struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + ResourceSubtype string `gorm:"type:varchar(32)"` + Type string `gorm:"type:varchar(32)"` + Description string `gorm:"type:text"` + Precision int `json:"precision"` + IsGlobalToWorkspace bool `json:"isGlobalToWorkspace"` + HasNotificationsEnabled bool `json:"hasNotificationsEnabled"` + archived.NoPKModel +} + +func (AsanaCustomField) TableName() string { + return "_tool_asana_custom_fields" +} + +type AsanaTaskCustomFieldValue struct { + ConnectionId uint64 `gorm:"primaryKey"` + TaskGid string `gorm:"primaryKey;type:varchar(255)"` + CustomFieldGid string `gorm:"primaryKey;type:varchar(255)"` + CustomFieldName string `gorm:"type:varchar(255)"` + DisplayValue string `gorm:"type:text"` + TextValue string `gorm:"type:text"` + NumberValue *float64 `json:"numberValue"` + EnumValueGid string `gorm:"type:varchar(255)"` + EnumValueName string `gorm:"type:varchar(255)"` + archived.NoPKModel +} + +func (AsanaTaskCustomFieldValue) TableName() string { + return "_tool_asana_task_custom_field_values" +} + +type AsanaProjectMembership struct { + ConnectionId uint64 `gorm:"primaryKey"` + ProjectGid string `gorm:"primaryKey;type:varchar(255)"` + UserGid string `gorm:"primaryKey;type:varchar(255)"` + Role string `gorm:"type:varchar(32)"` + archived.NoPKModel +} + +func (AsanaProjectMembership) TableName() string { + return "_tool_asana_project_memberships" +} + +type AsanaTeamMembership struct { + ConnectionId uint64 `gorm:"primaryKey"` + TeamGid string `gorm:"primaryKey;type:varchar(255)"` + UserGid string `gorm:"primaryKey;type:varchar(255)"` + IsGuest bool `json:"isGuest"` + archived.NoPKModel +} + +func (AsanaTeamMembership) TableName() string { + return "_tool_asana_team_memberships" +} diff --git a/backend/plugins/asana/models/migrationscripts/register.go b/backend/plugins/asana/models/migrationscripts/register.go new file mode 100644 index 00000000000..9d25d2ed5b3 --- /dev/null +++ b/backend/plugins/asana/models/migrationscripts/register.go @@ -0,0 +1,34 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/plugin" +) + +// All return all the migration scripts +func All() []plugin.MigrationScript { + return []plugin.MigrationScript{ + new(addInitTables), + new(addUserPhotoUrl), + new(addMissingTables), + new(addTaskTransformationFields), + new(addScopeConfigIssueTypeFields), + new(addConnectionIdToAsanaScopeConfigs), + } +} diff --git a/backend/plugins/asana/models/project.go b/backend/plugins/asana/models/project.go new file mode 100644 index 00000000000..498bcd97ef1 --- /dev/null +++ b/backend/plugins/asana/models/project.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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/plugin" +) + +var _ plugin.ToolLayerScope = (*AsanaProject)(nil) + +type AsanaProject struct { + common.Scope `mapstructure:",squash"` + Gid string `json:"gid" mapstructure:"gid" gorm:"type:varchar(255);primaryKey"` + Name string `json:"name" mapstructure:"name" gorm:"type:varchar(255)"` + ResourceType string `json:"resourceType" mapstructure:"resourceType" gorm:"type:varchar(32)"` + Archived bool `json:"archived" mapstructure:"archived"` + WorkspaceGid string `json:"workspaceGid" mapstructure:"workspaceGid" gorm:"type:varchar(255)"` + PermalinkUrl string `json:"permalinkUrl" mapstructure:"permalinkUrl" gorm:"type:varchar(512)"` +} + +func (p AsanaProject) ScopeId() string { + return p.Gid +} + +func (p AsanaProject) ScopeName() string { + return p.Name +} + +func (p AsanaProject) ScopeFullName() string { + return p.Name +} + +func (p AsanaProject) ScopeParams() interface{} { + return &AsanaApiParams{ + ConnectionId: p.ConnectionId, + ProjectId: p.Gid, + } +} + +func (AsanaProject) TableName() string { + return "_tool_asana_projects" +} + +type AsanaApiParams struct { + ConnectionId uint64 + ProjectId string +} diff --git a/backend/plugins/asana/models/scope_config.go b/backend/plugins/asana/models/scope_config.go new file mode 100644 index 00000000000..560e645a5e5 --- /dev/null +++ b/backend/plugins/asana/models/scope_config.go @@ -0,0 +1,41 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" +) + +type AsanaScopeConfig struct { + common.ScopeConfig `mapstructure:",squash" json:",inline" gorm:"embedded"` + + // Issue type mapping using regex patterns (like GitHub) + // Tags matching these patterns will classify the task type + IssueTypeRequirement string `mapstructure:"issueTypeRequirement,omitempty" json:"issueTypeRequirement" gorm:"type:varchar(255)"` + IssueTypeBug string `mapstructure:"issueTypeBug,omitempty" json:"issueTypeBug" gorm:"type:varchar(255)"` + IssueTypeIncident string `mapstructure:"issueTypeIncident,omitempty" json:"issueTypeIncident" gorm:"type:varchar(255)"` +} + +func (AsanaScopeConfig) TableName() string { + return "_tool_asana_scope_configs" +} + +func (a *AsanaScopeConfig) SetConnectionId(c *AsanaScopeConfig, connectionId uint64) { + c.ConnectionId = connectionId + c.ScopeConfig.ConnectionId = connectionId +} diff --git a/backend/plugins/asana/models/section.go b/backend/plugins/asana/models/section.go new file mode 100644 index 00000000000..3ebc17b8a1b --- /dev/null +++ b/backend/plugins/asana/models/section.go @@ -0,0 +1,35 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" +) + +type AsanaSection struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + ProjectGid string `gorm:"type:varchar(255);index"` + common.NoPKModel +} + +func (AsanaSection) TableName() string { + return "_tool_asana_sections" +} diff --git a/backend/plugins/asana/models/story.go b/backend/plugins/asana/models/story.go new file mode 100644 index 00000000000..41386a41e24 --- /dev/null +++ b/backend/plugins/asana/models/story.go @@ -0,0 +1,47 @@ +/* +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 models + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/common" +) + +// AsanaStory represents comments and system-generated stories on tasks +type AsanaStory struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + ResourceSubtype string `gorm:"type:varchar(64)"` + Text string `gorm:"type:text"` + HtmlText string `gorm:"type:text"` + IsPinned bool `json:"isPinned"` + IsEdited bool `json:"isEdited"` + StickerName string `gorm:"type:varchar(64)"` + CreatedAt time.Time `json:"createdAt"` + CreatedByGid string `gorm:"type:varchar(255)"` + CreatedByName string `gorm:"type:varchar(255)"` + TaskGid string `gorm:"type:varchar(255);index"` + TargetGid string `gorm:"type:varchar(255);index"` + common.NoPKModel +} + +func (AsanaStory) TableName() string { + return "_tool_asana_stories" +} diff --git a/backend/plugins/asana/models/tag.go b/backend/plugins/asana/models/tag.go new file mode 100644 index 00000000000..2ab29555ad2 --- /dev/null +++ b/backend/plugins/asana/models/tag.go @@ -0,0 +1,50 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" +) + +type AsanaTag struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + Color string `gorm:"type:varchar(32)"` + Notes string `gorm:"type:text"` + WorkspaceGid string `gorm:"type:varchar(255);index"` + PermalinkUrl string `gorm:"type:varchar(512)"` + common.NoPKModel +} + +func (AsanaTag) TableName() string { + return "_tool_asana_tags" +} + +// AsanaTaskTag is a many-to-many relationship between tasks and tags +type AsanaTaskTag struct { + ConnectionId uint64 `gorm:"primaryKey"` + TaskGid string `gorm:"primaryKey;type:varchar(255)"` + TagGid string `gorm:"primaryKey;type:varchar(255)"` + common.NoPKModel +} + +func (AsanaTaskTag) TableName() string { + return "_tool_asana_task_tags" +} diff --git a/backend/plugins/asana/models/task.go b/backend/plugins/asana/models/task.go new file mode 100644 index 00000000000..fce6bd9388b --- /dev/null +++ b/backend/plugins/asana/models/task.go @@ -0,0 +1,66 @@ +/* +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 models + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/common" +) + +type AsanaTask struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(512)"` + Notes string `gorm:"type:text"` + ResourceType string `gorm:"type:varchar(32)"` + ResourceSubtype string `gorm:"type:varchar(32)"` // default_task, milestone, section, approval + Completed bool `json:"completed"` + CompletedAt *time.Time `json:"completedAt"` + DueOn *time.Time `gorm:"type:date" json:"dueOn"` + CreatedAt time.Time `json:"createdAt"` + ModifiedAt *time.Time `json:"modifiedAt"` + PermalinkUrl string `gorm:"type:varchar(512)"` + ProjectGid string `gorm:"type:varchar(255);index"` + SectionGid string `gorm:"type:varchar(255);index"` + SectionName string `gorm:"type:varchar(255)"` // For status mapping + AssigneeGid string `gorm:"type:varchar(255)"` + AssigneeName string `gorm:"type:varchar(255)"` + CreatorGid string `gorm:"type:varchar(255)"` + CreatorName string `gorm:"type:varchar(255)"` + ParentGid string `gorm:"type:varchar(255);index"` + NumSubtasks int `json:"numSubtasks"` + + // Transformed fields for domain layer + StdType string `gorm:"type:varchar(255)"` // Standard type: REQUIREMENT, BUG, INCIDENT, EPIC, TASK, SUBTASK + StdStatus string `gorm:"type:varchar(255)"` // Standard status: TODO, IN_PROGRESS, DONE + + // Custom field values (extracted during transformation) + Priority string `gorm:"type:varchar(255)"` // Priority from custom field + StoryPoint *float64 `json:"storyPoint"` // Story points from custom field + Severity string `gorm:"type:varchar(255)"` // Severity from custom field + + // Lead time tracking + LeadTimeMinutes *uint `json:"leadTimeMinutes"` + + common.NoPKModel +} + +func (AsanaTask) TableName() string { + return "_tool_asana_tasks" +} diff --git a/backend/plugins/asana/models/team.go b/backend/plugins/asana/models/team.go new file mode 100644 index 00000000000..1488a0fd00c --- /dev/null +++ b/backend/plugins/asana/models/team.go @@ -0,0 +1,38 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" +) + +type AsanaTeam struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + Description string `gorm:"type:text"` + HtmlDescription string `gorm:"type:text"` + OrganizationGid string `gorm:"type:varchar(255);index"` + PermalinkUrl string `gorm:"type:varchar(512)"` + common.NoPKModel +} + +func (AsanaTeam) TableName() string { + return "_tool_asana_teams" +} diff --git a/backend/plugins/asana/models/user.go b/backend/plugins/asana/models/user.go new file mode 100644 index 00000000000..92681195945 --- /dev/null +++ b/backend/plugins/asana/models/user.go @@ -0,0 +1,37 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" +) + +type AsanaUser struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + Email string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + PhotoUrl string `gorm:"type:varchar(512)"` + WorkspaceGids string `gorm:"type:text"` // JSON array of workspace GIDs + common.NoPKModel +} + +func (AsanaUser) TableName() string { + return "_tool_asana_users" +} diff --git a/backend/plugins/asana/models/workspace.go b/backend/plugins/asana/models/workspace.go new file mode 100644 index 00000000000..101c249b358 --- /dev/null +++ b/backend/plugins/asana/models/workspace.go @@ -0,0 +1,35 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/models/common" +) + +type AsanaWorkspace struct { + ConnectionId uint64 `gorm:"primaryKey"` + Gid string `gorm:"primaryKey;type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + ResourceType string `gorm:"type:varchar(32)"` + IsOrganization bool `json:"isOrganization"` + common.NoPKModel +} + +func (AsanaWorkspace) TableName() string { + return "_tool_asana_workspaces" +} diff --git a/backend/plugins/asana/tasks/api_client.go b/backend/plugins/asana/tasks/api_client.go new file mode 100644 index 00000000000..25abd421bdc --- /dev/null +++ b/backend/plugins/asana/tasks/api_client.go @@ -0,0 +1,40 @@ +/* +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/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +func CreateApiClient(taskCtx plugin.TaskContext, connection *models.AsanaConnection) (*api.ApiAsyncClient, errors.Error) { + if connection.GetEndpoint() == "" { + connection.Endpoint = "https://app.asana.com/api/1.0/" + } + apiClient, err := api.NewApiClientFromConnection(taskCtx.GetContext(), taskCtx, connection) + if err != nil { + return nil, err + } + asyncApiClient, err := api.CreateAsyncApiClient(taskCtx, apiClient, nil) + if err != nil { + return nil, err + } + return asyncApiClient, nil +} diff --git a/backend/plugins/asana/tasks/project_collector.go b/backend/plugins/asana/tasks/project_collector.go new file mode 100644 index 00000000000..5ae69a68d63 --- /dev/null +++ b/backend/plugins/asana/tasks/project_collector.go @@ -0,0 +1,75 @@ +/* +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" + "net/http" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +const rawProjectTable = "asana_projects" + +var _ plugin.SubTaskEntryPoint = CollectProject + +var CollectProjectMeta = plugin.SubTaskMeta{ + Name: "CollectProject", + EntryPoint: CollectProject, + EnabledByDefault: true, + Description: "Collect project data from Asana API", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +type asanaDataWrapper struct { + Data json.RawMessage `json:"data"` +} + +func CollectProject(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*AsanaTaskData) + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: rawProjectTable, + }, + ApiClient: data.ApiClient, + UrlTemplate: "projects/{{ .Params.ProjectId }}", + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var w asanaDataWrapper + err := api.UnmarshalResponse(res, &w) + if err != nil { + return nil, err + } + if len(w.Data) == 0 { + return nil, nil + } + return []json.RawMessage{w.Data}, nil + }, + }) + if err != nil { + return err + } + return collector.Execute() +} diff --git a/backend/plugins/asana/tasks/project_convertor.go b/backend/plugins/asana/tasks/project_convertor.go new file mode 100644 index 00000000000..cd6f89576ec --- /dev/null +++ b/backend/plugins/asana/tasks/project_convertor.go @@ -0,0 +1,80 @@ +/* +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 ( + "reflect" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ConvertProject + +var ConvertProjectMeta = plugin.SubTaskMeta{ + Name: "ConvertProject", + EntryPoint: ConvertProject, + EnabledByDefault: true, + Description: "Convert tool layer Asana projects into domain layer boards", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ConvertProject(taskCtx plugin.SubTaskContext) errors.Error { + rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, rawProjectTable) + db := taskCtx.GetDal() + connectionId := data.Options.ConnectionId + projectId := data.Options.ProjectId + + clauses := []dal.Clause{ + dal.From(&models.AsanaProject{}), + dal.Where("connection_id = ? AND gid = ?", connectionId, projectId), + } + cursor, err := db.Cursor(clauses...) + if err != nil { + return err + } + defer cursor.Close() + + boardIdGen := didgen.NewDomainIdGenerator(&models.AsanaProject{}) + + converter, err := helper.NewDataConverter(helper.DataConverterArgs{ + RawDataSubTaskArgs: *rawDataSubTaskArgs, + InputRowType: reflect.TypeOf(models.AsanaProject{}), + Input: cursor, + Convert: func(inputRow interface{}) ([]interface{}, errors.Error) { + toolProject := inputRow.(*models.AsanaProject) + domainBoard := &ticket.Board{ + DomainEntity: domainlayer.DomainEntity{Id: boardIdGen.Generate(toolProject.ConnectionId, toolProject.Gid)}, + Name: toolProject.Name, + Url: toolProject.PermalinkUrl, + Type: "asana", + } + return []interface{}{domainBoard}, nil + }, + }) + if err != nil { + return err + } + return converter.Execute() +} diff --git a/backend/plugins/asana/tasks/project_extractor.go b/backend/plugins/asana/tasks/project_extractor.go new file mode 100644 index 00000000000..dba73b8a654 --- /dev/null +++ b/backend/plugins/asana/tasks/project_extractor.go @@ -0,0 +1,88 @@ +/* +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/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractProject + +var ExtractProjectMeta = plugin.SubTaskMeta{ + Name: "ExtractProject", + EntryPoint: ExtractProject, + EnabledByDefault: true, + Description: "Extract raw data into tool layer table _tool_asana_projects", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +type asanaApiProject struct { + Gid string `json:"gid"` + Name string `json:"name"` + ResourceType string `json:"resource_type"` + Archived bool `json:"archived"` + PermalinkUrl string `json:"permalink_url"` + Workspace *struct { + Gid string `json:"gid"` + } `json:"workspace"` +} + +func ExtractProject(taskCtx plugin.SubTaskContext) errors.Error { + taskData := taskCtx.GetData().(*AsanaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: taskData.Options.ConnectionId, + ProjectId: taskData.Options.ProjectId, + }, + Table: rawProjectTable, + }, + Extract: func(resData *api.RawData) ([]interface{}, errors.Error) { + apiProject := &asanaApiProject{} + err := errors.Convert(json.Unmarshal(resData.Data, apiProject)) + if err != nil { + return nil, err + } + workspaceGid := "" + if apiProject.Workspace != nil { + workspaceGid = apiProject.Workspace.Gid + } + toolProject := &models.AsanaProject{ + Gid: apiProject.Gid, + Name: apiProject.Name, + ResourceType: apiProject.ResourceType, + Archived: apiProject.Archived, + PermalinkUrl: apiProject.PermalinkUrl, + WorkspaceGid: workspaceGid, + } + toolProject.ConnectionId = taskData.Options.ConnectionId + toolProject.ScopeConfigId = taskData.Options.ScopeConfigId + return []interface{}{toolProject}, nil + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/backend/plugins/asana/tasks/section_collector.go b/backend/plugins/asana/tasks/section_collector.go new file mode 100644 index 00000000000..782f47a90b7 --- /dev/null +++ b/backend/plugins/asana/tasks/section_collector.go @@ -0,0 +1,72 @@ +/* +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" + "net/http" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +const rawSectionTable = "asana_sections" + +var _ plugin.SubTaskEntryPoint = CollectSection + +var CollectSectionMeta = plugin.SubTaskMeta{ + Name: "CollectSection", + EntryPoint: CollectSection, + EnabledByDefault: true, + Description: "Collect section data from Asana API", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +type asanaListWrapper struct { + Data []json.RawMessage `json:"data"` +} + +func CollectSection(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*AsanaTaskData) + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: rawSectionTable, + }, + ApiClient: data.ApiClient, + UrlTemplate: "projects/{{ .Params.ProjectId }}/sections", + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var w asanaListWrapper + err := api.UnmarshalResponse(res, &w) + if err != nil { + return nil, err + } + return w.Data, nil + }, + }) + if err != nil { + return err + } + return collector.Execute() +} diff --git a/backend/plugins/asana/tasks/section_extractor.go b/backend/plugins/asana/tasks/section_extractor.go new file mode 100644 index 00000000000..3c6e90a9b55 --- /dev/null +++ b/backend/plugins/asana/tasks/section_extractor.go @@ -0,0 +1,83 @@ +/* +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/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractSection + +var ExtractSectionMeta = plugin.SubTaskMeta{ + Name: "ExtractSection", + EntryPoint: ExtractSection, + EnabledByDefault: true, + Description: "Extract raw data into tool layer table _tool_asana_sections", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +type asanaApiSection struct { + Gid string `json:"gid"` + Name string `json:"name"` + ResourceType string `json:"resource_type"` + Project *struct { + Gid string `json:"gid"` + } `json:"project"` +} + +func ExtractSection(taskCtx plugin.SubTaskContext) errors.Error { + taskData := taskCtx.GetData().(*AsanaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: taskData.Options.ConnectionId, + ProjectId: taskData.Options.ProjectId, + }, + Table: rawSectionTable, + }, + Extract: func(resData *api.RawData) ([]interface{}, errors.Error) { + apiSection := &asanaApiSection{} + err := errors.Convert(json.Unmarshal(resData.Data, apiSection)) + if err != nil { + return nil, err + } + projectGid := taskData.Options.ProjectId + if apiSection.Project != nil { + projectGid = apiSection.Project.Gid + } + toolSection := &models.AsanaSection{ + ConnectionId: taskData.Options.ConnectionId, + Gid: apiSection.Gid, + Name: apiSection.Name, + ResourceType: apiSection.ResourceType, + ProjectGid: projectGid, + } + return []interface{}{toolSection}, nil + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/backend/plugins/asana/tasks/story_collector.go b/backend/plugins/asana/tasks/story_collector.go new file mode 100644 index 00000000000..7fa8896900e --- /dev/null +++ b/backend/plugins/asana/tasks/story_collector.go @@ -0,0 +1,100 @@ +/* +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" + "net/http" + "net/url" + "reflect" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +const rawStoryTable = "asana_stories" + +var _ plugin.SubTaskEntryPoint = CollectStory + +var CollectStoryMeta = plugin.SubTaskMeta{ + Name: "CollectStory", + EntryPoint: CollectStory, + EnabledByDefault: true, + Description: "Collect story/comment data from Asana API for each task", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func CollectStory(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*AsanaTaskData) + db := taskCtx.GetDal() + + // Get all tasks for this project + clauses := []dal.Clause{ + dal.Select("gid"), + dal.From(&models.AsanaTask{}), + dal.Where("connection_id = ? AND project_gid = ?", data.Options.ConnectionId, data.Options.ProjectId), + } + cursor, err := db.Cursor(clauses...) + if err != nil { + return err + } + + iterator, err := api.NewDalCursorIterator(db, cursor, reflect.TypeOf(simpleTask{})) + if err != nil { + return err + } + + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: rawStoryTable, + }, + ApiClient: data.ApiClient, + Input: iterator, + UrlTemplate: "tasks/{{ .Input.Gid }}/stories", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("opt_fields", "gid,resource_type,resource_subtype,text,html_text,is_pinned,is_edited,sticker_name,created_at,created_by,target") + query.Set("limit", "100") + return query, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var resp asanaListResponse + err := api.UnmarshalResponse(res, &resp) + if err != nil { + return nil, err + } + return resp.Data, nil + }, + }) + if err != nil { + return err + } + return collector.Execute() +} + +type simpleTask struct { + Gid string +} diff --git a/backend/plugins/asana/tasks/story_convertor.go b/backend/plugins/asana/tasks/story_convertor.go new file mode 100644 index 00000000000..f5df43b2ab7 --- /dev/null +++ b/backend/plugins/asana/tasks/story_convertor.go @@ -0,0 +1,88 @@ +/* +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 ( + "reflect" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ConvertStory + +var ConvertStoryMeta = plugin.SubTaskMeta{ + Name: "ConvertStory", + EntryPoint: ConvertStory, + EnabledByDefault: true, + Description: "Convert tool layer Asana stories into domain layer issue comments", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ConvertStory(taskCtx plugin.SubTaskContext) errors.Error { + rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, rawStoryTable) + db := taskCtx.GetDal() + connectionId := data.Options.ConnectionId + projectId := data.Options.ProjectId + + // Only convert comment-type stories (not system-generated ones) + clauses := []dal.Clause{ + dal.From(&models.AsanaStory{}), + dal.Join("LEFT JOIN _tool_asana_tasks ON _tool_asana_stories.task_gid = _tool_asana_tasks.gid AND _tool_asana_stories.connection_id = _tool_asana_tasks.connection_id"), + dal.Where("_tool_asana_stories.connection_id = ? AND _tool_asana_tasks.project_gid = ? AND _tool_asana_stories.resource_subtype = ?", + connectionId, projectId, "comment_added"), + } + cursor, err := db.Cursor(clauses...) + if err != nil { + return err + } + defer cursor.Close() + + commentIdGen := didgen.NewDomainIdGenerator(&models.AsanaStory{}) + taskIdGen := didgen.NewDomainIdGenerator(&models.AsanaTask{}) + userIdGen := didgen.NewDomainIdGenerator(&models.AsanaUser{}) + + converter, err := helper.NewDataConverter(helper.DataConverterArgs{ + RawDataSubTaskArgs: *rawDataSubTaskArgs, + InputRowType: reflect.TypeOf(models.AsanaStory{}), + Input: cursor, + Convert: func(inputRow interface{}) ([]interface{}, errors.Error) { + toolStory := inputRow.(*models.AsanaStory) + domainComment := &ticket.IssueComment{ + DomainEntity: domainlayer.DomainEntity{Id: commentIdGen.Generate(toolStory.ConnectionId, toolStory.Gid)}, + IssueId: taskIdGen.Generate(toolStory.ConnectionId, toolStory.TaskGid), + Body: toolStory.Text, + CreatedDate: toolStory.CreatedAt, + } + if toolStory.CreatedByGid != "" { + domainComment.AccountId = userIdGen.Generate(toolStory.ConnectionId, toolStory.CreatedByGid) + } + return []interface{}{domainComment}, nil + }, + }) + if err != nil { + return err + } + return converter.Execute() +} diff --git a/backend/plugins/asana/tasks/story_extractor.go b/backend/plugins/asana/tasks/story_extractor.go new file mode 100644 index 00000000000..e0240f2da88 --- /dev/null +++ b/backend/plugins/asana/tasks/story_extractor.go @@ -0,0 +1,119 @@ +/* +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" + "time" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractStory + +var ExtractStoryMeta = plugin.SubTaskMeta{ + Name: "ExtractStory", + EntryPoint: ExtractStory, + EnabledByDefault: true, + Description: "Extract raw data into tool layer table _tool_asana_stories", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +type asanaApiStory struct { + Gid string `json:"gid"` + ResourceType string `json:"resource_type"` + ResourceSubtype string `json:"resource_subtype"` + Text string `json:"text"` + HtmlText string `json:"html_text"` + IsPinned bool `json:"is_pinned"` + IsEdited bool `json:"is_edited"` + StickerName string `json:"sticker_name"` + CreatedAt time.Time `json:"created_at"` + CreatedBy *struct { + Gid string `json:"gid"` + Name string `json:"name"` + } `json:"created_by"` + Target *struct { + Gid string `json:"gid"` + } `json:"target"` +} + +func ExtractStory(taskCtx plugin.SubTaskContext) errors.Error { + taskData := taskCtx.GetData().(*AsanaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: taskData.Options.ConnectionId, + ProjectId: taskData.Options.ProjectId, + }, + Table: rawStoryTable, + }, + Extract: func(resData *api.RawData) ([]interface{}, errors.Error) { + apiStory := &asanaApiStory{} + err := errors.Convert(json.Unmarshal(resData.Data, apiStory)) + if err != nil { + return nil, err + } + + // Extract task GID from input + var input struct { + Gid string `json:"gid"` + } + if err := errors.Convert(json.Unmarshal(resData.Input, &input)); err != nil { + return nil, err + } + + createdByGid := "" + createdByName := "" + if apiStory.CreatedBy != nil { + createdByGid = apiStory.CreatedBy.Gid + createdByName = apiStory.CreatedBy.Name + } + targetGid := "" + if apiStory.Target != nil { + targetGid = apiStory.Target.Gid + } + + toolStory := &models.AsanaStory{ + ConnectionId: taskData.Options.ConnectionId, + Gid: apiStory.Gid, + ResourceType: apiStory.ResourceType, + ResourceSubtype: apiStory.ResourceSubtype, + Text: apiStory.Text, + HtmlText: apiStory.HtmlText, + IsPinned: apiStory.IsPinned, + IsEdited: apiStory.IsEdited, + StickerName: apiStory.StickerName, + CreatedAt: apiStory.CreatedAt, + CreatedByGid: createdByGid, + CreatedByName: createdByName, + TaskGid: input.Gid, + TargetGid: targetGid, + } + return []interface{}{toolStory}, nil + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/backend/plugins/asana/tasks/subtask_collector.go b/backend/plugins/asana/tasks/subtask_collector.go new file mode 100644 index 00000000000..a2f22cd3a1a --- /dev/null +++ b/backend/plugins/asana/tasks/subtask_collector.go @@ -0,0 +1,97 @@ +/* +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" + "net/http" + "net/url" + "reflect" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +const rawSubtaskTable = "asana_subtasks" + +var _ plugin.SubTaskEntryPoint = CollectSubtask + +var CollectSubtaskMeta = plugin.SubTaskMeta{ + Name: "CollectSubtask", + EntryPoint: CollectSubtask, + EnabledByDefault: true, + Description: "Collect subtask data from Asana API for each task", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func CollectSubtask(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*AsanaTaskData) + db := taskCtx.GetDal() + + // Get all tasks that have subtasks + clauses := []dal.Clause{ + dal.Select("gid"), + dal.From(&models.AsanaTask{}), + dal.Where("connection_id = ? AND project_gid = ? AND num_subtasks > 0", + data.Options.ConnectionId, data.Options.ProjectId), + } + cursor, err := db.Cursor(clauses...) + if err != nil { + return err + } + + iterator, err := api.NewDalCursorIterator(db, cursor, reflect.TypeOf(simpleTask{})) + if err != nil { + return err + } + + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: rawSubtaskTable, + }, + ApiClient: data.ApiClient, + Input: iterator, + UrlTemplate: "tasks/{{ .Input.Gid }}/subtasks", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("opt_fields", "gid,name,notes,resource_type,resource_subtype,completed,completed_at,due_on,created_at,modified_at,permalink_url,assignee,created_by,parent,num_subtasks,memberships.section,memberships.project") + query.Set("limit", "100") + return query, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var resp asanaListResponse + err := api.UnmarshalResponse(res, &resp) + if err != nil { + return nil, err + } + return resp.Data, nil + }, + }) + if err != nil { + return err + } + return collector.Execute() +} diff --git a/backend/plugins/asana/tasks/subtask_extractor.go b/backend/plugins/asana/tasks/subtask_extractor.go new file mode 100644 index 00000000000..0e0b310facb --- /dev/null +++ b/backend/plugins/asana/tasks/subtask_extractor.go @@ -0,0 +1,124 @@ +/* +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" + "time" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractSubtask + +var ExtractSubtaskMeta = plugin.SubTaskMeta{ + Name: "ExtractSubtask", + EntryPoint: ExtractSubtask, + EnabledByDefault: true, + Description: "Extract raw subtask data into tool layer table _tool_asana_tasks", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ExtractSubtask(taskCtx plugin.SubTaskContext) errors.Error { + taskData := taskCtx.GetData().(*AsanaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: taskData.Options.ConnectionId, + ProjectId: taskData.Options.ProjectId, + }, + Table: rawSubtaskTable, + }, + Extract: func(resData *api.RawData) ([]interface{}, errors.Error) { + apiTask := &asanaApiTask{} + err := errors.Convert(json.Unmarshal(resData.Data, apiTask)) + if err != nil { + return nil, err + } + + // Get parent GID from input + var input struct { + Gid string `json:"gid"` + } + if err := errors.Convert(json.Unmarshal(resData.Input, &input)); err != nil { + return nil, err + } + + assigneeGid := "" + assigneeName := "" + if apiTask.Assignee != nil { + assigneeGid = apiTask.Assignee.Gid + assigneeName = apiTask.Assignee.Name + } + creatorGid := "" + creatorName := "" + if apiTask.CreatedBy != nil { + creatorGid = apiTask.CreatedBy.Gid + creatorName = apiTask.CreatedBy.Name + } + sectionGid := "" + projectGid := taskData.Options.ProjectId + for _, m := range apiTask.Memberships { + if m.Project != nil { + projectGid = m.Project.Gid + } + if m.Section != nil && m.Section.Gid != "" { + sectionGid = m.Section.Gid + break + } + } + + var dueOn *time.Time + if apiTask.DueOn != "" { + dueOn = parseAsanaDate(apiTask.DueOn) + } + + toolTask := &models.AsanaTask{ + ConnectionId: taskData.Options.ConnectionId, + Gid: apiTask.Gid, + Name: apiTask.Name, + Notes: apiTask.Notes, + ResourceType: apiTask.ResourceType, + ResourceSubtype: apiTask.ResourceSubtype, + Completed: apiTask.Completed, + CompletedAt: apiTask.CompletedAt, + DueOn: dueOn, + CreatedAt: apiTask.CreatedAt, + ModifiedAt: apiTask.ModifiedAt, + PermalinkUrl: apiTask.PermalinkUrl, + ProjectGid: projectGid, + SectionGid: sectionGid, + AssigneeGid: assigneeGid, + AssigneeName: assigneeName, + CreatorGid: creatorGid, + CreatorName: creatorName, + ParentGid: input.Gid, // Parent is the task that has subtasks + NumSubtasks: apiTask.NumSubtasks, + } + return []interface{}{toolTask}, nil + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/backend/plugins/asana/tasks/tag_collector.go b/backend/plugins/asana/tasks/tag_collector.go new file mode 100644 index 00000000000..0f3d218664e --- /dev/null +++ b/backend/plugins/asana/tasks/tag_collector.go @@ -0,0 +1,96 @@ +/* +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" + "net/http" + "net/url" + "reflect" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +const rawTagTable = "asana_tags" + +var _ plugin.SubTaskEntryPoint = CollectTag + +var CollectTagMeta = plugin.SubTaskMeta{ + Name: "CollectTag", + EntryPoint: CollectTag, + EnabledByDefault: true, + Description: "Collect tag data from Asana API for each task", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func CollectTag(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*AsanaTaskData) + db := taskCtx.GetDal() + + // Get all tasks for this project + clauses := []dal.Clause{ + dal.Select("gid"), + dal.From(&models.AsanaTask{}), + dal.Where("connection_id = ? AND project_gid = ?", data.Options.ConnectionId, data.Options.ProjectId), + } + cursor, err := db.Cursor(clauses...) + if err != nil { + return err + } + + iterator, err := api.NewDalCursorIterator(db, cursor, reflect.TypeOf(simpleTask{})) + if err != nil { + return err + } + + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: rawTagTable, + }, + ApiClient: data.ApiClient, + Input: iterator, + UrlTemplate: "tasks/{{ .Input.Gid }}/tags", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("opt_fields", "gid,name,resource_type,color,notes,permalink_url") + query.Set("limit", "100") + return query, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var resp asanaListResponse + err := api.UnmarshalResponse(res, &resp) + if err != nil { + return nil, err + } + return resp.Data, nil + }, + }) + if err != nil { + return err + } + return collector.Execute() +} diff --git a/backend/plugins/asana/tasks/tag_extractor.go b/backend/plugins/asana/tasks/tag_extractor.go new file mode 100644 index 00000000000..3e7db18ac4c --- /dev/null +++ b/backend/plugins/asana/tasks/tag_extractor.go @@ -0,0 +1,98 @@ +/* +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/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractTag + +var ExtractTagMeta = plugin.SubTaskMeta{ + Name: "ExtractTag", + EntryPoint: ExtractTag, + EnabledByDefault: true, + Description: "Extract raw data into tool layer tables _tool_asana_tags and _tool_asana_task_tags", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +type asanaApiTag struct { + Gid string `json:"gid"` + Name string `json:"name"` + ResourceType string `json:"resource_type"` + Color string `json:"color"` + Notes string `json:"notes"` + PermalinkUrl string `json:"permalink_url"` +} + +func ExtractTag(taskCtx plugin.SubTaskContext) errors.Error { + taskData := taskCtx.GetData().(*AsanaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: taskData.Options.ConnectionId, + ProjectId: taskData.Options.ProjectId, + }, + Table: rawTagTable, + }, + Extract: func(resData *api.RawData) ([]interface{}, errors.Error) { + apiTag := &asanaApiTag{} + err := errors.Convert(json.Unmarshal(resData.Data, apiTag)) + if err != nil { + return nil, err + } + + // Get task GID from input + var input struct { + Gid string `json:"gid"` + } + if err := errors.Convert(json.Unmarshal(resData.Input, &input)); err != nil { + return nil, err + } + + toolTag := &models.AsanaTag{ + ConnectionId: taskData.Options.ConnectionId, + Gid: apiTag.Gid, + Name: apiTag.Name, + ResourceType: apiTag.ResourceType, + Color: apiTag.Color, + Notes: apiTag.Notes, + PermalinkUrl: apiTag.PermalinkUrl, + } + + // Create the task-tag relationship + taskTag := &models.AsanaTaskTag{ + ConnectionId: taskData.Options.ConnectionId, + TaskGid: input.Gid, + TagGid: apiTag.Gid, + } + + return []interface{}{toolTag, taskTag}, nil + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/backend/plugins/asana/tasks/task_collector.go b/backend/plugins/asana/tasks/task_collector.go new file mode 100644 index 00000000000..8e1b72c138b --- /dev/null +++ b/backend/plugins/asana/tasks/task_collector.go @@ -0,0 +1,102 @@ +/* +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" + "net/http" + "net/url" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +const rawTaskTable = "asana_tasks" + +var _ plugin.SubTaskEntryPoint = CollectTask + +var CollectTaskMeta = plugin.SubTaskMeta{ + Name: "CollectTask", + EntryPoint: CollectTask, + EnabledByDefault: true, + Description: "Collect task data from Asana API", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +type asanaTaskListResponse struct { + Data []json.RawMessage `json:"data"` + NextPage *struct { + Offset string `json:"offset"` + Path string `json:"path"` + URI string `json:"uri"` + } `json:"next_page"` +} + +func CollectTask(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*AsanaTaskData) + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: rawTaskTable, + }, + ApiClient: data.ApiClient, + PageSize: 100, + UrlTemplate: "projects/{{ .Params.ProjectId }}/tasks", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("limit", "100") + // Request all fields needed for transformation including section name + query.Set("opt_fields", "gid,name,notes,resource_type,resource_subtype,completed,completed_at,due_on,created_at,modified_at,permalink_url,assignee,assignee.name,created_by,created_by.name,parent,num_subtasks,memberships.section,memberships.section.name,memberships.project") + if reqData.CustomData != nil { + if offset, ok := reqData.CustomData.(string); ok && offset != "" { + query.Set("offset", offset) + } + } + return query, nil + }, + GetNextPageCustomData: func(prevReqData *api.RequestData, prevPageResponse *http.Response) (interface{}, errors.Error) { + var resp asanaTaskListResponse + err := api.UnmarshalResponse(prevPageResponse, &resp) + if err != nil { + return nil, err + } + if resp.NextPage != nil && resp.NextPage.Offset != "" { + return resp.NextPage.Offset, nil + } + return nil, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var w asanaTaskListResponse + err := api.UnmarshalResponse(res, &w) + if err != nil { + return nil, err + } + return w.Data, nil + }, + }) + if err != nil { + return err + } + return collector.Execute() +} diff --git a/backend/plugins/asana/tasks/task_convertor.go b/backend/plugins/asana/tasks/task_convertor.go new file mode 100644 index 00000000000..7c981b50d20 --- /dev/null +++ b/backend/plugins/asana/tasks/task_convertor.go @@ -0,0 +1,298 @@ +/* +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 ( + "reflect" + "regexp" + "strings" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ConvertTask + +var ConvertTaskMeta = plugin.SubTaskMeta{ + Name: "ConvertTask", + EntryPoint: ConvertTask, + EnabledByDefault: true, + Description: "Convert tool layer Asana tasks into domain layer issues and board_issues", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ConvertTask(taskCtx plugin.SubTaskContext) errors.Error { + rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, rawTaskTable) + db := taskCtx.GetDal() + connectionId := data.Options.ConnectionId + projectId := data.Options.ProjectId + + // Get scope config for transformation rules + scopeConfig := getScopeConfig(taskCtx) + + // Get tags for tasks + taskTags := getTaskTags(db, connectionId) + + clauses := []dal.Clause{ + dal.From(&models.AsanaTask{}), + dal.Where("connection_id = ? AND project_gid = ?", connectionId, projectId), + } + cursor, err := db.Cursor(clauses...) + if err != nil { + return err + } + defer cursor.Close() + + taskIdGen := didgen.NewDomainIdGenerator(&models.AsanaTask{}) + boardIdGen := didgen.NewDomainIdGenerator(&models.AsanaProject{}) + accountIdGen := didgen.NewDomainIdGenerator(&models.AsanaUser{}) + + converter, err := helper.NewDataConverter(helper.DataConverterArgs{ + RawDataSubTaskArgs: *rawDataSubTaskArgs, + InputRowType: reflect.TypeOf(models.AsanaTask{}), + Input: cursor, + Convert: func(inputRow interface{}) ([]interface{}, errors.Error) { + toolTask := inputRow.(*models.AsanaTask) + + // Get tags for this task + tags := taskTags[toolTask.Gid] + + // Map type and status using scope config and tags + stdType, stdStatus := getStdTypeAndStatus(toolTask, scopeConfig, tags) + + domainIssue := &ticket.Issue{ + DomainEntity: domainlayer.DomainEntity{Id: taskIdGen.Generate(toolTask.ConnectionId, toolTask.Gid)}, + IssueKey: toolTask.Gid, + Title: toolTask.Name, + Description: toolTask.Notes, + Url: toolTask.PermalinkUrl, + Type: stdType, + OriginalType: toolTask.ResourceSubtype, + Status: stdStatus, + OriginalStatus: getOriginalStatus(toolTask), + StoryPoint: toolTask.StoryPoint, + CreatedDate: &toolTask.CreatedAt, + UpdatedDate: toolTask.ModifiedAt, + ResolutionDate: toolTask.CompletedAt, + DueDate: toolTask.DueOn, + CreatorName: toolTask.CreatorName, + AssigneeName: toolTask.AssigneeName, + LeadTimeMinutes: toolTask.LeadTimeMinutes, + } + + // Set creator and assignee IDs + if toolTask.CreatorGid != "" { + domainIssue.CreatorId = accountIdGen.Generate(connectionId, toolTask.CreatorGid) + } + if toolTask.AssigneeGid != "" { + domainIssue.AssigneeId = accountIdGen.Generate(connectionId, toolTask.AssigneeGid) + } + + // Set parent issue ID if this is a subtask + if toolTask.ParentGid != "" { + domainIssue.ParentIssueId = taskIdGen.Generate(connectionId, toolTask.ParentGid) + // If no type determined and has parent, it's a subtask + if stdType == "" || stdType == ticket.TASK { + domainIssue.Type = ticket.SUBTASK + } + } + + // Set subtask flag + domainIssue.IsSubtask = toolTask.ParentGid != "" + + var result []interface{} + result = append(result, domainIssue) + + // Create board issue relationship + boardId := boardIdGen.Generate(connectionId, toolTask.ProjectGid) + boardIssue := &ticket.BoardIssue{ + BoardId: boardId, + IssueId: domainIssue.Id, + } + result = append(result, boardIssue) + + // Create issue assignee if assignee exists + if toolTask.AssigneeGid != "" { + issueAssignee := &ticket.IssueAssignee{ + IssueId: domainIssue.Id, + AssigneeId: domainIssue.AssigneeId, + AssigneeName: toolTask.AssigneeName, + } + result = append(result, issueAssignee) + } + + return result, nil + }, + }) + if err != nil { + return err + } + return converter.Execute() +} + +// getScopeConfig retrieves the scope config for transformation rules +func getScopeConfig(taskCtx plugin.SubTaskContext) *models.AsanaScopeConfig { + logger := taskCtx.GetLogger() + if taskCtx.GetData() == nil { + logger.Info("getScopeConfig: taskCtx.GetData() is nil") + return nil + } + data := taskCtx.GetData().(*AsanaTaskData) + db := taskCtx.GetDal() + + // First try to get by ScopeConfigId from options + if data.Options.ScopeConfigId != 0 { + var scopeConfig models.AsanaScopeConfig + err := db.First(&scopeConfig, dal.Where("id = ?", data.Options.ScopeConfigId)) + if err == nil { + logger.Info("getScopeConfig: Found scope config by ID %d, IssueTypeRequirement=%s, IssueTypeBug=%s, IssueTypeIncident=%s", + data.Options.ScopeConfigId, scopeConfig.IssueTypeRequirement, scopeConfig.IssueTypeBug, scopeConfig.IssueTypeIncident) + return &scopeConfig + } + logger.Info("getScopeConfig: Failed to get scope config by ID %d: %v", data.Options.ScopeConfigId, err) + } else { + logger.Info("getScopeConfig: ScopeConfigId is 0, trying to get from project") + } + + // Try to get scope config from project's scope_config_id + var project models.AsanaProject + err := db.First(&project, dal.Where("connection_id = ? AND gid = ?", data.Options.ConnectionId, data.Options.ProjectId)) + if err != nil { + logger.Info("getScopeConfig: Failed to get project: %v", err) + return nil + } + + if project.ScopeConfigId != 0 { + var scopeConfig models.AsanaScopeConfig + err := db.First(&scopeConfig, dal.Where("id = ?", project.ScopeConfigId)) + if err == nil { + logger.Info("getScopeConfig: Found scope config from project, IssueTypeRequirement=%s, IssueTypeBug=%s, IssueTypeIncident=%s", + scopeConfig.IssueTypeRequirement, scopeConfig.IssueTypeBug, scopeConfig.IssueTypeIncident) + return &scopeConfig + } + logger.Info("getScopeConfig: Failed to get scope config from project: %v", err) + } else { + logger.Info("getScopeConfig: Project has no scope_config_id") + } + + return nil +} + +// getTaskTags retrieves all tags for tasks and returns a map of taskGid -> []tagName +func getTaskTags(db dal.Dal, connectionId uint64) map[string][]string { + result := make(map[string][]string) + + var taskTags []models.AsanaTaskTag + err := db.All(&taskTags, dal.Where("connection_id = ?", connectionId)) + if err != nil { + return result + } + + // Get all tag names + tagNames := make(map[string]string) + var tags []models.AsanaTag + err = db.All(&tags, dal.Where("connection_id = ?", connectionId)) + if err == nil { + for _, tag := range tags { + tagNames[tag.Gid] = tag.Name + } + } + + // Build taskGid -> []tagName map + for _, tt := range taskTags { + if tagName, ok := tagNames[tt.TagGid]; ok { + result[tt.TaskGid] = append(result[tt.TaskGid], tagName) + } + } + + return result +} + +// getStdTypeAndStatus maps Asana task to standard type and status using regex patterns (like GitHub) +func getStdTypeAndStatus(task *models.AsanaTask, scopeConfig *models.AsanaScopeConfig, tags []string) (string, string) { + stdType := ticket.TASK + stdStatus := ticket.TODO + + // Default status based on completion + if task.Completed { + stdStatus = ticket.DONE + } + + // If no scope config, return defaults + if scopeConfig == nil { + return getDefaultType(task), stdStatus + } + + // Combine all tags into a single string for matching + tagString := strings.ToLower(strings.Join(tags, " ")) + + // Match issue type using regex patterns (like GitHub) + if scopeConfig.IssueTypeRequirement != "" && matchPattern(tagString, scopeConfig.IssueTypeRequirement) { + stdType = ticket.REQUIREMENT + } + if scopeConfig.IssueTypeBug != "" && matchPattern(tagString, scopeConfig.IssueTypeBug) { + stdType = ticket.BUG + } + if scopeConfig.IssueTypeIncident != "" && matchPattern(tagString, scopeConfig.IssueTypeIncident) { + stdType = ticket.INCIDENT + } + + // If no type matched and task is a subtask, mark it as subtask + if stdType == ticket.TASK && task.ParentGid != "" { + stdType = ticket.SUBTASK + } + + return stdType, stdStatus +} + +// getDefaultType returns the default type based on task properties +func getDefaultType(task *models.AsanaTask) string { + if task.ParentGid != "" { + return ticket.SUBTASK + } + return ticket.TASK +} + +// matchPattern checks if the input string matches the regex pattern +func matchPattern(input, pattern string) bool { + if pattern == "" { + return false + } + re, err := regexp.Compile("(?i)" + pattern) + if err != nil { + return false + } + return re.MatchString(input) +} + +// getOriginalStatus returns the original status string +func getOriginalStatus(task *models.AsanaTask) string { + if task.Completed { + return "completed" + } + if task.SectionName != "" { + return task.SectionName + } + return "incomplete" +} diff --git a/backend/plugins/asana/tasks/task_data.go b/backend/plugins/asana/tasks/task_data.go new file mode 100644 index 00000000000..b6c82836b7b --- /dev/null +++ b/backend/plugins/asana/tasks/task_data.go @@ -0,0 +1,49 @@ +/* +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/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +func CreateRawDataSubTaskArgs(taskCtx plugin.SubTaskContext, rawTable string) (*api.RawDataSubTaskArgs, *AsanaTaskData) { + data := taskCtx.GetData().(*AsanaTaskData) + params := models.AsanaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + } + return &api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: params, + Table: rawTable, + }, data +} + +type AsanaOptions struct { + ConnectionId uint64 `json:"connectionId" mapstructure:"connectionId"` + ProjectId string `json:"projectId" mapstructure:"projectId"` + ScopeConfigId uint64 `json:"scopeConfigId" mapstructure:"scopeConfigId,omitempty"` +} + +type AsanaTaskData struct { + Options *AsanaOptions + ApiClient *api.ApiAsyncClient + Project *models.AsanaProject +} diff --git a/backend/plugins/asana/tasks/task_extractor.go b/backend/plugins/asana/tasks/task_extractor.go new file mode 100644 index 00000000000..11ce45af1e0 --- /dev/null +++ b/backend/plugins/asana/tasks/task_extractor.go @@ -0,0 +1,162 @@ +/* +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" + "time" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractTask + +var ExtractTaskMeta = plugin.SubTaskMeta{ + Name: "ExtractTask", + EntryPoint: ExtractTask, + EnabledByDefault: true, + Description: "Extract raw data into tool layer table _tool_asana_tasks", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +type asanaApiTask struct { + Gid string `json:"gid"` + Name string `json:"name"` + Notes string `json:"notes"` + ResourceType string `json:"resource_type"` + ResourceSubtype string `json:"resource_subtype"` + Completed bool `json:"completed"` + CompletedAt *time.Time `json:"completed_at"` + DueOn string `json:"due_on"` + CreatedAt time.Time `json:"created_at"` + ModifiedAt *time.Time `json:"modified_at"` + PermalinkUrl string `json:"permalink_url"` + Assignee *struct { + Gid string `json:"gid"` + Name string `json:"name"` + } `json:"assignee"` + CreatedBy *struct { + Gid string `json:"gid"` + Name string `json:"name"` + } `json:"created_by"` + Parent *struct { + Gid string `json:"gid"` + } `json:"parent"` + NumSubtasks int `json:"num_subtasks"` + Memberships []struct { + Section *struct { + Gid string `json:"gid"` + Name string `json:"name"` + } `json:"section"` + Project *struct { + Gid string `json:"gid"` + } `json:"project"` + } `json:"memberships"` +} + +func parseAsanaDate(s string) *time.Time { + if s == "" { + return nil + } + t, err := time.Parse("2006-01-02", s) + if err != nil { + return nil + } + return &t +} + +func ExtractTask(taskCtx plugin.SubTaskContext) errors.Error { + taskData := taskCtx.GetData().(*AsanaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: taskData.Options.ConnectionId, + ProjectId: taskData.Options.ProjectId, + }, + Table: rawTaskTable, + }, + Extract: func(resData *api.RawData) ([]interface{}, errors.Error) { + apiTask := &asanaApiTask{} + err := errors.Convert(json.Unmarshal(resData.Data, apiTask)) + if err != nil { + return nil, err + } + assigneeGid := "" + assigneeName := "" + if apiTask.Assignee != nil { + assigneeGid = apiTask.Assignee.Gid + assigneeName = apiTask.Assignee.Name + } + creatorGid := "" + creatorName := "" + if apiTask.CreatedBy != nil { + creatorGid = apiTask.CreatedBy.Gid + creatorName = apiTask.CreatedBy.Name + } + parentGid := "" + if apiTask.Parent != nil { + parentGid = apiTask.Parent.Gid + } + sectionGid := "" + sectionName := "" + projectGid := taskData.Options.ProjectId + for _, m := range apiTask.Memberships { + if m.Project != nil { + projectGid = m.Project.Gid + } + if m.Section != nil && m.Section.Gid != "" { + sectionGid = m.Section.Gid + sectionName = m.Section.Name + break + } + } + toolTask := &models.AsanaTask{ + ConnectionId: taskData.Options.ConnectionId, + Gid: apiTask.Gid, + Name: apiTask.Name, + Notes: apiTask.Notes, + ResourceType: apiTask.ResourceType, + ResourceSubtype: apiTask.ResourceSubtype, + Completed: apiTask.Completed, + CompletedAt: apiTask.CompletedAt, + DueOn: parseAsanaDate(apiTask.DueOn), + CreatedAt: apiTask.CreatedAt, + ModifiedAt: apiTask.ModifiedAt, + PermalinkUrl: apiTask.PermalinkUrl, + ProjectGid: projectGid, + SectionGid: sectionGid, + SectionName: sectionName, + AssigneeGid: assigneeGid, + AssigneeName: assigneeName, + CreatorGid: creatorGid, + CreatorName: creatorName, + ParentGid: parentGid, + NumSubtasks: apiTask.NumSubtasks, + } + return []interface{}{toolTask}, nil + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/backend/plugins/asana/tasks/user_collector.go b/backend/plugins/asana/tasks/user_collector.go new file mode 100644 index 00000000000..9b1649aa1fb --- /dev/null +++ b/backend/plugins/asana/tasks/user_collector.go @@ -0,0 +1,101 @@ +/* +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" + "net/http" + "net/url" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +const rawUserTable = "asana_users" + +var _ plugin.SubTaskEntryPoint = CollectUser + +var CollectUserMeta = plugin.SubTaskMeta{ + Name: "CollectUser", + EntryPoint: CollectUser, + EnabledByDefault: true, + Description: "Collect user data from Asana API (project members)", + DomainTypes: []string{plugin.DOMAIN_TYPE_CROSS}, +} + +func CollectUser(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*AsanaTaskData) + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: rawUserTable, + }, + ApiClient: data.ApiClient, + PageSize: 100, + UrlTemplate: "projects/{{ .Params.ProjectId }}/members", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("opt_fields", "gid,name,email,resource_type,photo.image_128x128") + query.Set("limit", "100") + if reqData.CustomData != nil { + if offset, ok := reqData.CustomData.(string); ok && offset != "" { + query.Set("offset", offset) + } + } + return query, nil + }, + GetNextPageCustomData: func(prevReqData *api.RequestData, prevPageResponse *http.Response) (interface{}, errors.Error) { + var resp asanaListResponse + err := api.UnmarshalResponse(prevPageResponse, &resp) + if err != nil { + return nil, err + } + if resp.NextPage != nil && resp.NextPage.Offset != "" { + return resp.NextPage.Offset, nil + } + return nil, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var resp asanaListResponse + err := api.UnmarshalResponse(res, &resp) + if err != nil { + return nil, err + } + return resp.Data, nil + }, + }) + if err != nil { + return err + } + return collector.Execute() +} + +type asanaListResponse struct { + Data []json.RawMessage `json:"data"` + NextPage *struct { + Offset string `json:"offset"` + Path string `json:"path"` + URI string `json:"uri"` + } `json:"next_page"` +} diff --git a/backend/plugins/asana/tasks/user_convertor.go b/backend/plugins/asana/tasks/user_convertor.go new file mode 100644 index 00000000000..4d9f3da0802 --- /dev/null +++ b/backend/plugins/asana/tasks/user_convertor.go @@ -0,0 +1,80 @@ +/* +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 ( + "reflect" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/crossdomain" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/plugin" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ConvertUser + +var ConvertUserMeta = plugin.SubTaskMeta{ + Name: "ConvertUser", + EntryPoint: ConvertUser, + EnabledByDefault: true, + Description: "Convert tool layer Asana users into domain layer accounts", + DomainTypes: []string{plugin.DOMAIN_TYPE_CROSS}, +} + +func ConvertUser(taskCtx plugin.SubTaskContext) errors.Error { + rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, rawUserTable) + db := taskCtx.GetDal() + connectionId := data.Options.ConnectionId + + clauses := []dal.Clause{ + dal.From(&models.AsanaUser{}), + dal.Where("connection_id = ?", connectionId), + } + cursor, err := db.Cursor(clauses...) + if err != nil { + return err + } + defer cursor.Close() + + accountIdGen := didgen.NewDomainIdGenerator(&models.AsanaUser{}) + + converter, err := helper.NewDataConverter(helper.DataConverterArgs{ + RawDataSubTaskArgs: *rawDataSubTaskArgs, + InputRowType: reflect.TypeOf(models.AsanaUser{}), + Input: cursor, + Convert: func(inputRow interface{}) ([]interface{}, errors.Error) { + toolUser := inputRow.(*models.AsanaUser) + domainAccount := &crossdomain.Account{ + DomainEntity: domainlayer.DomainEntity{Id: accountIdGen.Generate(toolUser.ConnectionId, toolUser.Gid)}, + Email: toolUser.Email, + FullName: toolUser.Name, + UserName: toolUser.Name, + AvatarUrl: toolUser.PhotoUrl, + } + return []interface{}{domainAccount}, nil + }, + }) + if err != nil { + return err + } + return converter.Execute() +} diff --git a/backend/plugins/asana/tasks/user_extractor.go b/backend/plugins/asana/tasks/user_extractor.go new file mode 100644 index 00000000000..763c5a2a766 --- /dev/null +++ b/backend/plugins/asana/tasks/user_extractor.go @@ -0,0 +1,85 @@ +/* +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/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/asana/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractUser + +var ExtractUserMeta = plugin.SubTaskMeta{ + Name: "ExtractUser", + EntryPoint: ExtractUser, + EnabledByDefault: true, + Description: "Extract raw data into tool layer table _tool_asana_users", + DomainTypes: []string{plugin.DOMAIN_TYPE_CROSS}, +} + +type asanaApiUser struct { + Gid string `json:"gid"` + Name string `json:"name"` + Email string `json:"email"` + ResourceType string `json:"resource_type"` + Photo *struct { + Image128x128 string `json:"image_128x128"` + } `json:"photo"` +} + +func ExtractUser(taskCtx plugin.SubTaskContext) errors.Error { + taskData := taskCtx.GetData().(*AsanaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: models.AsanaApiParams{ + ConnectionId: taskData.Options.ConnectionId, + ProjectId: taskData.Options.ProjectId, + }, + Table: rawUserTable, + }, + Extract: func(resData *api.RawData) ([]interface{}, errors.Error) { + apiUser := &asanaApiUser{} + err := errors.Convert(json.Unmarshal(resData.Data, apiUser)) + if err != nil { + return nil, err + } + photoUrl := "" + if apiUser.Photo != nil { + photoUrl = apiUser.Photo.Image128x128 + } + toolUser := &models.AsanaUser{ + ConnectionId: taskData.Options.ConnectionId, + Gid: apiUser.Gid, + Name: apiUser.Name, + Email: apiUser.Email, + ResourceType: apiUser.ResourceType, + PhotoUrl: photoUrl, + } + return []interface{}{toolUser}, nil + }, + }) + if err != nil { + return err + } + return extractor.Execute() +} diff --git a/backend/plugins/table_info_test.go b/backend/plugins/table_info_test.go index 834bc6d2e7c..929c069b86b 100644 --- a/backend/plugins/table_info_test.go +++ b/backend/plugins/table_info_test.go @@ -23,6 +23,7 @@ import ( "github.com/apache/incubator-devlake/helpers/unithelper" ae "github.com/apache/incubator-devlake/plugins/ae/impl" argocd "github.com/apache/incubator-devlake/plugins/argocd/impl" + asana "github.com/apache/incubator-devlake/plugins/asana/impl" azuredevops "github.com/apache/incubator-devlake/plugins/azuredevops_go/impl" bamboo "github.com/apache/incubator-devlake/plugins/bamboo/impl" bitbucket "github.com/apache/incubator-devlake/plugins/bitbucket/impl" @@ -70,6 +71,7 @@ func Test_GetPluginTablesInfo(t *testing.T) { checker.FeedIn("bitbucket/models", bitbucket.Bitbucket{}.GetTablesInfo) checker.FeedIn("bitbucket_server/models", bitbucket_server.BitbucketServer{}.GetTablesInfo) checker.FeedIn("argocd/models", argocd.ArgoCD{}.GetTablesInfo) + checker.FeedIn("asana/models", asana.Asana{}.GetTablesInfo) checker.FeedIn("customize/models", customize.Customize{}.GetTablesInfo) checker.FeedIn("dbt", dbt.Dbt{}.GetTablesInfo) checker.FeedIn("dora/models", dora.Dora{}.GetTablesInfo) diff --git a/config-ui/env.example b/config-ui/env.example index 078e902a541..1059e19df97 100644 --- a/config-ui/env.example +++ b/config-ui/env.example @@ -30,3 +30,4 @@ DEVLAKE_DASHBOARD_URL_GITHUB=/grafana/d/KXWvOFQnz/github?orgId=1&var-repo_id=All DEVLAKE_DASHBOARD_URL_GITLAB=/grafana/d/msSjEq97z/gitlab?orgId=1&var-repo_id=All&var-interval=WEEKDAY DEVLAKE_DASHBOARD_URL_BITBUCKET=/grafana/d/4LzQHZa4k/bitbucket?orgId=1&var-repo_id=All&var-interval=WEEKDAY DEVLAKE_DASHBOARD_URL_AZUREDEVOPS=/grafana/d/ba7e3a95-80ed-4067-a54b-2a82758eb3dd/azure-devops?orgId=1&var-repo_id=All&var-interval=WEEKDAY +DEVLAKE_DASHBOARD_URL_ASANA=/grafana/d/asana-dashboard?orgId=1 diff --git a/config-ui/src/plugins/components/scope-config-form/index.tsx b/config-ui/src/plugins/components/scope-config-form/index.tsx index e5095ff0983..46fbf129a59 100644 --- a/config-ui/src/plugins/components/scope-config-form/index.tsx +++ b/config-ui/src/plugins/components/scope-config-form/index.tsx @@ -36,6 +36,7 @@ import { BambooTransformation } from '@/plugins/register/bamboo'; import { CircleCITransformation } from '@/plugins/register/circleci'; import { ArgoCDTransformation } from '@/plugins/register/argocd'; import { GhCopilotTransformation } from '@/plugins/register/gh-copilot'; +import { AsanaTransformation } from '@/plugins/register/asana'; import { DOC_URL } from '@/release'; import { operator } from '@/utils'; @@ -297,6 +298,15 @@ export const ScopeConfigForm = ({ /> )} + {plugin === 'asana' && ( + + )} + {plugin === 'tapd' && scopeId && ( + + + + diff --git a/config-ui/src/plugins/register/asana/config.tsx b/config-ui/src/plugins/register/asana/config.tsx new file mode 100644 index 00000000000..af570c0e80e --- /dev/null +++ b/config-ui/src/plugins/register/asana/config.tsx @@ -0,0 +1,66 @@ +/* + * 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. + * + */ + +import { DOC_URL } from '@/release'; +import { IPluginConfig } from '@/types'; + +import Icon from './assets/icon.svg?react'; + +export const AsanaConfig: IPluginConfig = { + plugin: 'asana', + name: 'Asana', + icon: ({ color }) => , + sort: 12, + connection: { + docLink: DOC_URL.PLUGIN.ASANA.BASIS, + initialValues: { + endpoint: 'https://app.asana.com/api/1.0/', + }, + fields: [ + 'name', + { + key: 'endpoint', + label: 'Endpoint', + subLabel: 'Asana API base URL.', + }, + 'token', + 'proxy', + { + key: 'rateLimitPerHour', + subLabel: 'Maximum number of API requests per hour. Leave blank for default.', + defaultValue: 150, + }, + ], + }, + dataScope: { + title: 'Projects', + millerColumn: { + columnCount: 4, + firstColumnTitle: 'Workspaces', + }, + searchPlaceholder: 'Search projects...', + }, + scopeConfig: { + entities: ['TICKET'], + transformation: { + issueTypeRequirement: '(feat|feature|story|requirement)', + issueTypeBug: '(bug|defect|broken)', + issueTypeIncident: '(incident|outage|failure)', + }, + }, +}; diff --git a/config-ui/src/plugins/register/asana/index.ts b/config-ui/src/plugins/register/asana/index.ts new file mode 100644 index 00000000000..5f16858cbe4 --- /dev/null +++ b/config-ui/src/plugins/register/asana/index.ts @@ -0,0 +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. + * + */ + +export * from './config'; +export * from './transformation'; diff --git a/config-ui/src/plugins/register/asana/transformation.tsx b/config-ui/src/plugins/register/asana/transformation.tsx new file mode 100644 index 00000000000..3277ee8e787 --- /dev/null +++ b/config-ui/src/plugins/register/asana/transformation.tsx @@ -0,0 +1,116 @@ +/* + * 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. + * + */ + +import { CaretRightOutlined } from '@ant-design/icons'; +import { theme, Collapse, Tag, Form, Input } from 'antd'; + +import { ExternalLink } from '@/components'; +import { DOC_URL } from '@/release'; + +interface Props { + entities: string[]; + connectionId: ID; + transformation: any; + setTransformation: React.Dispatch>; +} + +export const AsanaTransformation = ({ entities, transformation, setTransformation }: Props) => { + const { token } = theme.useToken(); + + const panelStyle: React.CSSProperties = { + marginBottom: 24, + background: token.colorFillAlter, + borderRadius: token.borderRadiusLG, + border: 'none', + }; + + return ( + } + style={{ background: token.colorBgContainer }} + size="large" + items={[ + { + key: 'TICKET', + label: 'Issue Tracking', + style: panelStyle, + children: ( + <> +

+ Tell DevLake what your Asana tags mean to view metrics such as{' '} + Bug Age,{' '} + DORA - Median Time to Restore Service, etc. +

+

+ DevLake defines three standard types of issues: REQUIREMENT, BUG and INCIDENT. Classify your Asana tasks + using tags that match the RegEx patterns below. +

+ + + setTransformation({ + ...transformation, + issueTypeRequirement: e.target.value, + }) + } + /> + + + + setTransformation({ + ...transformation, + issueTypeBug: e.target.value, + }) + } + /> + + + Incident + + DORA + + + } + > + + setTransformation({ + ...transformation, + issueTypeIncident: e.target.value, + }) + } + /> + + + ), + }, + ].filter((it) => entities.includes(it.key))} + /> + ); +}; diff --git a/config-ui/src/plugins/register/index.ts b/config-ui/src/plugins/register/index.ts index a58a60d7fd2..18baf06628c 100644 --- a/config-ui/src/plugins/register/index.ts +++ b/config-ui/src/plugins/register/index.ts @@ -19,6 +19,7 @@ import { IPluginConfig } from '@/types'; import { ArgoCDConfig } from './argocd'; +import { AsanaConfig } from './asana'; import { AzureConfig, AzureGoConfig } from './azure'; import { BambooConfig } from './bamboo'; import { BitbucketConfig } from './bitbucket'; @@ -42,6 +43,7 @@ import { SlackConfig } from './slack/config'; export const pluginConfigs: IPluginConfig[] = [ ArgoCDConfig, + AsanaConfig, AzureConfig, AzureGoConfig, BambooConfig, diff --git a/config-ui/src/plugins/utils.ts b/config-ui/src/plugins/utils.ts index ea1b8d51487..88b11b55576 100644 --- a/config-ui/src/plugins/utils.ts +++ b/config-ui/src/plugins/utils.ts @@ -43,6 +43,8 @@ export const getPluginScopeId = (plugin: string, scope: any) => { return `${scope.planKey}`; case 'argocd': return `${scope.name}`; + case 'asana': + return `${scope.gid}`; default: return `${scope.id}`; } diff --git a/config-ui/src/release/stable.ts b/config-ui/src/release/stable.ts index 7911e06e0dd..45a7c3e3018 100644 --- a/config-ui/src/release/stable.ts +++ b/config-ui/src/release/stable.ts @@ -23,6 +23,10 @@ const URLS = { }, DORA: 'https://devlake.apache.org/docs/DORA/', PLUGIN: { + ASANA: { + BASIS: 'https://devlake.apache.org/docs/Configuration/Asana', + TRANSFORMATION: 'https://devlake.apache.org/docs/Configuration/Asana', + }, ARGOCD: { BASIS: 'https://devlake.apache.org/docs/Configuration/ArgoCD', TRANSFORMATION: diff --git a/config-ui/src/routes/onboard/step-4.tsx b/config-ui/src/routes/onboard/step-4.tsx index eb1be96880c..569ed0f3da6 100644 --- a/config-ui/src/routes/onboard/step-4.tsx +++ b/config-ui/src/routes/onboard/step-4.tsx @@ -80,6 +80,7 @@ export const DashboardURLMap: Record = { gitlab: import.meta.env.DEVLAKE_DASHBOARD_URL_GITLAB, bitbucket: import.meta.env.DEVLAKE_DASHBOARD_URL_BITBUCKET, azuredevops: import.meta.env.DEVLAKE_DASHBOARD_URL_AZUREDEVOPS, + asana: import.meta.env.DEVLAKE_DASHBOARD_URL_ASANA, }; const getStatus = (data: any) => { diff --git a/config-ui/src/vite-env.d.ts b/config-ui/src/vite-env.d.ts index ceea9065145..946fc8444fd 100644 --- a/config-ui/src/vite-env.d.ts +++ b/config-ui/src/vite-env.d.ts @@ -30,6 +30,7 @@ interface ImportMetaEnv { readonly DEVLAKE_DASHBOARD_URL_GITLAB: string; readonly DEVLAKE_DASHBOARD_URL_BITBUCKET: string; readonly DEVLAKE_DASHBOARD_URL_AZUREDEVOPS: string; + readonly DEVLAKE_DASHBOARD_URL_ASANA: string; } interface ImportMeta { diff --git a/grafana/dashboards/Asana.json b/grafana/dashboards/Asana.json new file mode 100644 index 00000000000..665bb0672e2 --- /dev/null +++ b/grafana/dashboards/Asana.json @@ -0,0 +1,1192 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [ + { + "asDropdown": false, + "icon": "bolt", + "includeVars": false, + "keepTime": true, + "tags": [], + "targetBlank": false, + "title": "Homepage", + "tooltip": "", + "type": "link", + "url": "/grafana/d/Lv1XbLHnk/data-specific-dashboards-homepage" + }, + { + "asDropdown": false, + "icon": "external link", + "includeVars": false, + "keepTime": true, + "tags": [ + "Data Source Specific Dashboard" + ], + "targetBlank": false, + "title": "Metric dashboards", + "tooltip": "", + "type": "dashboards", + "url": "" + } + ], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 3, + "w": 13, + "x": 0, + "y": 0 + }, + "id": 128, + "links": [ + { + "targetBlank": true, + "title": "Asana", + "url": "https://devlake.apache.org/docs/Configuration/Asana" + } + ], + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "- Use Cases: This dashboard shows the basic project management metrics from Asana.\n- Data Source Required: Asana", + "mode": "markdown" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Dashboard Introduction", + "type": "text" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 126, + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "1. Issue Throughput", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Total number of issues created in the selected time range and board.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 0, + "y": 4 + }, + "id": 114, + "links": [ + { + "targetBlank": true, + "title": "Requirement Count", + "url": "https://devlake.apache.org/docs/Metrics/RequirementCount" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "select \r\n count(distinct i.id) as value\r\nfrom issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere \r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Number of Issues [Issues Created in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 4, + "y": 4 + }, + "id": 116, + "links": [ + { + "targetBlank": true, + "title": "Requirement Count", + "url": "https://devlake.apache.org/docs/Metrics/RequirementCount" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "select \r\n count(distinct i.id) as value\r\nfrom issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere \r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Number of Delivered Issues [Issues Created in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 1, + "drawStyle": "bars", + "fillOpacity": 12, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 16, + "x": 8, + "y": 4 + }, + "id": 120, + "links": [ + { + "targetBlank": true, + "title": "Requirement Count", + "url": "https://devlake.apache.org/docs/Metrics/RequirementCount" + } + ], + "options": { + "legend": { + "calcs": [ + "sum" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "SELECT\r\n DATE_ADD(date(i.created_date), INTERVAL -DAYOFMONTH(date(i.created_date))+1 DAY) as time,\r\n count(distinct case when status != 'DONE' then i.id else null end) as \"Number of Open Issues\",\r\n count(distinct case when status = 'DONE' then i.id else null end) as \"Number of Delivered Issues\"\r\nFROM issues i\r\n\tjoin board_issues bi on i.id = bi.issue_id\r\n\tjoin boards b on bi.board_id = b.id\r\nwhere \r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})\r\ngroup by 1", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Issue Status Distribution over Month [Issues Created in Selected Time Range]", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Issue Delivery Rate = count(Delivered Issues)/count(Issues)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 50 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 10 + }, + "id": 117, + "links": [ + { + "targetBlank": true, + "title": "Requirement Delivery Rate", + "url": "https://devlake.apache.org/docs/Metrics/RequirementDeliveryRate" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "with _requirements as(\r\n select\r\n count(distinct i.id) as total_count,\r\n count(distinct case when i.status = 'DONE' then i.id else null end) as delivered_count\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where \r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})\r\n)\r\n\r\nselect \r\n now() as time,\r\n 1.0 * delivered_count/total_count as requirement_delivery_rate\r\nfrom _requirements", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Issue Delivery Rate [Issues Created in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Issue Delivery Rate = count(Delivered Issues)/count(Issues)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Delivery Rate(%)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 12, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 16, + "x": 8, + "y": 10 + }, + "id": 121, + "links": [ + { + "targetBlank": true, + "title": "Requirement Delivery Rate", + "url": "https://devlake.apache.org/docs/Metrics/RequirementDeliveryRate" + } + ], + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "with _requirements as(\r\n select\r\n DATE_ADD(date(i.created_date), INTERVAL -DAYOFMONTH(date(i.created_date))+1 DAY) as time,\r\n 1.0 * count(distinct case when i.status = 'DONE' then i.id else null end)/count(distinct i.id) as delivered_rate\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where \r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})\r\n group by 1\r\n)\r\n\r\nselect\r\n time,\r\n delivered_rate\r\nfrom _requirements\r\norder by time", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Issue Delivery Rate over Time [Issues Created in Selected Time Range]", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 110, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "2. Issue Lead Time", + "type": "row" + }, + { + "datasource": "mysql", + "description": "", + "fieldConfig": { + "defaults": { + "decimals": 1, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 14 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 0, + "y": 17 + }, + "id": 12, + "links": [ + { + "targetBlank": true, + "title": "Requirement Lead Time", + "url": "https://devlake.apache.org/docs/Metrics/RequirementLeadTime" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "/^value$/", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select \r\n avg(lead_time_minutes/1440) as value\r\nfrom issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere \r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.resolution_date)\r\n and bi.board_id in (${board_id})", + "refId": "A", + "select": [ + [ + { + "params": [ + "progress" + ], + "type": "column" + } + ] + ], + "table": "ca_analysis", + "timeColumn": "create_time", + "timeColumnType": "timestamp", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Mean Issue Lead Time in Days [Issues Resolved in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 21 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 4, + "y": 17 + }, + "id": 13, + "links": [ + { + "targetBlank": true, + "title": "Requirement Lead Time", + "url": "https://devlake.apache.org/docs/Metrics/RequirementLeadTime" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "with _ranks as(\r\n select \r\n i.lead_time_minutes,\r\n percent_rank() over (order by lead_time_minutes asc) as ranks\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where \r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.resolution_date)\r\n and bi.board_id in (${board_id})\r\n)\r\n\r\nselect\r\n max(lead_time_minutes/1440) as value\r\nfrom _ranks\r\nwhere \r\n ranks <= 0.8", + "refId": "A", + "select": [ + [ + { + "params": [ + "progress" + ], + "type": "column" + } + ] + ], + "table": "ca_analysis", + "timeColumn": "create_time", + "timeColumnType": "timestamp", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "80% Issues' Lead Time are less than # days [Issues Resolved in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Lead Time(days)", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 16, + "x": 8, + "y": 17 + }, + "id": 17, + "interval": "", + "links": [ + { + "targetBlank": true, + "title": "Requirement Lead Time", + "url": "https://devlake.apache.org/docs/Metrics/RequirementLeadTime" + } + ], + "options": { + "barRadius": 0, + "barWidth": 0.5, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "text": { + "valueSize": 12 + }, + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "with _requirements as(\r\n select \r\n DATE_ADD(date(i.resolution_date), INTERVAL -DAYOFMONTH(date(i.resolution_date))+1 DAY) as time,\r\n avg(lead_time_minutes/1440) as mean_lead_time\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where \r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.resolution_date)\r\n and bi.board_id in (${board_id})\r\n group by 1\r\n)\r\n\r\nselect \r\n date_format(time,'%M %Y') as month,\r\n mean_lead_time\r\nfrom _requirements\r\norder by time asc", + "refId": "A", + "select": [ + [ + { + "params": [ + "progress" + ], + "type": "column" + } + ] + ], + "table": "ca_analysis", + "timeColumn": "create_time", + "timeColumnType": "timestamp", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Mean Issue Lead Time [Issues Resolved in Selected Time Range]", + "type": "barchart" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "mysql", + "description": "The cumulative distribution of issue lead time. Each point refers to the percent rank of a lead time.", + "fill": 0, + "fillGradient": 4, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 23 + }, + "hiddenSeries": false, + "id": 15, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 8, + "links": [ + { + "targetBlank": true, + "title": "Requirement Lead Time", + "url": "https://devlake.apache.org/docs/Metrics/RequirementLeadTime" + } + ], + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "9.5.15", + "pointradius": 0.5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "with _ranks as(\r\n select \r\n round(i.lead_time_minutes/1440) as lead_time_day\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where \r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.resolution_date)\r\n and bi.board_id in (${board_id})\r\n order by lead_time_day asc\r\n)\r\n\r\nselect \r\n now() as time,\r\n lpad(concat(lead_time_day,'d'), 4, ' ') as metric,\r\n percent_rank() over (order by lead_time_day asc) as value\r\nfrom _ranks\r\norder by lead_time_day asc", + "refId": "A", + "select": [ + [ + { + "params": [ + "progress" + ], + "type": "column" + } + ] + ], + "table": "ca_analysis", + "timeColumn": "create_time", + "timeColumnType": "timestamp", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "thresholds": [ + { + "colorMode": "ok", + "fill": true, + "line": true, + "op": "lt", + "value": 0.8, + "yaxis": "right" + } + ], + "timeRegions": [], + "title": "Cumulative Distribution of Issue Lead Time [Issues Resolved in Selected Time Range]", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "transformations": [], + "type": "graph", + "xaxis": { + "mode": "series", + "show": true, + "values": [ + "current" + ] + }, + "yaxes": [ + { + "format": "percentunit", + "label": "Percent Rank (%)", + "logBase": 1, + "max": "1.2", + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 130, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "
\n\nThis dashboard is created based on this [data schema](https://devlake.apache.org/docs/DataModels/DevLakeDomainLayerSchema). Want to add more metrics? Please follow the [guide](https://devlake.apache.org/docs/Configuration/Dashboards/GrafanaUserGuide).", + "mode": "markdown" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "type": "text" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [ + "Data Source Dashboard" + ], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": "mysql", + "definition": "select concat(name, '--', id) from boards where id like 'asana%'", + "hide": 0, + "includeAll": true, + "label": "Choose Board", + "multi": true, + "name": "board_id", + "options": [], + "query": "select concat(name, '--', id) from boards where id like 'asana%'", + "refresh": 1, + "regex": "/^(?.*)--(?.*)$/", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "mysql", + "definition": "select distinct type from issues", + "hide": 0, + "includeAll": true, + "label": "Issue Type", + "multi": false, + "name": "type", + "options": [], + "query": "select distinct type from issues", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-6M", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Asana", + "uid": "asana-dashboard", + "version": 1, + "weekStart": "" +} From cefb22660b45cf54628a9f9e5d5d5d401009b237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leif=20Roger=20Fr=C3=B8ysaa?= Date: Thu, 12 Mar 2026 13:48:10 +0100 Subject: [PATCH 14/38] feat: GitHub App token refresh (#8746) * feat(github): auto-refresh GitHub App installation tokens Add transport-level token refresh for GitHub App (AppKey) connections. GitHub App installation tokens expire after ~1 hour; this adds proactive refresh (before expiry) and reactive refresh (on 401) using the existing TokenProvider/RefreshRoundTripper infrastructure. New files: - app_installation_refresh.go: refresh logic + DB persistence - refresh_api_client.go: minimal ApiClient for token refresh POST - cmd/test_refresh/main.go: manual test script for real GitHub Apps Modified: - connection.go: export GetInstallationAccessToken, parse ExpiresAt - token_provider.go: add refreshFn for pluggable refresh strategies - round_tripper.go: document dual Authorization header interaction - api_client.go: wire AppKey connections into refresh infrastructure - Tests updated for new constructors and AppKey refresh flow * feat(github): add diagnostic logging to GitHub App token refresh Add structured logging at key decision points for token refresh: - Token provider creation (connection ID, installation ID, expiry) - Round tripper installation (connection ID, auth method) - Proactive refresh trigger (near-expiry detection) - Refresh start/success/failure (old/new token prefixes, expiry times) - DB persistence success/failure - Reactive 401 refresh and skip-due-to-concurrent-refresh All logs route through the DevLake logger to pipeline log files. * fix(github): prevent deadlock and fix token persistence in App token refresh Deadlock fix: NewAppInstallationTokenProvider now captures client.Transport (the base transport) before wrapping with RefreshRoundTripper. The refresh function uses newRefreshApiClientWithTransport(baseTransport) to POST for new installation tokens, bypassing the RefreshRoundTripper entirely. Token persistence fix: PersistEncryptedTokenColumns() manually encrypts tokens via plugin.Encrypt() then writes ciphertext via dal.UpdateColumns with conn.TableName() (a string) as the first argument. Passing the table name string makes GORM use Table() instead of Model(), preventing the encdec serializer from corrupting the in-memory token value. The encryption secret is threaded from taskCtx.GetConfig(ENCRYPTION_SECRET) through CreateApiClient to TokenProvider to persist functions. Also persists the initial App token at startup for DB consistency, and adds TestProactiveRefreshNoDeadlock with a real RSA key to verify the deadlock scenario is resolved. * fix(grafana): update dashboard descriptions to list all supported data sources (#8741) Several dashboard introduction panels hardcoded "GitHub and Jira" as required data sources, even though the underlying queries use generic domain layer tables that work with any supported Git tool or issue tracker. Updated to list all supported sources following the pattern already used by DORA and WorkLogs dashboards. Closes #8740 Co-authored-by: Spiff Azeta * fix: modify cicd_deployments name from varchar to text (#8724) * fix: modify cicd_deployments name from varchar to text * fix: update the year * fix(q_dev): replace MariaDB-specific IF NOT EXISTS syntax with DAL methods for MySQL 8.x compatibility (#8745) * fix(azuredevops): default empty entities and add CROSS to repo scope in makeScopeV200 (#8751) When scopeConfig.Entities is empty (common when no entities are explicitly selected in the UI), makeScopeV200 produced zero scopes, leaving project_mapping with no rows. Additionally, the repo scope condition did not check for DOMAIN_TYPE_CROSS, so selecting only CROSS would not create a repo scope, breaking DORA metrics. This adds the same fixes applied to GitLab in #8743. Closes #8749 * fix(bitbucket): default empty entities to all domain types in makeScopesV200 (#8750) When scopeConfig.Entities is empty (common when no entities are explicitly selected in the UI), makeScopesV200 produced zero scopes, leaving project_mapping with no repo rows. This adds the same empty-entities default applied to GitLab in #8743. Closes #8748 * fix(github): remove unused refresh client constructor and update tests --------- Co-authored-by: Spiff Azeta <35563797+spiffaz@users.noreply.github.com> Co-authored-by: Spiff Azeta Co-authored-by: Dan Crews Co-authored-by: Tomoya Kawaguchi <68677002+yamoyamoto@users.noreply.github.com> --- backend/plugins/github/models/connection.go | 21 +- backend/plugins/github/tasks/api_client.go | 32 ++- .../github/token/app_installation_refresh.go | 152 +++++++++++ .../github/token/cmd/test_refresh/main.go | 240 ++++++++++++++++++ .../github/token/refresh_api_client.go | 115 +++++++++ .../github/token/refresh_api_client_test.go | 106 ++++++++ backend/plugins/github/token/round_tripper.go | 5 + .../github/token/round_tripper_test.go | 193 +++++++++++++- .../plugins/github/token/token_provider.go | 102 ++++++-- .../github/token/token_provider_test.go | 117 +++++++-- 10 files changed, 1019 insertions(+), 64 deletions(-) create mode 100644 backend/plugins/github/token/app_installation_refresh.go create mode 100644 backend/plugins/github/token/cmd/test_refresh/main.go create mode 100644 backend/plugins/github/token/refresh_api_client.go create mode 100644 backend/plugins/github/token/refresh_api_client_test.go diff --git a/backend/plugins/github/models/connection.go b/backend/plugins/github/models/connection.go index d03353c1881..51034f67cbb 100644 --- a/backend/plugins/github/models/connection.go +++ b/backend/plugins/github/models/connection.go @@ -81,13 +81,15 @@ func (conn *GithubConn) PrepareApiClient(apiClient plugin.ApiClient) errors.Erro } if conn.AuthMethod == AppKey && conn.InstallationID != 0 { - token, err := conn.getInstallationAccessToken(apiClient) + token, err := conn.GetInstallationAccessToken(apiClient) if err != nil { return err } - - conn.Token = token.Token - conn.tokens = []string{token.Token} + var expiresAt *time.Time + if !token.ExpiresAt.IsZero() { + expiresAt = &token.ExpiresAt + } + conn.UpdateToken(token.Token, "", expiresAt, nil) } return nil @@ -354,7 +356,8 @@ type GithubUserOfToken struct { } type InstallationToken struct { - Token string `json:"token"` + Token string `json:"token"` + ExpiresAt time.Time `json:"expires_at"` } type GithubApp struct { @@ -397,7 +400,7 @@ func (gak *GithubAppKey) CreateJwt() (string, errors.Error) { return tokenString, nil } -func (gak *GithubAppKey) getInstallationAccessToken( +func (gak *GithubAppKey) GetInstallationAccessToken( apiClient plugin.ApiClient, ) (*InstallationToken, errors.Error) { @@ -417,12 +420,18 @@ func (gak *GithubAppKey) getInstallationAccessToken( if err != nil { return nil, err } + if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusOK { + return nil, errors.HttpStatus(resp.StatusCode).New(fmt.Sprintf("unexpected status code while getting installation access token: %s", string(body))) + } var installationToken InstallationToken err = errors.Convert(json.Unmarshal(body, &installationToken)) if err != nil { return nil, err } + if installationToken.Token == "" { + return nil, errors.Default.New("empty installation access token returned") + } return &installationToken, nil } diff --git a/backend/plugins/github/tasks/api_client.go b/backend/plugins/github/tasks/api_client.go index 268af8ecec1..42181ff139e 100644 --- a/backend/plugins/github/tasks/api_client.go +++ b/backend/plugins/github/tasks/api_client.go @@ -35,14 +35,18 @@ func CreateApiClient(taskCtx plugin.TaskContext, connection *models.GithubConnec return nil, err } - // Inject TokenProvider if refresh token is present - if connection.RefreshToken != "" { - logger := taskCtx.GetLogger() - db := taskCtx.GetDal() - - // Create TokenProvider - tp := token.NewTokenProvider(connection, db, apiClient.GetClient(), logger) + logger := taskCtx.GetLogger() + db := taskCtx.GetDal() + encryptionSecret := taskCtx.GetConfig(plugin.EncodeKeyEnvStr) + // Inject TokenProvider for OAuth refresh or GitHub App installation tokens. + var tp *token.TokenProvider + if connection.RefreshToken != "" { + tp = token.NewTokenProvider(connection, db, apiClient.GetClient(), logger, encryptionSecret) + } else if connection.AuthMethod == models.AppKey && connection.InstallationID != 0 { + tp = token.NewAppInstallationTokenProvider(connection, db, apiClient.GetClient(), logger, encryptionSecret) + } + if tp != nil { // Wrap the transport baseTransport := apiClient.GetClient().Transport if baseTransport == nil { @@ -51,6 +55,20 @@ func CreateApiClient(taskCtx plugin.TaskContext, connection *models.GithubConnec rt := token.NewRefreshRoundTripper(baseTransport, tp) apiClient.GetClient().Transport = rt + logger.Info("Installed token refresh round tripper for connection %d (authMethod=%s)", + connection.ID, connection.AuthMethod) + } + + // Persist the freshly minted token so the DB has a correctly encrypted value. + // PrepareApiClient (called by NewApiClientFromConnection) mints the token + // in-memory but does not persist it; without this, the DB may contain a stale + // or corrupted token that breaks GET /connections. + if connection.AuthMethod == models.AppKey && connection.Token != "" { + if err := token.PersistEncryptedTokenColumns(db, connection, encryptionSecret, logger, false); err != nil { + logger.Warn(err, "Failed to persist initial token for connection %d", connection.ID) + } else { + logger.Info("Persisted initial token for connection %d", connection.ID) + } } // create rate limit calculator diff --git a/backend/plugins/github/token/app_installation_refresh.go b/backend/plugins/github/token/app_installation_refresh.go new file mode 100644 index 00000000000..2f4cf04b898 --- /dev/null +++ b/backend/plugins/github/token/app_installation_refresh.go @@ -0,0 +1,152 @@ +/* +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 token + +import ( + "time" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/log" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/plugins/github/models" +) + +// tokenPrefix returns the first n characters of a token for safe logging. +func tokenPrefix(token string, n int) string { + if len(token) <= n { + return token + } + return token[:n] + "..." +} + +func refreshGitHubAppInstallationToken(tp *TokenProvider) errors.Error { + if tp == nil || tp.conn == nil { + return errors.Default.New("missing github connection for app token refresh") + } + if tp.conn.AuthMethod != models.AppKey || tp.conn.InstallationID == 0 { + return errors.Default.New("invalid github app connection for token refresh") + } + if tp.conn.Endpoint == "" { + return errors.Default.New("missing github endpoint for token refresh") + } + + oldToken := tp.conn.Token + if tp.logger != nil { + expiresStr := "unknown" + if tp.conn.TokenExpiresAt != nil { + expiresStr = tp.conn.TokenExpiresAt.Format(time.RFC3339) + } + tp.logger.Info( + "Refreshing GitHub App installation token for connection %d (installation %d), old token=%s, expires_at=%s", + tp.conn.ID, tp.conn.InstallationID, + tokenPrefix(oldToken, 8), + expiresStr, + ) + } + + // Use baseTransport (the unwrapped transport) to avoid deadlock. + // The httpClient's transport may be the RefreshRoundTripper which would + // re-enter GetToken() and deadlock on the mutex. + apiClient := newRefreshApiClientWithTransport(tp.conn.Endpoint, tp.baseTransport) + installationToken, err := tp.conn.GithubAppKey.GetInstallationAccessToken(apiClient) + if err != nil { + if tp.logger != nil { + tp.logger.Error(err, "Failed to refresh GitHub App installation token for connection %d", tp.conn.ID) + } + return err + } + + var expiresAt *time.Time + if !installationToken.ExpiresAt.IsZero() { + expiresAt = &installationToken.ExpiresAt + } + tp.conn.UpdateToken(installationToken.Token, "", expiresAt, nil) + + if tp.logger != nil { + tp.logger.Info( + "Successfully refreshed GitHub App installation token for connection %d, new token=%s, new expires_at=%s", + tp.conn.ID, + tokenPrefix(installationToken.Token, 8), + installationToken.ExpiresAt.Format(time.RFC3339), + ) + } + + persistAppToken(tp.dal, tp.conn, tp.encryptionSecret, tp.logger) + return nil +} + +func persistAppToken(d dal.Dal, conn *models.GithubConnection, encryptionSecret string, logger log.Logger) { + if d == nil || conn == nil { + return + } + if err := PersistEncryptedTokenColumns(d, conn, encryptionSecret, logger, false); err != nil { + if logger != nil { + logger.Warn(err, "Failed to persist refreshed app installation token for connection %d", conn.ID) + } + } else if logger != nil { + logger.Info("Persisted refreshed app installation token for connection %d", conn.ID) + } +} + +// PersistEncryptedTokenColumns manually encrypts token fields and writes them +// to the DB using UpdateColumns (map-based), which only touches the specified +// columns. This avoids two problems: +// - dal.Update (GORM Save) writes ALL fields, including refresh_token_expires_at +// which may have Go zero time that MySQL rejects as '0000-00-00'. +// - dal.UpdateColumns with plaintext bypasses the GORM encdec serializer, +// writing unencrypted tokens that corrupt subsequent reads. +// +// IMPORTANT: We pass the table name string (not the conn struct) to UpdateColumns +// so that GORM uses Table() instead of Model(). When Model(conn) is used, GORM +// processes the encdec serializer on the struct's Token field during statement +// preparation, which overwrites conn.Token in memory with the encrypted ciphertext. +// This corrupts the in-memory token causing immediate 401s on the next API call. +// +// If includeRefreshToken is true, refresh_token and refresh_token_expires_at +// are also written (used by the OAuth refresh path where these values are valid). +func PersistEncryptedTokenColumns(d dal.Dal, conn *models.GithubConnection, encryptionSecret string, logger log.Logger, includeRefreshToken bool) errors.Error { + encToken, err := plugin.Encrypt(encryptionSecret, conn.Token) + if err != nil { + return errors.Default.Wrap(err, "failed to encrypt token for persistence") + } + + sets := []dal.DalSet{ + {ColumnName: "token", Value: encToken}, + {ColumnName: "token_expires_at", Value: conn.TokenExpiresAt}, + } + + if includeRefreshToken { + encRefreshToken, err := plugin.Encrypt(encryptionSecret, conn.RefreshToken) + if err != nil { + return errors.Default.Wrap(err, "failed to encrypt refresh_token for persistence") + } + sets = append(sets, + dal.DalSet{ColumnName: "refresh_token", Value: encRefreshToken}, + dal.DalSet{ColumnName: "refresh_token_expires_at", Value: conn.RefreshTokenExpiresAt}, + ) + } + + // Use the table name string instead of the conn struct to prevent GORM from + // running the encdec serializer on conn.Token during Model() processing. + return d.UpdateColumns( + conn.TableName(), + sets, + dal.Where("id = ?", conn.ID), + ) +} diff --git a/backend/plugins/github/token/cmd/test_refresh/main.go b/backend/plugins/github/token/cmd/test_refresh/main.go new file mode 100644 index 00000000000..be1854dcc29 --- /dev/null +++ b/backend/plugins/github/token/cmd/test_refresh/main.go @@ -0,0 +1,240 @@ +/* +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. +*/ + +// This script lists GitHub App installations and tests the token refresh flow. +// +// Usage: +// +// GITHUB_APP_ID=123456 GITHUB_APP_PEM="$(cat private-key.pem)" go run ./plugins/github/token/cmd/test_refresh/ +// +// Or if the key is in a file: +// +// GITHUB_APP_ID=123456 GITHUB_APP_PEM_FILE=/path/to/private-key.pem go run ./plugins/github/token/cmd/test_refresh/ +package main + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "time" + + "github.com/golang-jwt/jwt/v5" +) + +type installation struct { + ID int `json:"id"` + Account struct { + Login string `json:"login"` + } `json:"account"` + AppID int `json:"app_id"` +} + +type installationToken struct { + Token string `json:"token"` + ExpiresAt time.Time `json:"expires_at"` +} + +func main() { + appID := os.Getenv("GITHUB_APP_ID") + if appID == "" { + fatal("GITHUB_APP_ID env var is required") + } + + pemData := os.Getenv("GITHUB_APP_PEM") + if pemData == "" { + pemFile := os.Getenv("GITHUB_APP_PEM_FILE") + if pemFile == "" { + fatal("Set GITHUB_APP_PEM (contents) or GITHUB_APP_PEM_FILE (path)") + } + data, err := os.ReadFile(pemFile) + if err != nil { + fatal("failed to read PEM file: %v", err) + } + pemData = string(data) + } + + // Step 1: Create a JWT signed with the app's private key + fmt.Println("=== Step 1: Creating JWT from App ID and private key ===") + jwtToken, err := createJWT(appID, pemData) + if err != nil { + fatal("failed to create JWT: %v", err) + } + fmt.Printf("JWT created (first 20 chars): %s...\n\n", jwtToken[:20]) + + // Step 2: List installations + fmt.Println("=== Step 2: Listing installations for this app ===") + installations, err := listInstallations(jwtToken) + if err != nil { + fatal("failed to list installations: %v", err) + } + if len(installations) == 0 { + fatal("no installations found for this app") + } + for _, inst := range installations { + fmt.Printf(" Installation ID: %d Account: %s\n", inst.ID, inst.Account.Login) + } + fmt.Println() + + // Step 3: Get an installation token for the first installation + inst := installations[0] + fmt.Printf("=== Step 3: Minting installation token for %s (ID: %d) ===\n", inst.Account.Login, inst.ID) + token1, err := getInstallationToken(jwtToken, inst.ID) + if err != nil { + fatal("failed to get installation token: %v", err) + } + fmt.Printf("Token 1: %s... Expires: %s\n\n", token1.Token[:10], token1.ExpiresAt.Format(time.RFC3339)) + + // Step 4: Make an API call with the token to verify it works + fmt.Println("=== Step 4: Verifying token works (GET /installation/repositories) ===") + err = verifyToken(token1.Token) + if err != nil { + fatal("token verification failed: %v", err) + } + fmt.Printf("Token is valid and working.\n\n") + + // Step 5: Simulate the refresh flow — mint a second token (as our refreshFn would) + fmt.Println("=== Step 5: Simulating token refresh (minting a second token) ===") + jwtToken2, err := createJWT(appID, pemData) + if err != nil { + fatal("failed to create second JWT: %v", err) + } + token2, err := getInstallationToken(jwtToken2, inst.ID) + if err != nil { + fatal("failed to get second installation token: %v", err) + } + fmt.Printf("Token 2: %s... Expires: %s\n", token2.Token[:10], token2.ExpiresAt.Format(time.RFC3339)) + + if token1.Token == token2.Token { + fmt.Println("Note: Both tokens are identical (GitHub may cache short-lived tokens)") + } else { + fmt.Println("Tokens are different — refresh produced a new token.") + } + fmt.Println() + + // Step 6: Verify the new token works + fmt.Println("=== Step 6: Verifying refreshed token works ===") + err = verifyToken(token2.Token) + if err != nil { + fatal("refreshed token verification failed: %v", err) + } + fmt.Println("Refreshed token is valid and working.") + + fmt.Println("\n=== All steps passed. The token refresh flow works correctly. ===") + fmt.Printf("\nFor reference, your Installation ID is: %d\n", inst.ID) +} + +func createJWT(appID, pemData string) (string, error) { + privateKey, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(pemData)) + if err != nil { + return "", fmt.Errorf("invalid PEM key: %w", err) + } + + now := time.Now().Unix() + token := jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims{ + "iat": now, + "exp": now + (10 * 60), // 10 minutes + "iss": appID, + }) + + signed, err := token.SignedString(privateKey) + if err != nil { + return "", fmt.Errorf("failed to sign JWT: %w", err) + } + return signed, nil +} + +func listInstallations(jwtToken string) ([]installation, error) { + req, err := http.NewRequest("GET", "https://api.github.com/app/installations", nil) + if err != nil { + return nil, err + } + req.Header.Set("Authorization", "Bearer "+jwtToken) + req.Header.Set("Accept", "application/vnd.github+json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, _ := io.ReadAll(resp.Body) + if resp.StatusCode != 200 { + return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, string(body)) + } + + var result []installation + if err := json.Unmarshal(body, &result); err != nil { + return nil, fmt.Errorf("failed to parse response: %w", err) + } + return result, nil +} + +func getInstallationToken(jwtToken string, installationID int) (*installationToken, error) { + url := fmt.Sprintf("https://api.github.com/app/installations/%d/access_tokens", installationID) + req, err := http.NewRequest("POST", url, nil) + if err != nil { + return nil, err + } + req.Header.Set("Authorization", "Bearer "+jwtToken) + req.Header.Set("Accept", "application/vnd.github+json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, _ := io.ReadAll(resp.Body) + if resp.StatusCode != http.StatusCreated { + return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, string(body)) + } + + var token installationToken + if err := json.Unmarshal(body, &token); err != nil { + return nil, fmt.Errorf("failed to parse token response: %w", err) + } + return &token, nil +} + +func verifyToken(token string) error { + req, err := http.NewRequest("GET", "https://api.github.com/installation/repositories?per_page=1", nil) + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+token) + req.Header.Set("Accept", "application/vnd.github+json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + body, _ := io.ReadAll(resp.Body) + return fmt.Errorf("HTTP %d: %s", resp.StatusCode, string(body)) + } + fmt.Printf(" HTTP 200 OK (X-RateLimit-Remaining: %s)\n", resp.Header.Get("X-RateLimit-Remaining")) + return nil +} + +func fatal(format string, args ...interface{}) { + fmt.Fprintf(os.Stderr, "FATAL: "+format+"\n", args...) + os.Exit(1) +} diff --git a/backend/plugins/github/token/refresh_api_client.go b/backend/plugins/github/token/refresh_api_client.go new file mode 100644 index 00000000000..1db6f691712 --- /dev/null +++ b/backend/plugins/github/token/refresh_api_client.go @@ -0,0 +1,115 @@ +/* +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 token + +import ( + "bytes" + "context" + "encoding/json" + "net/http" + "net/url" + "time" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" +) + +type refreshApiClient struct { + endpoint string + client *http.Client + timeout time.Duration +} + +// newRefreshApiClientWithTransport creates a refreshApiClient using a specific +// http.RoundTripper instead of an existing *http.Client. This is critical for +// avoiding deadlocks: the caller's *http.Client may have a RefreshRoundTripper +// transport that re-enters GetToken() and deadlocks on the mutex. +func newRefreshApiClientWithTransport(endpoint string, transport http.RoundTripper) plugin.ApiClient { + if transport == nil { + transport = http.DefaultTransport + } + return &refreshApiClient{ + endpoint: endpoint, + client: &http.Client{Transport: transport}, + timeout: 10 * time.Second, + } +} + +func (c *refreshApiClient) SetData(name string, data interface{}) {} + +func (c *refreshApiClient) GetData(name string) interface{} { return nil } + +func (c *refreshApiClient) SetHeaders(headers map[string]string) {} + +func (c *refreshApiClient) SetBeforeFunction(callback plugin.ApiClientBeforeRequest) {} + +func (c *refreshApiClient) GetBeforeFunction() plugin.ApiClientBeforeRequest { return nil } + +func (c *refreshApiClient) SetAfterFunction(callback plugin.ApiClientAfterResponse) {} + +func (c *refreshApiClient) GetAfterFunction() plugin.ApiClientAfterResponse { return nil } + +func (c *refreshApiClient) Get(path string, query url.Values, headers http.Header) (*http.Response, errors.Error) { + return c.do(http.MethodGet, path, query, nil, headers) +} + +func (c *refreshApiClient) Post(path string, query url.Values, body interface{}, headers http.Header) (*http.Response, errors.Error) { + return c.do(http.MethodPost, path, query, body, headers) +} + +func (c *refreshApiClient) do(method, path string, query url.Values, body interface{}, headers http.Header) (*http.Response, errors.Error) { + uri, err := api.GetURIStringPointer(c.endpoint, path, query) + if err != nil { + return nil, err + } + + var reqBody *bytes.Reader + if body != nil { + payload, err := json.Marshal(body) + if err != nil { + return nil, errors.Convert(err) + } + reqBody = bytes.NewReader(payload) + } else { + reqBody = bytes.NewReader(nil) + } + + ctx, cancel := context.WithTimeout(context.Background(), c.timeout) + defer cancel() + + req, err := errors.Convert01(http.NewRequestWithContext(ctx, method, *uri, reqBody)) + if err != nil { + return nil, err + } + if body != nil { + req.Header.Set("Content-Type", "application/json") + } + + for name, values := range headers { + for _, value := range values { + req.Header.Add(name, value) + } + } + + res, err := errors.Convert01(c.client.Do(req)) + if err != nil { + return nil, err + } + return res, nil +} diff --git a/backend/plugins/github/token/refresh_api_client_test.go b/backend/plugins/github/token/refresh_api_client_test.go new file mode 100644 index 00000000000..60cdbba2f40 --- /dev/null +++ b/backend/plugins/github/token/refresh_api_client_test.go @@ -0,0 +1,106 @@ +/* +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 token + +import ( + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestRefreshApiClientPost(t *testing.T) { + var receivedMethod string + var receivedPath string + var receivedAuth string + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + receivedMethod = r.Method + receivedPath = r.URL.Path + receivedAuth = r.Header.Get("Authorization") + w.WriteHeader(http.StatusCreated) + w.Write([]byte(`{"token":"ghs_test123","expires_at":"2026-03-02T12:00:00Z"}`)) + })) + defer server.Close() + + client := newRefreshApiClientWithTransport(server.URL, server.Client().Transport) + + headers := http.Header{ + "Authorization": []string{"Bearer jwt_token_here"}, + } + resp, err := client.Post("/app/installations/123/access_tokens", nil, nil, headers) + + assert.Nil(t, err) + assert.Equal(t, http.StatusCreated, resp.StatusCode) + assert.Equal(t, "POST", receivedMethod) + assert.Equal(t, "/app/installations/123/access_tokens", receivedPath) + assert.Equal(t, "Bearer jwt_token_here", receivedAuth) + + body, _ := io.ReadAll(resp.Body) + resp.Body.Close() + assert.Contains(t, string(body), "ghs_test123") +} + +func TestRefreshApiClientGet(t *testing.T) { + var receivedMethod string + var receivedQuery string + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + receivedMethod = r.Method + receivedQuery = r.URL.Query().Get("page") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"ok":true}`)) + })) + defer server.Close() + + client := newRefreshApiClientWithTransport(server.URL, server.Client().Transport) + + resp, err := client.Get("/test", map[string][]string{"page": {"2"}}, nil) + assert.Nil(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "GET", receivedMethod) + assert.Equal(t, "2", receivedQuery) + resp.Body.Close() +} + +func TestRefreshApiClientTimeout(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Sleep longer than the timeout + time.Sleep(2 * time.Second) + w.WriteHeader(http.StatusOK) + })) + defer server.Close() + + // Use a client without its own timeout so the context timeout is the only constraint + client := newRefreshApiClientWithTransport(server.URL, http.DefaultTransport) + // Override the timeout to something short for the test + client.(*refreshApiClient).timeout = 100 * time.Millisecond + + resp, err := client.Post("/slow", nil, nil, nil) + assert.NotNil(t, err) + if resp != nil { + resp.Body.Close() + } + // Verify the error is a deadline/context error + assert.True(t, strings.Contains(err.Error(), "deadline") || strings.Contains(err.Error(), "context"), + "expected deadline/context error, got: %s", err.Error()) +} diff --git a/backend/plugins/github/token/round_tripper.go b/backend/plugins/github/token/round_tripper.go index 45ba3e9a7b6..8868572dae6 100644 --- a/backend/plugins/github/token/round_tripper.go +++ b/backend/plugins/github/token/round_tripper.go @@ -26,6 +26,11 @@ import ( // On 401's the round tripper will: // - Force a refresh of the OAuth token via the TokenProvider // - Retry the original request with the new token +// +// Note: When active, the RefreshRoundTripper overwrites the Authorization header +// on every request, superseding any header previously set by SetupAuthentication. +// This is intentional — for connections using token refresh (OAuth or GitHub App), +// the round tripper is the single source of truth for the current bearer token. type RefreshRoundTripper struct { base http.RoundTripper tokenProvider *TokenProvider diff --git a/backend/plugins/github/token/round_tripper_test.go b/backend/plugins/github/token/round_tripper_test.go index e766adb8824..2748d59e118 100644 --- a/backend/plugins/github/token/round_tripper_test.go +++ b/backend/plugins/github/token/round_tripper_test.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "github.com/apache/incubator-devlake/core/errors" "github.com/apache/incubator-devlake/helpers/pluginhelper/api" "github.com/apache/incubator-devlake/impls/logruslog" "github.com/apache/incubator-devlake/plugins/github/models" @@ -32,6 +33,36 @@ import ( "github.com/stretchr/testify/mock" ) +// testRSAKey is a throwaway 2048-bit RSA private key used only in tests. +// It is NOT a real credential. +const testRSAKey = `-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA1xJuX407giVTO/FY2pbp6bdB/XxaiPqAuvWIcEqabzq+d3ft +O7fGtbXSQrCdtxEQt5dHFKdJofHcGlKPDnq1BNjWM3/xLWsQWQPSwUZ9H1qy/nDI +GX+ciXmP8hbzoe5B1OXidAdrJUGWH3ox8Yp8OVd/yK9p34teCbzPnqVEc9tkgUT1 +94gHKLmvP28VefybFyGbYB3ujVIuA8Z26c4gQsyFzR2v1fVeDIu1e1afyH5WTFgr +EWaztOo6pI5stzH00U7fNMzULBuYQ+ufQ4iQ7Ewt7fK5yyQNkx3pX0o1OQ/aYxQr +hyBrHakxHBe78eq8rSR2KwSr5nDuYzIAOUhtnwIDAQABAoH/EknhZ6EkvRPR7G5e +bq4/NduuSriDcITwbWuuuFPufzgdIZVzlu8xHfPOT9152qE2aD7XahGUk85fwbXh +EeP64x/cA3FnmrAxPYfuUFnB0+i7KHGpzW2Wa/LqXlz3vS/UQePoDwl+xDYeUt2u +xALHoSxZdlTWv6HLhLmw7ge9QJLc/xQO9dC678c4Y4JTCRrEvhE+eZiDEXb6HL2D +uNMEwFqMLTxOurYKXE+iyzKg0e4D6oDkw6BC+vOUBnuH+9iKV6wnal24E1WnyhCa +vy7iHBoc8npeKYAHjU5wKDQiWPMT9DjYBRucHvSyEYTeS5eyQHed42PGv+Ss2IL4 +w0JZAoGBAPjxiEJwck29NyfElw5+/P0IKIE8BkuIOSC8JoGfo+JpKYWFIXaLRbK8 +qvOiLDotHgC5IxFZyN8pejVe7Zvif5PepR9qMcV3e6Uz2nmJqtp5gFlzjNUSzbeM +J6gqkejtwn7wJY3dwZhfbTTDDY7cZ9f3Cydarx+iu07unGCRT9DDAoGBAN0rG/F9 +tsOSwrgsnPwNeVPfJn2Zw6mvb1xuOoJl11tDnpS6tH50FBJ/TkERZak9+VZ761pq +CvuMjLtePgC31rsAcUEEt1OwYCxne8gNxuzl2mWKD98ActbFf96VM4Q68Jvntxl1 +eOMMnSA+/yjvhpxdVabm3180mRu9eBv6SaH1AoGBAMpwL6xHoMwS6L1QIr7JCZYC +gl3FoCDgIAS8vFuApFbDyd4oSvQJgZ49yo7g/DI66kEQTLIZXz4KjrTEA1lWsQRg +c8q+Isc/yK6pIirfhq6vS25yhr3m0p9GPCGGrKzMW/O5+fAJuxrbzwSu8WGRXmjD +HrDcD7kcLlGbvFLTGCLdAoGBALNID7W5Z16v6AItv++d6Hzxhh0IeRBi8s2lWO59 +KY6EiNcdZdSfuemoosGiHZuMbkMJ3qWDEnYI38e+xFoGrB0YZbYD4awIbF1yYWew +q1E7ncbznJvznCO3I0lF/uWwdXyb39PWYvECN5h9GI+RYrf7/MN3oRhm5boT43oi +cG/FAoGBALD1zSG9qrysLg8fw4dc4cs6dAHZhAszh47zw2WiMmUVWQZCbB+uhs44 +qGCAaer5KdnTqy9NdwW6rlcr4Y8jUFnMlMFA5HdmHkIfgTi+zi4Qf1mb9yzpJqnU +jKflsh1Lyyqv2KsoIMz4vjew+lCVn80FZaEEQ1q9tAkyu5m53w65 +-----END RSA PRIVATE KEY-----` + func TestRoundTripper401Refresh(t *testing.T) { mockRT := new(MockRoundTripper) client := &http.Client{Transport: mockRT} @@ -56,7 +87,7 @@ func TestRoundTripper401Refresh(t *testing.T) { } logger, _ := logruslog.NewDefaultLogger(logrus.New()) - tp := NewTokenProvider(conn, nil, client, logger) + tp := NewTokenProvider(conn, nil, client, logger, "") rt := NewRefreshRoundTripper(mockRT, tp) // Request @@ -100,3 +131,163 @@ func TestRoundTripper401Refresh(t *testing.T) { mockRT.AssertExpectations(t) } + +func TestRoundTripper401WithAppKeyRefresh(t *testing.T) { + mockRT := new(MockRoundTripper) + + expiry := time.Now().Add(10 * time.Minute) // Not expired (proactive refresh won't trigger) + conn := &models.GithubConnection{ + GithubConn: models.GithubConn{ + GithubAccessToken: models.GithubAccessToken{ + AccessToken: api.AccessToken{ + Token: "old_app_token", + }, + }, + TokenExpiresAt: &expiry, + }, + } + // Use tokens slice so GetToken returns the current token + conn.UpdateToken("old_app_token", "", &expiry, nil) + + // refreshFn simulates minting a new installation token + refreshCalled := 0 + tp := &TokenProvider{ + conn: conn, + refreshFn: func(tp *TokenProvider) errors.Error { + refreshCalled++ + newExpiry := time.Now().Add(1 * time.Hour) + tp.conn.UpdateToken("new_app_token", "", &newExpiry, nil) + return nil + }, + } + + rt := NewRefreshRoundTripper(mockRT, tp) + + req, _ := http.NewRequest("GET", "https://api.github.com/repos/test/test", nil) + + // 1. First call returns 401 + resp401 := &http.Response{ + StatusCode: 401, + Body: io.NopCloser(bytes.NewBufferString("Bad credentials")), + } + mockRT.On("RoundTrip", mock.MatchedBy(func(r *http.Request) bool { + return r.Header.Get("Authorization") == "Bearer old_app_token" + })).Return(resp401, nil).Once() + + // 2. Retry call with new token (after refreshFn runs) + resp200 := &http.Response{ + StatusCode: 200, + Body: io.NopCloser(bytes.NewBufferString(`{"full_name":"test/test"}`)), + } + mockRT.On("RoundTrip", mock.MatchedBy(func(r *http.Request) bool { + return r.Header.Get("Authorization") == "Bearer new_app_token" + })).Return(resp200, nil).Once() + + // Execute + resp, err := rt.RoundTrip(req) + assert.NoError(t, err) + assert.Equal(t, 200, resp.StatusCode) + assert.Equal(t, 1, refreshCalled, "refreshFn should have been called exactly once") + + body, _ := io.ReadAll(resp.Body) + assert.Equal(t, `{"full_name":"test/test"}`, string(body)) + + mockRT.AssertExpectations(t) +} + +// TestProactiveRefreshNoDeadlock verifies that when the RefreshRoundTripper wraps +// the same http.Client's transport, a proactive token refresh does not deadlock. +// This reproduces the real-world scenario: GetToken() holds the mutex, calls +// refreshGitHubAppInstallationToken, which makes an HTTP request. If that request +// goes through the RefreshRoundTripper (re-entering GetToken), it would deadlock. +// The fix is that the refresh uses baseTransport directly. +func TestProactiveRefreshNoDeadlock(t *testing.T) { + // Set up a mock transport that will serve both: + // 1. The installation token refresh POST + // 2. The actual API GET after refresh + mockRT := new(MockRoundTripper) + client := &http.Client{Transport: mockRT} + + // Token is expired — proactive refresh WILL trigger on GetToken() + expired := time.Now().Add(-1 * time.Minute) + conn := &models.GithubConnection{ + GithubConn: models.GithubConn{ + RestConnection: api.RestConnection{ + Endpoint: "https://api.github.com/", + }, + MultiAuth: api.MultiAuth{ + AuthMethod: models.AppKey, + }, + GithubAccessToken: models.GithubAccessToken{ + AccessToken: api.AccessToken{ + Token: "expired_ghs_token", + }, + }, + GithubAppKey: models.GithubAppKey{ + AppKey: api.AppKey{ + AppId: "12345", + SecretKey: testRSAKey, + }, + InstallationID: 99999, + }, + TokenExpiresAt: &expired, + }, + } + conn.UpdateToken("expired_ghs_token", "", &expired, nil) + + // Create the TokenProvider with baseTransport = mockRT (the unwrapped transport). + // This is what NewAppInstallationTokenProvider does: it captures client.Transport + // BEFORE the caller wraps it with RefreshRoundTripper. + tp := NewAppInstallationTokenProvider(conn, nil, client, nil, "") + + // Now wrap the client's transport with RefreshRoundTripper (simulating what + // CreateApiClient does). After this, client.Transport = RefreshRoundTripper, + // but tp.baseTransport still points to mockRT. + rt := NewRefreshRoundTripper(mockRT, tp) + client.Transport = rt + + // Mock: installation token refresh POST (goes through baseTransport, not RT) + newExpiry := time.Now().Add(1 * time.Hour) + installTokenBody := `{"token":"new_ghs_token","expires_at":"` + newExpiry.Format(time.RFC3339) + `"}` + mockRT.On("RoundTrip", mock.MatchedBy(func(r *http.Request) bool { + return r.Method == "POST" && r.URL.Path == "/app/installations/99999/access_tokens" + })).Return(&http.Response{ + StatusCode: 201, + Body: io.NopCloser(bytes.NewBufferString(installTokenBody)), + }, nil).Once() + + // Mock: the actual API request (goes through RefreshRoundTripper → GetToken → mockRT) + mockRT.On("RoundTrip", mock.MatchedBy(func(r *http.Request) bool { + return r.Method == "GET" && r.URL.Path == "/repos/test/test" + })).Return(&http.Response{ + StatusCode: 200, + Body: io.NopCloser(bytes.NewBufferString(`{"full_name":"test/test"}`)), + }, nil).Once() + + // Execute through the RefreshRoundTripper with a timeout to detect deadlocks. + done := make(chan struct{}) + var resp *http.Response + var reqErr error + go func() { + req, _ := http.NewRequest("GET", "https://api.github.com/repos/test/test", nil) + resp, reqErr = rt.RoundTrip(req) + close(done) + }() + + select { + case <-done: + // Success — no deadlock + case <-time.After(5 * time.Second): + t.Fatal("DEADLOCK: RoundTrip did not complete within 5 seconds — " + + "the refresh call is likely going through RefreshRoundTripper instead of baseTransport") + } + + assert.NoError(t, reqErr) + assert.Equal(t, 200, resp.StatusCode) + assert.Equal(t, "new_ghs_token", conn.Token, "token should have been refreshed") + + body, _ := io.ReadAll(resp.Body) + assert.Equal(t, `{"full_name":"test/test"}`, string(body)) + + mockRT.AssertExpectations(t) +} diff --git a/backend/plugins/github/token/token_provider.go b/backend/plugins/github/token/token_provider.go index ed3fa2256e4..6af31aaf5af 100644 --- a/backend/plugins/github/token/token_provider.go +++ b/backend/plugins/github/token/token_provider.go @@ -40,23 +40,57 @@ const ( ) type TokenProvider struct { - conn *models.GithubConnection - dal dal.Dal - httpClient *http.Client - logger log.Logger - mu sync.Mutex - refreshURL string + conn *models.GithubConnection + dal dal.Dal + encryptionSecret string + httpClient *http.Client + baseTransport http.RoundTripper // original transport, before RefreshRoundTripper wrapping + logger log.Logger + mu sync.Mutex + refreshURL string + refreshFn func(*TokenProvider) errors.Error } // NewTokenProvider creates a TokenProvider for the given GitHub connection using // the provided DAL, HTTP client, and logger, and returns a pointer to it. -func NewTokenProvider(conn *models.GithubConnection, d dal.Dal, client *http.Client, logger log.Logger) *TokenProvider { +func NewTokenProvider(conn *models.GithubConnection, d dal.Dal, client *http.Client, logger log.Logger, encryptionSecret string) *TokenProvider { return &TokenProvider{ - conn: conn, - dal: d, - httpClient: client, - logger: logger, - refreshURL: "https://github.com/login/oauth/access_token", + conn: conn, + dal: d, + encryptionSecret: encryptionSecret, + httpClient: client, + logger: logger, + refreshURL: "https://github.com/login/oauth/access_token", + } +} + +// NewAppInstallationTokenProvider creates a TokenProvider that refreshes GitHub App installation tokens. +// IMPORTANT: Call this BEFORE wrapping the client's transport with RefreshRoundTripper, +// so that baseTransport captures the unwrapped transport and refresh calls don't deadlock. +func NewAppInstallationTokenProvider(conn *models.GithubConnection, d dal.Dal, client *http.Client, logger log.Logger, encryptionSecret string) *TokenProvider { + if logger != nil { + expiresStr := "unknown" + if conn.TokenExpiresAt != nil { + expiresStr = conn.TokenExpiresAt.Format(time.RFC3339) + } + logger.Info("Created AppInstallation token provider for connection %d (installation %d, token expires at %s)", + conn.ID, conn.InstallationID, expiresStr) + } + // Capture the transport now, before the caller wraps it with RefreshRoundTripper. + // This avoids a deadlock: refresh calls must bypass the RefreshRoundTripper that + // holds the TokenProvider mutex during GetToken(). + baseTransport := client.Transport + if baseTransport == nil { + baseTransport = http.DefaultTransport + } + return &TokenProvider{ + conn: conn, + dal: d, + encryptionSecret: encryptionSecret, + httpClient: client, + baseTransport: baseTransport, + logger: logger, + refreshFn: refreshGitHubAppInstallationToken, } } @@ -65,6 +99,14 @@ func (tp *TokenProvider) GetToken() (string, errors.Error) { defer tp.mu.Unlock() if tp.needsRefresh() { + if tp.logger != nil { + expiresStr := "unknown" + if tp.conn.TokenExpiresAt != nil { + expiresStr = tp.conn.TokenExpiresAt.Format(time.RFC3339) + } + tp.logger.Info("Proactive token refresh triggered for connection %d (token expires at %s)", + tp.conn.ID, expiresStr) + } if err := tp.refreshToken(); err != nil { return "", err } @@ -73,10 +115,6 @@ func (tp *TokenProvider) GetToken() (string, errors.Error) { } func (tp *TokenProvider) needsRefresh() bool { - if tp.conn.RefreshToken == "" { - return false - } - buffer := DefaultRefreshBuffer if envBuffer := os.Getenv("GITHUB_TOKEN_REFRESH_BUFFER_MINUTES"); envBuffer != "" { if val, err := strconv.Atoi(envBuffer); err == nil { @@ -84,6 +122,16 @@ func (tp *TokenProvider) needsRefresh() bool { } } + if tp.refreshFn != nil { + if tp.conn.TokenExpiresAt == nil { + return false + } + return time.Now().Add(buffer).After(*tp.conn.TokenExpiresAt) + } + + if tp.conn.RefreshToken == "" { + return false + } if tp.conn.TokenExpiresAt == nil { return false } @@ -91,6 +139,9 @@ func (tp *TokenProvider) needsRefresh() bool { } func (tp *TokenProvider) refreshToken() errors.Error { + if tp.refreshFn != nil { + return tp.refreshFn(tp) + } tp.logger.Info("Refreshing GitHub token for connection %d", tp.conn.ID) data := map[string]string{ @@ -159,13 +210,12 @@ func (tp *TokenProvider) refreshToken() errors.Error { ) if tp.dal != nil { - err := tp.dal.UpdateColumns(tp.conn, []dal.DalSet{ - {ColumnName: "token", Value: tp.conn.Token}, - {ColumnName: "refresh_token", Value: tp.conn.RefreshToken}, - {ColumnName: "token_expires_at", Value: tp.conn.TokenExpiresAt}, - {ColumnName: "refresh_token_expires_at", Value: tp.conn.RefreshTokenExpiresAt}, - }) - if err != nil { + // Manually encrypt and use UpdateColumns to persist only the token-related + // columns. We cannot use dal.Update (GORM Save) because it writes ALL fields + // including refresh_token_expires_at which may have Go zero time that MySQL + // rejects. We cannot use UpdateColumns with plaintext because it bypasses the + // GORM encdec serializer. So we encrypt manually and write the ciphertext. + if err := PersistEncryptedTokenColumns(tp.dal, tp.conn, tp.encryptionSecret, tp.logger, true); err != nil { tp.logger.Warn(err, "failed to persist refreshed token") } } @@ -184,8 +234,14 @@ func (tp *TokenProvider) ForceRefresh(oldToken string) errors.Error { // If the token has changed since the request was made, it means another thread // has already refreshed it. if tp.conn.Token != oldToken { + if tp.logger != nil { + tp.logger.Info("Skipping reactive token refresh for connection %d — token already changed by another goroutine", tp.conn.ID) + } return nil } + if tp.logger != nil { + tp.logger.Info("Reactive token refresh triggered for connection %d (received 401)", tp.conn.ID) + } return tp.refreshToken() } diff --git a/backend/plugins/github/token/token_provider_test.go b/backend/plugins/github/token/token_provider_test.go index 3319f55910f..a754ad63ce3 100644 --- a/backend/plugins/github/token/token_provider_test.go +++ b/backend/plugins/github/token/token_provider_test.go @@ -29,7 +29,6 @@ import ( "github.com/apache/incubator-devlake/core/errors" "github.com/apache/incubator-devlake/helpers/pluginhelper/api" "github.com/apache/incubator-devlake/impls/logruslog" - mockdal "github.com/apache/incubator-devlake/mocks/core/dal" "github.com/apache/incubator-devlake/plugins/github/models" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" @@ -93,7 +92,7 @@ func TestTokenProviderConcurrency(t *testing.T) { } logger, _ := logruslog.NewDefaultLogger(logrus.New()) - tp := NewTokenProvider(conn, nil, client, logger) + tp := NewTokenProvider(conn, nil, client, logger, "") // Mock response for refresh respBody := `{"access_token":"new_token","refresh_token":"new_refresh_token","expires_in":3600,"refresh_token_expires_in":3600}` @@ -143,44 +142,108 @@ func TestConfigurableBuffer(t *testing.T) { assert.False(t, tp.needsRefresh()) } -func TestPersistenceFailure(t *testing.T) { - mockRT := new(MockRoundTripper) - client := &http.Client{Transport: mockRT} - mockDal := new(mockdal.Dal) +// fakeRefreshFn returns a refreshFn that updates the connection token to newToken +// and increments the call counter pointed to by count. +func fakeRefreshFn(newToken string, count *int) func(*TokenProvider) errors.Error { + return func(tp *TokenProvider) errors.Error { + *count++ + newExpiry := time.Now().Add(1 * time.Hour) + tp.conn.UpdateToken(newToken, "", &newExpiry, nil) + return nil + } +} + +func TestNeedsRefreshWithRefreshFn(t *testing.T) { + callCount := 0 + tp := &TokenProvider{ + conn: &models.GithubConnection{}, + refreshFn: fakeRefreshFn("unused", &callCount), + } + + // Token not expired — outside default 5m buffer + expiry1 := time.Now().Add(10 * time.Minute) + tp.conn.TokenExpiresAt = &expiry1 + assert.False(t, tp.needsRefresh(), "should not refresh when token is 10m from expiry") + + // Token inside 5m buffer + expiry2 := time.Now().Add(2 * time.Minute) + tp.conn.TokenExpiresAt = &expiry2 + assert.True(t, tp.needsRefresh(), "should refresh when token is 2m from expiry") + // Token already expired + expiry3 := time.Now().Add(-1 * time.Minute) + tp.conn.TokenExpiresAt = &expiry3 + assert.True(t, tp.needsRefresh(), "should refresh when token is expired") + + // TokenExpiresAt is nil — can't determine expiry, don't refresh (401 fallback covers this) + tp.conn.TokenExpiresAt = nil + assert.False(t, tp.needsRefresh(), "should not refresh when TokenExpiresAt is nil") + + // Provider with neither refreshFn nor RefreshToken — should never refresh + tp2 := &TokenProvider{ + conn: &models.GithubConnection{}, + } + expiry4 := time.Now().Add(-1 * time.Minute) + tp2.conn.TokenExpiresAt = &expiry4 + assert.False(t, tp2.needsRefresh(), "should not refresh without refreshFn or RefreshToken") +} + +func TestAppKeyGetTokenTriggersRefresh(t *testing.T) { + callCount := 0 + expired := time.Now().Add(-1 * time.Minute) conn := &models.GithubConnection{ GithubConn: models.GithubConn{ - RefreshToken: "refresh_token", GithubAccessToken: models.GithubAccessToken{ AccessToken: api.AccessToken{ - Token: "old_token", + Token: "expired_token", }, }, - GithubAppKey: models.GithubAppKey{ - AppKey: api.AppKey{ - AppId: "123", - SecretKey: "secret", + TokenExpiresAt: &expired, + }, + } + + tp := &TokenProvider{ + conn: conn, + refreshFn: fakeRefreshFn("refreshed_app_token", &callCount), + } + + token, err := tp.GetToken() + assert.NoError(t, err) + assert.Equal(t, "refreshed_app_token", token) + assert.Equal(t, 1, callCount, "refreshFn should have been called exactly once") + + // Second call — token is now fresh, should not trigger refresh + token2, err := tp.GetToken() + assert.NoError(t, err) + assert.Equal(t, "refreshed_app_token", token2) + assert.Equal(t, 1, callCount, "refreshFn should not be called again for a fresh token") +} + +func TestAppKeyForceRefresh(t *testing.T) { + callCount := 0 + conn := &models.GithubConnection{ + GithubConn: models.GithubConn{ + GithubAccessToken: models.GithubAccessToken{ + AccessToken: api.AccessToken{ + Token: "old_app_token", }, }, }, } - logger, _ := logruslog.NewDefaultLogger(logrus.New()) - tp := NewTokenProvider(conn, mockDal, client, logger) - - // Mock response for refresh - respBody := `{"access_token":"new_token","refresh_token":"new_refresh_token","expires_in":3600,"refresh_token_expires_in":3600}` - resp := &http.Response{ - StatusCode: 200, - Body: io.NopCloser(bytes.NewBufferString(respBody)), + tp := &TokenProvider{ + conn: conn, + refreshFn: fakeRefreshFn("new_app_token", &callCount), } - mockRT.On("RoundTrip", mock.Anything).Return(resp, nil).Once() - // Mock DAL failure - mockDal.On("UpdateColumns", mock.Anything, mock.Anything, mock.AnythingOfType("[]dal.Clause")).Return(errors.Default.New("db error")) - err := tp.ForceRefresh("old_token") - assert.NoError(t, err) // Should not return error even if persistence fails + // ForceRefresh with matching old token — should trigger refresh + err := tp.ForceRefresh("old_app_token") + assert.NoError(t, err) + assert.Equal(t, 1, callCount) + assert.Equal(t, "new_app_token", conn.Token) - mockRT.AssertExpectations(t) - mockDal.AssertExpectations(t) + // ForceRefresh with stale old token — token has already changed, should be a no-op + err = tp.ForceRefresh("old_app_token") + assert.NoError(t, err) + assert.Equal(t, 1, callCount, "should not refresh when token has already changed") } From 1a3dd6765ee8a88fcdd2ad6ceb4b0c0f5f8b8b18 Mon Sep 17 00:00:00 2001 From: Klesh Wong Date: Thu, 12 Mar 2026 21:00:52 +0800 Subject: [PATCH 15/38] fix: cwe89 sql injection (#8762) --- backend/server/services/pushapi.go | 20 ++++++++++++++++++++ env.example | 1 + 2 files changed, 21 insertions(+) diff --git a/backend/server/services/pushapi.go b/backend/server/services/pushapi.go index deabe12b10d..d99d4e9067d 100644 --- a/backend/server/services/pushapi.go +++ b/backend/server/services/pushapi.go @@ -18,12 +18,32 @@ limitations under the License. package services import ( + "regexp" + "strings" + "github.com/apache/incubator-devlake/core/dal" "github.com/apache/incubator-devlake/core/errors" ) // InsertRow FIXME ... func InsertRow(table string, rows []map[string]interface{}) (int64, errors.Error) { + if !regexp.MustCompile(`^[a-zA-Z0-9_]+$`).MatchString(table) { + return 0, errors.BadInput.New("table name invalid") + } + + if allowedTables := cfg.GetString("PUSH_API_ALLOWED_TABLES"); allowedTables != "" { + allow := false + for _, t := range strings.Split(allowedTables, ",") { + if strings.TrimSpace(t) == table { + allow = true + break + } + } + if !allow { + return 0, errors.Forbidden.New("table name is not in the allowed list") + } + } + err := db.Create(rows, dal.From(table)) if err != nil { return 0, err diff --git a/env.example b/env.example index 58c89de1ac3..19acb7c94af 100755 --- a/env.example +++ b/env.example @@ -34,6 +34,7 @@ SKIP_SUBTASK_PROGRESS=false PORT=8080 MODE=release +# PUSH_API_ALLOWED_TABLES=table1,table2 NOTIFICATION_ENDPOINT= NOTIFICATION_SECRET= From 82d1582a1e48d8d26f24a6f3d9b0f89a2d1ea021 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sun, 15 Mar 2026 18:41:10 +0800 Subject: [PATCH 16/38] feat(q-dev): add logging data ingestion and enrich Kiro dashboards (#8767) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(q-dev): add logging data ingestion and enrich Kiro dashboards Add support for ingesting S3 logging data (GenerateAssistantResponse and GenerateCompletions events) into new database tables, and enrich all three Kiro Grafana dashboards with additional metrics. Changes: - New models: QDevChatLog and QDevCompletionLog for logging event data - New extractor: s3_logging_extractor.go parses JSON.gz logging files - Updated S3 collector to also handle .json.gz files - Added logging S3 prefixes (GenerateAssistantResponse, GenerateCompletions) - New dashboard: "Kiro AI Activity Insights" with 10 panels including model usage distribution, active hours, conversation depth, feature adoption (Steering/Spec), file type usage, and prompt/response trends - Enriched "Kiro Code Metrics Dashboard" with DocGeneration, TestGeneration, and Dev (Agentic) metric panels - Fixed "Kiro Usage Dashboard" per-user table to sort by user_id - Migration script for new tables * fix(q-dev): use separate base path for logging S3 prefixes Logging data lives under a different S3 prefix ("logging/") than user report data ("user-report/"). Add LoggingBasePath option (defaults to "logging") so logging prefixes are constructed correctly. * fix(q-dev): auto-scan logging path without extra config Kiro exports to two well-known S3 prefixes in the same bucket: - user-report/AWSLogs/{accountId}/KiroLogs/ (CSV reports) - logging/AWSLogs/{accountId}/KiroLogs/ (interaction logs) When AccountId is set, automatically scan both paths. The "logging" prefix is hardcoded since it's a standard Kiro export convention. No additional configuration needed. * fix(q-dev): update scope tooltip to mention logging data scanning * fix(q-dev): fix scope ID routing and CSV/JSON file separation Three fixes: 1. Use *scopeId (catch-all) route pattern instead of :scopeId so scope IDs containing "/" (e.g. "034362076319/2026") work in URL paths 2. CSV extractor now filters for .csv files only, preventing it from trying to parse .json.gz logging files as CSV 3. Frontend scope API calls now encodeURIComponent(scopeId) for safe URL encoding * fix(q-dev): resolve *scopeId route conflict with dispatcher pattern The catch-all *scopeId route conflicts with *scopeId/latest-sync-state. Follow Jenkins/Bitbucket pattern: use a single *scopeId route with a GetScopeDispatcher that checks for /latest-sync-state suffix and dispatches accordingly. All scope handlers now TrimLeft "/" from scopeId. * fix(q-dev): use URL-safe scope ID format (underscore separator) Scope IDs like "034362076319/2026" break URL routing because "/" is a path separator. Change ID format to "034362076319_2026" (underscore) when AccountId is set. The Prefix field still uses "/" for S3 path matching. Revert to standard :scopeId routes since IDs are now safe. Note: existing scopes need to be recreated after this change. * fix(q-dev): use NoPKModel instead of Model in archived logging models archived.Model only has ID+timestamps, missing RawDataOrigin fields (_raw_data_params etc.) that common.NoPKModel includes. This caused "Unknown column '_raw_data_params'" errors at runtime. * fix(q-dev): fix GROUP BY in per-user table to merge display_name variants Remove display_name from GROUP BY so same user_id with different display_name values gets merged. Use MAX(display_name) in SELECT. * fix(q-dev): normalize logging user IDs to match CSV short UUID format Logging data uses "d-{directoryId}.{UUID}" format while CSV user-report uses plain "{UUID}". Strip the "d-xxx." prefix so the same user maps to one user_id across both data sources. * fix(q-dev): normalize user IDs in CSV extractors and sort table DESC Apply normalizeUserId to both createUserReportData and createUserDataWithDisplayName so user_report CSV data also strips the "d-{directoryId}." prefix. Change per-user table sort to ORDER BY user_id DESC. * style(q-dev): fix gofmt formatting in chat_log models * perf(q-dev): parallelize logging S3 downloads and batch DB writes Optimize logging extractor performance: - 10 goroutine workers for parallel S3 file downloads - Batch 50 files per DB transaction instead of 1-per-file - sync.Map cache for display name resolution (avoid repeated IAM calls) - Parse records in memory during download, write all at once This should improve throughput from ~1.5 files/sec to ~15+ files/sec for typical logging file sizes. * fix(q-dev): check tx.Rollback error return to satisfy errcheck lint * feat(q-dev): add per-user model usage table and models column Add "Per-User Model Usage" table (panel 11) showing each user's request count and avg prompt/response length per model_id. Also add "Models Used" column to the Per-User Activity table. * fix(q-dev): remove per-user model usage table, keep models column only * feat(q-dev): add Kiro Executive Dashboard with cross-source analytics New dashboard "Kiro Executive Dashboard" with 12 panels covering: - KPIs: WAU, credits efficiency, acceptance rate, steering adoption - Trends: weekly active users, new vs returning users - Adoption funnel: Chat→Inline→CodeFix→Review→DocGen→TestGen→Agentic→Steering→Spec - Cost: credits pace vs projected monthly, idle power users - Quality: acceptance rate trends, code review findings, test generation - Efficiency: per-user productivity table with credits/line ratio Correlates data across user_report (credits), user_data (code metrics), and chat_log (interaction patterns) for holistic Kiro usage insights. * fix(q-dev): fix pie charts to show per-row slices instead of single total Set reduceOptions.values=true so Grafana treats each SQL result row as a separate pie slice. Fixes Model Usage Distribution, File Type Usage, Kiro Feature Adoption, and Active File Types pie charts. * fix(q-dev): cast Hour to string for Active Hours bar chart x-axis * fix(q-dev): fix pie chart single-slice and GROUP BY display_name issues 1. qdev_user_report Panel 4 (Subscription Tier Distribution): set reduceOptions.values=true to show per-tier slices 2. qdev_user_data Panel 6 (User Interactions): remove display_name from GROUP BY, use MAX(display_name) to merge same user * fix(q-dev): prevent data inflation in user_report JOIN user_data user_report has multiple rows per (user_id, date) due to client_type (KIRO_IDE, KIRO_CLI), but user_data has only one row per (user_id, date). A direct JOIN causes user_data metrics to be counted multiple times. Fix: pre-aggregate user_report by (user_id, date) in a subquery before joining, so the JOIN is always 1:1. Affects: Credits Efficiency stat and User Productivity table. --- backend/plugins/q_dev/api/s3_slice_api.go | 41 - backend/plugins/q_dev/impl/impl.go | 20 +- backend/plugins/q_dev/impl/impl_test.go | 4 +- backend/plugins/q_dev/models/chat_log.go | 51 + .../plugins/q_dev/models/completion_log.go | 43 + .../20260314_add_logging_tables.go | 43 + .../migrationscripts/archived/chat_log.go | 50 + .../archived/completion_log.go | 42 + .../q_dev/models/migrationscripts/register.go | 1 + backend/plugins/q_dev/models/s3_slice.go | 11 +- .../plugins/q_dev/tasks/s3_data_extractor.go | 14 +- .../plugins/q_dev/tasks/s3_file_collector.go | 6 +- .../q_dev/tasks/s3_logging_extractor.go | 438 ++++++++ .../src/plugins/register/q-dev/data-scope.tsx | 2 +- grafana/dashboards/qdev_executive.json | 958 ++++++++++++++++++ grafana/dashboards/qdev_logging.json | 800 +++++++++++++++ grafana/dashboards/qdev_user_data.json | 389 ++++++- grafana/dashboards/qdev_user_report.json | 8 +- 18 files changed, 2859 insertions(+), 62 deletions(-) create mode 100644 backend/plugins/q_dev/models/chat_log.go create mode 100644 backend/plugins/q_dev/models/completion_log.go create mode 100644 backend/plugins/q_dev/models/migrationscripts/20260314_add_logging_tables.go create mode 100644 backend/plugins/q_dev/models/migrationscripts/archived/chat_log.go create mode 100644 backend/plugins/q_dev/models/migrationscripts/archived/completion_log.go create mode 100644 backend/plugins/q_dev/tasks/s3_logging_extractor.go create mode 100644 grafana/dashboards/qdev_executive.json create mode 100644 grafana/dashboards/qdev_logging.json diff --git a/backend/plugins/q_dev/api/s3_slice_api.go b/backend/plugins/q_dev/api/s3_slice_api.go index 73708130294..158aa4ef785 100644 --- a/backend/plugins/q_dev/api/s3_slice_api.go +++ b/backend/plugins/q_dev/api/s3_slice_api.go @@ -60,62 +60,21 @@ func GetScopeList(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, er } // GetScope returns a single scope record -// @Summary get a Q Developer scope -// @Description get a Q Developer scope -// @Tags plugins/q_dev -// @Param connectionId path int true "connection ID" -// @Param scopeId path string true "scope id" -// @Param blueprints query bool false "include blueprint references" -// @Success 200 {object} ScopeDetail -// @Failure 400 {object} shared.ApiBody "Bad Request" -// @Failure 500 {object} shared.ApiBody "Internal Error" -// @Router /plugins/q_dev/connections/{connectionId}/scopes/{scopeId} [GET] func GetScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ScopeApi.GetScopeDetail(input) } // PatchScope updates a scope record -// @Summary patch a Q Developer scope -// @Description patch a Q Developer scope -// @Tags plugins/q_dev -// @Accept application/json -// @Param connectionId path int true "connection ID" -// @Param scopeId path string true "scope id" -// @Param scope body models.QDevS3Slice true "json" -// @Success 200 {object} models.QDevS3Slice -// @Failure 400 {object} shared.ApiBody "Bad Request" -// @Failure 500 {object} shared.ApiBody "Internal Error" -// @Router /plugins/q_dev/connections/{connectionId}/scopes/{scopeId} [PATCH] func PatchScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ScopeApi.Patch(input) } // DeleteScope removes a scope and optionally associated data. -// @Summary delete a Q Developer scope -// @Description delete Q Developer scope data -// @Tags plugins/q_dev -// @Param connectionId path int true "connection ID" -// @Param scopeId path string true "scope id" -// @Param delete_data_only query bool false "Only delete scope data" -// @Success 200 -// @Failure 400 {object} shared.ApiBody "Bad Request" -// @Failure 409 {object} srvhelper.DsRefs "References exist to this scope" -// @Failure 500 {object} shared.ApiBody "Internal Error" -// @Router /plugins/q_dev/connections/{connectionId}/scopes/{scopeId} [DELETE] func DeleteScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ScopeApi.Delete(input) } // GetScopeLatestSyncState returns scope sync state info -// @Summary latest sync state for a Q Developer scope -// @Description get latest sync state for a Q Developer scope -// @Tags plugins/q_dev -// @Param connectionId path int true "connection ID" -// @Param scopeId path string true "scope id" -// @Success 200 -// @Failure 400 {object} shared.ApiBody "Bad Request" -// @Failure 500 {object} shared.ApiBody "Internal Error" -// @Router /plugins/q_dev/connections/{connectionId}/scopes/{scopeId}/latest-sync-state [GET] func GetScopeLatestSyncState(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ScopeApi.GetScopeLatestSyncState(input) } diff --git a/backend/plugins/q_dev/impl/impl.go b/backend/plugins/q_dev/impl/impl.go index e38fe7ad73c..3c6e1ed1644 100644 --- a/backend/plugins/q_dev/impl/impl.go +++ b/backend/plugins/q_dev/impl/impl.go @@ -58,6 +58,8 @@ func (p QDev) GetTablesInfo() []dal.Tabler { &models.QDevS3FileMeta{}, &models.QDevS3Slice{}, &models.QDevUserReport{}, + &models.QDevChatLog{}, + &models.QDevCompletionLog{}, } } @@ -85,6 +87,7 @@ func (p QDev) SubTaskMetas() []plugin.SubTaskMeta { return []plugin.SubTaskMeta{ tasks.CollectQDevS3FilesMeta, tasks.ExtractQDevS3DataMeta, + tasks.ExtractQDevLoggingDataMeta, } } @@ -127,10 +130,21 @@ func (p QDev) PrepareTaskData(taskCtx plugin.TaskContext, options map[string]int if op.Month != nil { timePart = fmt.Sprintf("%04d/%02d", op.Year, *op.Month) } - base := fmt.Sprintf("%s/AWSLogs/%s/KiroLogs", op.BasePath, op.AccountId) + // Kiro exports data to two well-known S3 prefixes: + // {basePath}/AWSLogs/{accountId}/KiroLogs/ — user report CSVs + // logging/AWSLogs/{accountId}/KiroLogs/ — interaction logs (JSON.gz) + // When basePath is empty, default to "user-report" for CSV data. + reportBase := op.BasePath + if reportBase == "" { + reportBase = "user-report" + } + csvBase := fmt.Sprintf("%s/AWSLogs/%s/KiroLogs", reportBase, op.AccountId) + logBase := fmt.Sprintf("logging/AWSLogs/%s/KiroLogs", op.AccountId) s3Prefixes = []string{ - fmt.Sprintf("%s/by_user_analytic/%s/%s", base, region, timePart), - fmt.Sprintf("%s/user_report/%s/%s", base, region, timePart), + fmt.Sprintf("%s/by_user_analytic/%s/%s", csvBase, region, timePart), + fmt.Sprintf("%s/user_report/%s/%s", csvBase, region, timePart), + fmt.Sprintf("%s/GenerateAssistantResponse/%s/%s", logBase, region, timePart), + fmt.Sprintf("%s/GenerateCompletions/%s/%s", logBase, region, timePart), } } else { // Legacy scope: use S3Prefix directly diff --git a/backend/plugins/q_dev/impl/impl_test.go b/backend/plugins/q_dev/impl/impl_test.go index e61b5325162..7153617ab9a 100644 --- a/backend/plugins/q_dev/impl/impl_test.go +++ b/backend/plugins/q_dev/impl/impl_test.go @@ -34,11 +34,11 @@ func TestQDev_BasicPluginMethods(t *testing.T) { // Test table info tables := plugin.GetTablesInfo() - assert.Len(t, tables, 5) + assert.Len(t, tables, 7) // Test subtask metas subtasks := plugin.SubTaskMetas() - assert.Len(t, subtasks, 2) + assert.Len(t, subtasks, 3) // Test API resources apiResources := plugin.ApiResources() diff --git a/backend/plugins/q_dev/models/chat_log.go b/backend/plugins/q_dev/models/chat_log.go new file mode 100644 index 00000000000..06679c515b6 --- /dev/null +++ b/backend/plugins/q_dev/models/chat_log.go @@ -0,0 +1,51 @@ +/* +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 models + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/common" +) + +// QDevChatLog stores parsed data from GenerateAssistantResponse logging events +type QDevChatLog struct { + common.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + RequestId string `gorm:"primaryKey;type:varchar(255)" json:"requestId"` + UserId string `gorm:"index;type:varchar(255)" json:"userId"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` + Timestamp time.Time `gorm:"index" json:"timestamp"` + ChatTriggerType string `gorm:"type:varchar(50)" json:"chatTriggerType"` + HasCustomization bool `json:"hasCustomization"` + ConversationId string `gorm:"type:varchar(255)" json:"conversationId"` + UtteranceId string `gorm:"type:varchar(255)" json:"utteranceId"` + ModelId string `gorm:"type:varchar(100)" json:"modelId"` + PromptLength int `json:"promptLength"` + ResponseLength int `json:"responseLength"` + OpenFileCount int `json:"openFileCount"` + ActiveFileName string `gorm:"type:varchar(512)" json:"activeFileName"` + ActiveFileExtension string `gorm:"type:varchar(50)" json:"activeFileExtension"` + HasSteering bool `json:"hasSteering"` + IsSpecMode bool `json:"isSpecMode"` +} + +func (QDevChatLog) TableName() string { + return "_tool_q_dev_chat_log" +} diff --git a/backend/plugins/q_dev/models/completion_log.go b/backend/plugins/q_dev/models/completion_log.go new file mode 100644 index 00000000000..0d0e0404ce8 --- /dev/null +++ b/backend/plugins/q_dev/models/completion_log.go @@ -0,0 +1,43 @@ +/* +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 models + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/common" +) + +// QDevCompletionLog stores parsed data from GenerateCompletions logging events +type QDevCompletionLog struct { + common.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + RequestId string `gorm:"primaryKey;type:varchar(255)" json:"requestId"` + UserId string `gorm:"index;type:varchar(255)" json:"userId"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` + Timestamp time.Time `gorm:"index" json:"timestamp"` + FileName string `gorm:"type:varchar(512)" json:"fileName"` + FileExtension string `gorm:"type:varchar(50)" json:"fileExtension"` + HasCustomization bool `json:"hasCustomization"` + CompletionsCount int `json:"completionsCount"` +} + +func (QDevCompletionLog) TableName() string { + return "_tool_q_dev_completion_log" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/20260314_add_logging_tables.go b/backend/plugins/q_dev/models/migrationscripts/20260314_add_logging_tables.go new file mode 100644 index 00000000000..cbd5943ecd2 --- /dev/null +++ b/backend/plugins/q_dev/models/migrationscripts/20260314_add_logging_tables.go @@ -0,0 +1,43 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/helpers/migrationhelper" + "github.com/apache/incubator-devlake/plugins/q_dev/models/migrationscripts/archived" +) + +type addLoggingTables struct{} + +func (*addLoggingTables) Up(basicRes context.BasicRes) errors.Error { + return migrationhelper.AutoMigrateTables( + basicRes, + &archived.QDevChatLog{}, + &archived.QDevCompletionLog{}, + ) +} + +func (*addLoggingTables) Version() uint64 { + return 20260314000001 +} + +func (*addLoggingTables) Name() string { + return "Add chat_log and completion_log tables for Kiro logging data" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/archived/chat_log.go b/backend/plugins/q_dev/models/migrationscripts/archived/chat_log.go new file mode 100644 index 00000000000..8278f52ff1e --- /dev/null +++ b/backend/plugins/q_dev/models/migrationscripts/archived/chat_log.go @@ -0,0 +1,50 @@ +/* +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 archived + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/migrationscripts/archived" +) + +type QDevChatLog struct { + archived.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + RequestId string `gorm:"primaryKey;type:varchar(255)" json:"requestId"` + UserId string `gorm:"index;type:varchar(255)" json:"userId"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` + Timestamp time.Time `gorm:"index" json:"timestamp"` + ChatTriggerType string `gorm:"type:varchar(50)" json:"chatTriggerType"` + HasCustomization bool `json:"hasCustomization"` + ConversationId string `gorm:"type:varchar(255)" json:"conversationId"` + UtteranceId string `gorm:"type:varchar(255)" json:"utteranceId"` + ModelId string `gorm:"type:varchar(100)" json:"modelId"` + PromptLength int `json:"promptLength"` + ResponseLength int `json:"responseLength"` + OpenFileCount int `json:"openFileCount"` + ActiveFileName string `gorm:"type:varchar(512)" json:"activeFileName"` + ActiveFileExtension string `gorm:"type:varchar(50)" json:"activeFileExtension"` + HasSteering bool `json:"hasSteering"` + IsSpecMode bool `json:"isSpecMode"` +} + +func (QDevChatLog) TableName() string { + return "_tool_q_dev_chat_log" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/archived/completion_log.go b/backend/plugins/q_dev/models/migrationscripts/archived/completion_log.go new file mode 100644 index 00000000000..035c13ef2e0 --- /dev/null +++ b/backend/plugins/q_dev/models/migrationscripts/archived/completion_log.go @@ -0,0 +1,42 @@ +/* +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 archived + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/migrationscripts/archived" +) + +type QDevCompletionLog struct { + archived.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + RequestId string `gorm:"primaryKey;type:varchar(255)" json:"requestId"` + UserId string `gorm:"index;type:varchar(255)" json:"userId"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` + Timestamp time.Time `gorm:"index" json:"timestamp"` + FileName string `gorm:"type:varchar(512)" json:"fileName"` + FileExtension string `gorm:"type:varchar(50)" json:"fileExtension"` + HasCustomization bool `json:"hasCustomization"` + CompletionsCount int `json:"completionsCount"` +} + +func (QDevCompletionLog) TableName() string { + return "_tool_q_dev_completion_log" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/register.go b/backend/plugins/q_dev/models/migrationscripts/register.go index 9c68ae8f815..5480d5eaf29 100644 --- a/backend/plugins/q_dev/models/migrationscripts/register.go +++ b/backend/plugins/q_dev/models/migrationscripts/register.go @@ -35,5 +35,6 @@ func All() []plugin.MigrationScript { new(addAccountIdToS3Slice), new(fixDedupUserTables), new(resetS3FileMetaProcessed), + new(addLoggingTables), } } diff --git a/backend/plugins/q_dev/models/s3_slice.go b/backend/plugins/q_dev/models/s3_slice.go index e918258a908..19ecd6920bd 100644 --- a/backend/plugins/q_dev/models/s3_slice.go +++ b/backend/plugins/q_dev/models/s3_slice.go @@ -99,7 +99,16 @@ func (s *QDevS3Slice) normalize(strict bool) error { } if s.Id == "" { - s.Id = s.Prefix + if s.AccountId != "" { + // Use URL-safe ID: account_year or account_year_month + if s.Month != nil { + s.Id = fmt.Sprintf("%s_%04d_%02d", s.AccountId, s.Year, *s.Month) + } else { + s.Id = fmt.Sprintf("%s_%04d", s.AccountId, s.Year) + } + } else { + s.Id = s.Prefix + } } if s.AccountId != "" { diff --git a/backend/plugins/q_dev/tasks/s3_data_extractor.go b/backend/plugins/q_dev/tasks/s3_data_extractor.go index 1cf2a9f2ef5..da29bca07fe 100644 --- a/backend/plugins/q_dev/tasks/s3_data_extractor.go +++ b/backend/plugins/q_dev/tasks/s3_data_extractor.go @@ -40,10 +40,11 @@ func ExtractQDevS3Data(taskCtx plugin.SubTaskContext) errors.Error { data := taskCtx.GetData().(*QDevTaskData) db := taskCtx.GetDal() - // 查询未处理的文件元数据 + // 查询未处理的CSV文件元数据(排除.json.gz日志文件) cursor, err := db.Cursor( dal.From(&models.QDevS3FileMeta{}), - dal.Where("connection_id = ? AND processed = ?", data.Options.ConnectionId, false), + dal.Where("connection_id = ? AND processed = ? AND file_name LIKE ?", + data.Options.ConnectionId, false, "%.csv"), ) if err != nil { return errors.Default.Wrap(err, "failed to get file metadata cursor") @@ -202,8 +203,8 @@ func createUserReportData(logger interface { } } - // UserId - report.UserId = getStringField(fieldMap, "UserId") + // UserId (normalize to strip "d-{directoryId}." prefix if present) + report.UserId = normalizeUserId(getStringField(fieldMap, "UserId")) if report.UserId == "" { return nil, errors.Default.New("UserId not found in CSV record") } @@ -303,11 +304,12 @@ func createUserDataWithDisplayName(logger interface { var err error var ok bool - // 设置UserId - userData.UserId, ok = fieldMap["UserId"] + // 设置UserId (normalize to strip "d-{directoryId}." prefix if present) + rawUserId, ok := fieldMap["UserId"] if !ok { return nil, errors.Default.New("UserId not found in CSV record") } + userData.UserId = normalizeUserId(rawUserId) // 设置DisplayName (new functionality) userData.DisplayName = resolveDisplayName(logger, userData.UserId, identityClient) diff --git a/backend/plugins/q_dev/tasks/s3_file_collector.go b/backend/plugins/q_dev/tasks/s3_file_collector.go index 9d40919ae76..1ab4f8f0aa7 100644 --- a/backend/plugins/q_dev/tasks/s3_file_collector.go +++ b/backend/plugins/q_dev/tasks/s3_file_collector.go @@ -59,9 +59,9 @@ func CollectQDevS3Files(taskCtx plugin.SubTaskContext) errors.Error { } for _, object := range result.Contents { - // Only process CSV files - if !strings.HasSuffix(*object.Key, ".csv") { - taskCtx.GetLogger().Debug("Skipping non-CSV file: %s", *object.Key) + // Only process CSV and JSON.gz files + if !strings.HasSuffix(*object.Key, ".csv") && !strings.HasSuffix(*object.Key, ".json.gz") { + taskCtx.GetLogger().Debug("Skipping unsupported file: %s", *object.Key) continue } diff --git a/backend/plugins/q_dev/tasks/s3_logging_extractor.go b/backend/plugins/q_dev/tasks/s3_logging_extractor.go new file mode 100644 index 00000000000..df55a663b13 --- /dev/null +++ b/backend/plugins/q_dev/tasks/s3_logging_extractor.go @@ -0,0 +1,438 @@ +/* +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 ( + "compress/gzip" + "encoding/json" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/plugins/q_dev/models" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/s3" +) + +var _ plugin.SubTaskEntryPoint = ExtractQDevLoggingData + +const ( + loggingBatchSize = 50 // number of files to process per DB transaction + s3DownloadWorkers = 10 // parallel S3 download goroutines + s3DownloadChanSize = 20 // buffered channel size for download results +) + +// downloadResult holds the parsed records from one S3 file +type downloadResult struct { + FileMeta *models.QDevS3FileMeta + ChatLogs []*models.QDevChatLog + CompLogs []*models.QDevCompletionLog + Err error +} + +// ExtractQDevLoggingData extracts logging data from S3 JSON.gz files +func ExtractQDevLoggingData(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*QDevTaskData) + db := taskCtx.GetDal() + + cursor, err := db.Cursor( + dal.From(&models.QDevS3FileMeta{}), + dal.Where("connection_id = ? AND processed = ? AND file_name LIKE ?", + data.Options.ConnectionId, false, "%.json.gz"), + ) + if err != nil { + return errors.Default.Wrap(err, "failed to get logging file metadata cursor") + } + defer cursor.Close() + + // Collect all file metas first + var fileMetas []*models.QDevS3FileMeta + for cursor.Next() { + fm := &models.QDevS3FileMeta{} + if err := db.Fetch(cursor, fm); err != nil { + return errors.Default.Wrap(err, "failed to fetch file metadata") + } + fileMetas = append(fileMetas, fm) + } + + if len(fileMetas) == 0 { + return nil + } + + taskCtx.SetProgress(0, len(fileMetas)) + taskCtx.GetLogger().Info("Processing %d logging files with %d workers", len(fileMetas), s3DownloadWorkers) + + // Display name cache to avoid repeated IAM calls + displayNameCache := &sync.Map{} + + // Process in batches + for batchStart := 0; batchStart < len(fileMetas); batchStart += loggingBatchSize { + batchEnd := batchStart + loggingBatchSize + if batchEnd > len(fileMetas) { + batchEnd = len(fileMetas) + } + batch := fileMetas[batchStart:batchEnd] + + // Parallel download and parse + results := parallelDownloadAndParse(taskCtx, data, batch, displayNameCache) + + // Check for download errors + for _, r := range results { + if r.Err != nil { + return errors.Default.Wrap(errors.Convert(r.Err), + "failed to download/parse "+r.FileMeta.FileName) + } + } + + // Batch write to DB in a single transaction + tx := db.Begin() + var txErr errors.Error + for _, r := range results { + for _, chatLog := range r.ChatLogs { + if txErr = tx.CreateOrUpdate(chatLog); txErr != nil { + break + } + } + if txErr != nil { + break + } + for _, compLog := range r.CompLogs { + if txErr = tx.CreateOrUpdate(compLog); txErr != nil { + break + } + } + if txErr != nil { + break + } + r.FileMeta.Processed = true + now := time.Now() + r.FileMeta.ProcessedTime = &now + if txErr = tx.Update(r.FileMeta); txErr != nil { + break + } + } + if txErr != nil { + if rbErr := tx.Rollback(); rbErr != nil { + taskCtx.GetLogger().Error(rbErr, "failed to rollback transaction") + } + return errors.Default.Wrap(txErr, "failed to write logging batch") + } + if err := tx.Commit(); err != nil { + return errors.Default.Wrap(err, "failed to commit batch") + } + + taskCtx.IncProgress(len(batch)) + } + + return nil +} + +// parallelDownloadAndParse downloads and parses S3 files concurrently +func parallelDownloadAndParse( + taskCtx plugin.SubTaskContext, + data *QDevTaskData, + fileMetas []*models.QDevS3FileMeta, + displayNameCache *sync.Map, +) []downloadResult { + results := make([]downloadResult, len(fileMetas)) + jobs := make(chan int, s3DownloadChanSize) + var wg sync.WaitGroup + + // Start workers + for w := 0; w < s3DownloadWorkers; w++ { + wg.Add(1) + go func() { + defer wg.Done() + for idx := range jobs { + fm := fileMetas[idx] + result := downloadAndParseFile(taskCtx, data, fm, displayNameCache) + results[idx] = result + } + }() + } + + // Send jobs + for i := range fileMetas { + jobs <- i + } + close(jobs) + wg.Wait() + + return results +} + +// downloadAndParseFile downloads one S3 file and parses it into model records +func downloadAndParseFile( + taskCtx plugin.SubTaskContext, + data *QDevTaskData, + fileMeta *models.QDevS3FileMeta, + displayNameCache *sync.Map, +) downloadResult { + result := downloadResult{FileMeta: fileMeta} + + getResult, err := data.S3Client.S3.GetObject(&s3.GetObjectInput{ + Bucket: aws.String(data.S3Client.Bucket), + Key: aws.String(fileMeta.S3Path), + }) + if err != nil { + result.Err = err + return result + } + defer getResult.Body.Close() + + gzReader, err := gzip.NewReader(getResult.Body) + if err != nil { + result.Err = err + return result + } + defer gzReader.Close() + + var logFile loggingFile + if err := json.NewDecoder(gzReader).Decode(&logFile); err != nil { + result.Err = err + return result + } + + isChatLog := strings.Contains(fileMeta.S3Path, "GenerateAssistantResponse") + + for _, rawRecord := range logFile.Records { + if isChatLog { + chatLog, err := parseChatRecord(rawRecord, fileMeta, data.IdentityClient, displayNameCache) + if err != nil { + result.Err = err + return result + } + if chatLog != nil { + result.ChatLogs = append(result.ChatLogs, chatLog) + } + } else { + compLog, err := parseCompletionRecord(rawRecord, fileMeta, data.IdentityClient, displayNameCache) + if err != nil { + result.Err = err + return result + } + if compLog != nil { + result.CompLogs = append(result.CompLogs, compLog) + } + } + } + + return result +} + +// cachedResolveDisplayName resolves display name with caching +func cachedResolveDisplayName(userId string, identityClient UserDisplayNameResolver, cache *sync.Map) string { + if v, ok := cache.Load(userId); ok { + return v.(string) + } + if identityClient == nil { + cache.Store(userId, userId) + return userId + } + displayName, err := identityClient.ResolveUserDisplayName(userId) + if err != nil || displayName == "" { + cache.Store(userId, userId) + return userId + } + cache.Store(userId, displayName) + return displayName +} + +// JSON structures for logging data + +type loggingFile struct { + Records []json.RawMessage `json:"records"` +} + +type chatLogRecord struct { + Request *chatLogRequest `json:"generateAssistantResponseEventRequest"` + Response *chatLogResponse `json:"generateAssistantResponseEventResponse"` +} + +type chatLogRequest struct { + UserID string `json:"userId"` + Timestamp string `json:"timeStamp"` + ChatTriggerType string `json:"chatTriggerType"` + CustomizationArn *string `json:"customizationArn"` + ModelID string `json:"modelId"` + Prompt string `json:"prompt"` +} + +type chatLogResponse struct { + RequestID string `json:"requestId"` + AssistantResponse string `json:"assistantResponse"` + MessageMetadata struct { + ConversationID *string `json:"conversationId"` + UtteranceID *string `json:"utteranceId"` + } `json:"messageMetadata"` +} + +type completionLogRecord struct { + Request *completionLogRequest `json:"generateCompletionsEventRequest"` + Response *completionLogResponse `json:"generateCompletionsEventResponse"` +} + +type completionLogRequest struct { + UserID string `json:"userId"` + Timestamp string `json:"timeStamp"` + FileName string `json:"fileName"` + CustomizationArn *string `json:"customizationArn"` +} + +type completionLogResponse struct { + RequestID string `json:"requestId"` + Completions []json.RawMessage `json:"completions"` +} + +func parseChatRecord(raw json.RawMessage, fileMeta *models.QDevS3FileMeta, identityClient UserDisplayNameResolver, cache *sync.Map) (*models.QDevChatLog, error) { + var record chatLogRecord + if err := json.Unmarshal(raw, &record); err != nil { + return nil, err + } + + if record.Request == nil || record.Response == nil { + return nil, nil + } + + ts, err := time.Parse(time.RFC3339Nano, record.Request.Timestamp) + if err != nil { + ts = time.Now() + } + + userId := normalizeUserId(record.Request.UserID) + chatLog := &models.QDevChatLog{ + ConnectionId: fileMeta.ConnectionId, + ScopeId: fileMeta.ScopeId, + RequestId: record.Response.RequestID, + UserId: userId, + DisplayName: cachedResolveDisplayName(userId, identityClient, cache), + Timestamp: ts, + ChatTriggerType: record.Request.ChatTriggerType, + HasCustomization: record.Request.CustomizationArn != nil && *record.Request.CustomizationArn != "", + ModelId: record.Request.ModelID, + PromptLength: len(record.Request.Prompt), + ResponseLength: len(record.Response.AssistantResponse), + } + + // Parse structured info from prompt + prompt := record.Request.Prompt + chatLog.OpenFileCount = countOpenFiles(prompt) + chatLog.ActiveFileName, chatLog.ActiveFileExtension = parseActiveFile(prompt) + chatLog.HasSteering = strings.Contains(prompt, ".kiro/steering") + chatLog.IsSpecMode = strings.Contains(prompt, "implicit-rules") + + if record.Response.MessageMetadata.ConversationID != nil { + chatLog.ConversationId = *record.Response.MessageMetadata.ConversationID + } + if record.Response.MessageMetadata.UtteranceID != nil { + chatLog.UtteranceId = *record.Response.MessageMetadata.UtteranceID + } + + return chatLog, nil +} + +// countOpenFiles counts tags within block +func countOpenFiles(prompt string) int { + start := strings.Index(prompt, "") + if start == -1 { + return 0 + } + end := strings.Index(prompt, "") + if end == -1 { + return 0 + } + block := prompt[start:end] + return strings.Count(block, "") + if start == -1 { + return "", "" + } + end := strings.Index(prompt[start:], "") + if end == -1 { + return "", "" + } + block := prompt[start : start+end] + nameStart := strings.Index(block, "name=\"") + if nameStart == -1 { + return "", "" + } + nameStart += len("name=\"") + nameEnd := strings.Index(block[nameStart:], "\"") + if nameEnd == -1 { + return "", "" + } + fileName := block[nameStart : nameStart+nameEnd] + ext := filepath.Ext(fileName) + return fileName, ext +} + +func parseCompletionRecord(raw json.RawMessage, fileMeta *models.QDevS3FileMeta, identityClient UserDisplayNameResolver, cache *sync.Map) (*models.QDevCompletionLog, error) { + var record completionLogRecord + if err := json.Unmarshal(raw, &record); err != nil { + return nil, err + } + + if record.Request == nil || record.Response == nil { + return nil, nil + } + + ts, err := time.Parse(time.RFC3339Nano, record.Request.Timestamp) + if err != nil { + ts = time.Now() + } + + userId := normalizeUserId(record.Request.UserID) + return &models.QDevCompletionLog{ + ConnectionId: fileMeta.ConnectionId, + ScopeId: fileMeta.ScopeId, + RequestId: record.Response.RequestID, + UserId: userId, + DisplayName: cachedResolveDisplayName(userId, identityClient, cache), + Timestamp: ts, + FileName: record.Request.FileName, + FileExtension: filepath.Ext(record.Request.FileName), + HasCustomization: record.Request.CustomizationArn != nil && *record.Request.CustomizationArn != "", + CompletionsCount: len(record.Response.Completions), + }, nil +} + +// normalizeUserId strips the "d-{directoryId}." prefix from Identity Center user IDs +// so that logging user IDs match the short UUID format used in user-report CSVs. +func normalizeUserId(userId string) string { + if idx := strings.LastIndex(userId, "."); idx != -1 && strings.HasPrefix(userId, "d-") { + return userId[idx+1:] + } + return userId +} + +var ExtractQDevLoggingDataMeta = plugin.SubTaskMeta{ + Name: "extractQDevLoggingData", + EntryPoint: ExtractQDevLoggingData, + EnabledByDefault: true, + Description: "Extract logging data from S3 JSON.gz files (chat and completion events)", + DomainTypes: []string{plugin.DOMAIN_TYPE_CROSS}, + Dependencies: []*plugin.SubTaskMeta{&CollectQDevS3FilesMeta}, +} diff --git a/config-ui/src/plugins/register/q-dev/data-scope.tsx b/config-ui/src/plugins/register/q-dev/data-scope.tsx index c5eff68db6a..657d0bdb890 100644 --- a/config-ui/src/plugins/register/q-dev/data-scope.tsx +++ b/config-ui/src/plugins/register/q-dev/data-scope.tsx @@ -326,7 +326,7 @@ export const QDevDataScope = ({ const timePart = meta.month ? `${meta.year}/${ensureLeadingZero(meta.month)}` : `${meta.year}`; return ( {meta.basePath}/…/{meta.accountId}/…/{timePart} diff --git a/grafana/dashboards/qdev_executive.json b/grafana/dashboards/qdev_executive.json new file mode 100644 index 00000000000..c6e2524d70b --- /dev/null +++ b/grafana/dashboards/qdev_executive.json @@ -0,0 +1,958 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "datasource": "mysql", + "description": "Distinct users with chat activity in the last 7 days", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT COUNT(DISTINCT user_id) as 'WAU'\nFROM lake._tool_q_dev_chat_log\nWHERE timestamp >= DATE_SUB(NOW(), INTERVAL 7 DAY)", + "refId": "A" + } + ], + "title": "Weekly Active Users", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Average credits spent per accepted line of code", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(SUM(r.credits_used) / NULLIF(SUM(d.total_accepted), 0), 2) as 'Credits per Accepted Line'\nFROM (\n SELECT user_id, date, SUM(credits_used) as credits_used\n FROM lake._tool_q_dev_user_report\n WHERE $__timeFilter(date)\n GROUP BY user_id, date\n) r\nJOIN (\n SELECT user_id, date,\n (inline_ai_code_lines + chat_ai_code_lines + code_fix_accepted_lines + dev_accepted_lines) as total_accepted\n FROM lake._tool_q_dev_user_data\n WHERE $__timeFilter(date)\n) d ON r.user_id = d.user_id AND r.date = d.date", + "refId": "A" + } + ], + "title": "Credits Efficiency", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Percentage of inline suggestions accepted", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 12, + "y": 0 + }, + "id": 3, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(SUM(inline_acceptance_count) / NULLIF(SUM(inline_suggestions_count), 0) * 100, 1) as 'Acceptance %'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)", + "refId": "A" + } + ], + "title": "Inline Acceptance Rate", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Percentage of users using steering rules", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 18, + "y": 0 + }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT CONCAT(ROUND(COUNT(DISTINCT CASE WHEN has_steering = 1 THEN user_id END) / NULLIF(COUNT(DISTINCT user_id), 0) * 100, 0), '%') as 'Users with Steering'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)", + "refId": "A" + } + ], + "title": "Steering Adoption", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Weekly active user count over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 6 + }, + "id": 5, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n STR_TO_DATE(CONCAT(YEARWEEK(timestamp, 1), ' Monday'), '%X%V %W') as time,\n COUNT(DISTINCT user_id) as 'Active Users'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY YEARWEEK(timestamp, 1)\nORDER BY time", + "refId": "A" + } + ], + "title": "Weekly Active Users Trend", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "New vs returning users by week", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 6 + }, + "id": 6, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n week as time,\n SUM(CASE WHEN is_new = 1 THEN 1 ELSE 0 END) as 'New Users',\n SUM(CASE WHEN is_new = 0 THEN 1 ELSE 0 END) as 'Returning Users'\nFROM (\n SELECT\n u.user_id,\n STR_TO_DATE(CONCAT(YEARWEEK(u.timestamp, 1), ' Monday'), '%X%V %W') as week,\n CASE WHEN STR_TO_DATE(CONCAT(YEARWEEK(u.timestamp, 1), ' Monday'), '%X%V %W') = STR_TO_DATE(CONCAT(YEARWEEK(f.first_seen, 1), ' Monday'), '%X%V %W') THEN 1 ELSE 0 END as is_new\n FROM lake._tool_q_dev_chat_log u\n JOIN (SELECT user_id, MIN(timestamp) as first_seen FROM lake._tool_q_dev_chat_log GROUP BY user_id) f ON u.user_id = f.user_id\n WHERE $__timeFilter(u.timestamp)\n GROUP BY u.user_id, YEARWEEK(u.timestamp, 1), f.first_seen\n) weekly\nGROUP BY week\nORDER BY week", + "refId": "A" + } + ], + "title": "New vs Returning Users (Weekly)", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Number of users who used each feature", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.8, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 14 + }, + "id": 7, + "options": { + "barRadius": 0.1, + "barWidth": 0.8, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "orientation": "horizontal", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0 + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n 'Chat' as Feature, COUNT(DISTINCT CASE WHEN chat_messages_sent > 0 THEN user_id END) as Users FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Inline Suggestions', COUNT(DISTINCT CASE WHEN inline_suggestions_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Code Fix', COUNT(DISTINCT CASE WHEN code_fix_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Code Review', COUNT(DISTINCT CASE WHEN code_review_succeeded_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Doc Generation', COUNT(DISTINCT CASE WHEN doc_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Test Generation', COUNT(DISTINCT CASE WHEN test_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Dev (Agentic)', COUNT(DISTINCT CASE WHEN dev_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Steering', COUNT(DISTINCT CASE WHEN has_steering = 1 THEN user_id END) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)\nUNION ALL SELECT 'Spec Mode', COUNT(DISTINCT CASE WHEN is_spec_mode = 1 THEN user_id END) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)", + "refId": "A" + } + ], + "title": "Feature Adoption Funnel", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Cumulative credits this month vs projected total", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 14 + }, + "id": 8, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(SUM(credits_used)) OVER (ORDER BY date) as 'Cumulative Credits',\n (SELECT SUM(credits_used) / COUNT(DISTINCT date) * DAY(LAST_DAY(CURDATE()))\n FROM lake._tool_q_dev_user_report\n WHERE YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE())) as 'Projected Monthly'\nFROM lake._tool_q_dev_user_report\nWHERE YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE())\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Credits Pace vs Projected (This Month)", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Acceptance rates for inline suggestions, code fix, and inline chat over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "id": 9, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(inline_acceptance_count) / NULLIF(SUM(inline_suggestions_count), 0) as 'Inline Suggestions',\n SUM(code_fix_acceptance_event_count) / NULLIF(SUM(code_fix_generation_event_count), 0) as 'Code Fix',\n SUM(inline_chat_acceptance_event_count) / NULLIF(SUM(inline_chat_total_event_count), 0) as 'Inline Chat'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Acceptance Rate Trends", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Code review findings and test generation metrics over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 10, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(code_review_findings_count) as 'Review Findings',\n SUM(test_generation_event_count) as 'Test Gen Events',\n SUM(test_generation_accepted_tests) as 'Tests Accepted'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Code Review Findings & Test Generation", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Per-user productivity and efficiency metrics", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": true, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 30 + }, + "id": 11, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n COALESCE(MAX(d.display_name), d.user_id) as 'User',\n COALESCE(MAX(r.subscription_tier), '') as 'Tier',\n ROUND(SUM(r.credits_used), 1) as 'Credits Used',\n SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) as 'Total Accepted Lines',\n CASE WHEN SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) > 0\n THEN ROUND(SUM(r.credits_used) / SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines), 2)\n ELSE NULL END as 'Credits/Line',\n CONCAT(ROUND(SUM(d.inline_acceptance_count) / NULLIF(SUM(d.inline_suggestions_count), 0) * 100, 1), '%') as 'Accept Rate',\n SUM(d.code_review_findings_count) as 'Review Findings',\n SUM(d.test_generation_event_count) as 'Test Gen Events',\n SUM(d.dev_accepted_lines) as 'Agentic Lines',\n MIN(d.date) as 'First Active',\n MAX(d.date) as 'Last Active'\nFROM lake._tool_q_dev_user_data d\nLEFT JOIN (\n SELECT user_id, date, SUM(credits_used) as credits_used, MAX(subscription_tier) as subscription_tier\n FROM lake._tool_q_dev_user_report\n WHERE $__timeFilter(date)\n GROUP BY user_id, date\n) r ON d.user_id = r.user_id AND d.date = r.date\nWHERE $__timeFilter(d.date)\nGROUP BY d.user_id\nORDER BY SUM(r.credits_used) DESC", + "refId": "A" + } + ], + "title": "User Productivity & Efficiency", + "type": "table" + }, + { + "datasource": "mysql", + "description": "Power tier users with no activity in the last 14 days", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": true, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 12, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n COALESCE(MAX(display_name), user_id) as 'User',\n MAX(subscription_tier) as 'Tier',\n ROUND(SUM(credits_used), 1) as 'Total Credits Used',\n MAX(date) as 'Last Activity'\nFROM lake._tool_q_dev_user_report\nWHERE $__timeFilter(date)\n AND subscription_tier = 'POWER'\nGROUP BY user_id\nHAVING MAX(date) < DATE_SUB(NOW(), INTERVAL 14 DAY)\nORDER BY MAX(date)", + "refId": "A" + } + ], + "title": "Idle Power Users (No Activity in 14 Days)", + "type": "table" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": [ + "q_dev", + "executive", + "kiro" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-30d", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Kiro Executive Dashboard", + "uid": "qdev_executive", + "version": 1 +} \ No newline at end of file diff --git a/grafana/dashboards/qdev_logging.json b/grafana/dashboards/qdev_logging.json new file mode 100644 index 00000000000..462adcd986e --- /dev/null +++ b/grafana/dashboards/qdev_logging.json @@ -0,0 +1,800 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "datasource": "mysql", + "description": "Overview of logging event metrics", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n (SELECT COUNT(*) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)) as 'Chat Events',\n (SELECT COUNT(DISTINCT user_id) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)) as 'Chat Users',\n (SELECT COUNT(DISTINCT conversation_id) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp) AND conversation_id != '') as 'Conversations',\n (SELECT COUNT(*) FROM lake._tool_q_dev_completion_log WHERE $__timeFilter(timestamp)) as 'Completion Events',\n (SELECT COUNT(DISTINCT user_id) FROM lake._tool_q_dev_completion_log WHERE $__timeFilter(timestamp)) as 'Completion Users'", + "refId": "A" + } + ], + "title": "Logging Overview", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Hourly distribution of AI usage activity (chat + completions)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Hour of Day", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.8, + "drawStyle": "bars", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 6 + }, + "id": 2, + "options": { + "legend": { + "calcs": [ + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n LPAD(CAST(hour_of_day AS CHAR), 2, '0') as 'Hour',\n SUM(chat_count) as 'Chat Events',\n SUM(completion_count) as 'Completion Events'\nFROM (\n SELECT HOUR(timestamp) as hour_of_day, COUNT(*) as chat_count, 0 as completion_count\n FROM lake._tool_q_dev_chat_log\n WHERE $__timeFilter(timestamp)\n GROUP BY HOUR(timestamp)\n UNION ALL\n SELECT HOUR(timestamp) as hour_of_day, 0 as chat_count, COUNT(*) as completion_count\n FROM lake._tool_q_dev_completion_log\n WHERE $__timeFilter(timestamp)\n GROUP BY HOUR(timestamp)\n) combined\nGROUP BY hour_of_day\nORDER BY hour_of_day", + "refId": "A" + } + ], + "title": "Active Hours Distribution", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Distribution of model usage across chat events", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 14 + }, + "id": 3, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "/^Requests$/", + "values": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n CASE\n WHEN model_id = '' OR model_id IS NULL THEN '(unknown)'\n ELSE model_id\n END as 'Model',\n COUNT(*) as 'Requests'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY model_id\nORDER BY COUNT(*) DESC", + "refId": "A" + } + ], + "title": "Model Usage Distribution", + "type": "piechart" + }, + { + "datasource": "mysql", + "description": "Top file extensions used with inline completions", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 14 + }, + "id": 4, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value", + "percent" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n CASE\n WHEN file_extension = '' THEN '(unknown)'\n ELSE file_extension\n END as 'File Type',\n COUNT(*) as 'Completions'\nFROM lake._tool_q_dev_completion_log\nWHERE $__timeFilter(timestamp)\nGROUP BY file_extension\nORDER BY COUNT(*) DESC\nLIMIT 15", + "refId": "A" + } + ], + "title": "File Type Usage (Completions)", + "type": "piechart" + }, + { + "datasource": "mysql", + "description": "Average number of chat events per conversation", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 22 + }, + "id": 5, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "min" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE(timestamp) as time,\n COUNT(*) / NULLIF(COUNT(DISTINCT CASE WHEN conversation_id != '' THEN conversation_id END), 0) as 'Avg Turns per Conversation',\n COUNT(DISTINCT CASE WHEN conversation_id != '' THEN conversation_id END) as 'Unique Conversations',\n COUNT(*) as 'Total Chat Events'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY DATE(timestamp)\nORDER BY DATE(timestamp)", + "refId": "A" + } + ], + "title": "Conversation Depth Analysis", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Daily chat and completion events over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 30 + }, + "id": 6, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT time, SUM(chat) as 'Chat Events', SUM(completions) as 'Completion Events'\nFROM (\n SELECT DATE(timestamp) as time, COUNT(*) as chat, 0 as completions\n FROM lake._tool_q_dev_chat_log\n WHERE $__timeFilter(timestamp)\n GROUP BY DATE(timestamp)\n UNION ALL\n SELECT DATE(timestamp) as time, 0 as chat, COUNT(*) as completions\n FROM lake._tool_q_dev_completion_log\n WHERE $__timeFilter(timestamp)\n GROUP BY DATE(timestamp)\n) combined\nGROUP BY time\nORDER BY time", + "refId": "A" + } + ], + "title": "Daily Event Trends", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Per-user logging activity summary", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": true, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 7, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n COALESCE(u.display_name, u.user_id) as 'User',\n u.user_id as 'User ID',\n u.chat_events as 'Chat Events',\n u.conversations as 'Conversations',\n ROUND(u.chat_events / NULLIF(u.conversations, 0), 1) as 'Avg Turns',\n COALESCE(c.completion_events, 0) as 'Completion Events',\n COALESCE(c.files_count, 0) as 'Distinct Files',\n ROUND(u.avg_prompt_len) as 'Avg Prompt Len',\n ROUND(u.avg_response_len) as 'Avg Response Len',\n u.steering_count as 'Steering Uses',\n u.spec_count as 'Spec Mode Uses',\n u.models_used as 'Models Used',\n u.first_seen as 'First Seen',\n GREATEST(u.last_seen, COALESCE(c.last_seen, u.last_seen)) as 'Last Seen'\nFROM (\n SELECT\n user_id,\n MAX(display_name) as display_name,\n COUNT(*) as chat_events,\n COUNT(DISTINCT CASE WHEN conversation_id != '' THEN conversation_id END) as conversations,\n AVG(prompt_length) as avg_prompt_len,\n AVG(response_length) as avg_response_len,\n GROUP_CONCAT(DISTINCT CASE WHEN model_id != '' AND model_id IS NOT NULL THEN model_id END ORDER BY model_id SEPARATOR ', ') as models_used,\n SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) as steering_count,\n SUM(CASE WHEN is_spec_mode = 1 THEN 1 ELSE 0 END) as spec_count,\n MIN(timestamp) as first_seen,\n MAX(timestamp) as last_seen\n FROM lake._tool_q_dev_chat_log\n WHERE $__timeFilter(timestamp)\n GROUP BY user_id\n) u\nLEFT JOIN (\n SELECT\n user_id,\n COUNT(*) as completion_events,\n COUNT(DISTINCT file_name) as files_count,\n MAX(timestamp) as last_seen\n FROM lake._tool_q_dev_completion_log\n WHERE $__timeFilter(timestamp)\n GROUP BY user_id\n) c ON u.user_id = c.user_id\nORDER BY u.user_id", + "refId": "A" + } + ], + "title": "Per-User Activity", + "type": "table" + }, + { + "datasource": "mysql", + "description": "Distribution of Kiro feature adoption: Steering, Spec Mode, and Plain Chat", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 48 + }, + "id": 8, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) as 'Using Steering',\n SUM(CASE WHEN is_spec_mode = 1 THEN 1 ELSE 0 END) as 'Using Spec Mode',\n SUM(CASE WHEN has_steering = 0 AND is_spec_mode = 0 THEN 1 ELSE 0 END) as 'Plain Chat'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)", + "refId": "A" + } + ], + "title": "Kiro Feature Adoption", + "type": "piechart" + }, + { + "datasource": "mysql", + "description": "Top file extensions active during chat events", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 48 + }, + "id": 9, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value", + "percent" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n CASE\n WHEN active_file_extension = '' OR active_file_extension IS NULL THEN '(no file active)'\n ELSE active_file_extension\n END as 'File Type',\n COUNT(*) as 'Chat Events'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY active_file_extension\nORDER BY COUNT(*) DESC\nLIMIT 15", + "refId": "A" + } + ], + "title": "Active File Types in Chat", + "type": "piechart" + }, + { + "datasource": "mysql", + "description": "Average and maximum prompt/response lengths over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 10, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE(timestamp) as time,\n AVG(prompt_length) as 'Avg Prompt Length',\n AVG(response_length) as 'Avg Response Length',\n MAX(prompt_length) as 'Max Prompt Length',\n MAX(response_length) as 'Max Response Length'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY DATE(timestamp)\nORDER BY DATE(timestamp)", + "refId": "A" + } + ], + "title": "Prompt & Response Length Trends", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": [ + "q_dev", + "logging", + "kiro" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-30d", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Kiro AI Activity Insights", + "uid": "qdev_logging", + "version": 1 +} \ No newline at end of file diff --git a/grafana/dashboards/qdev_user_data.json b/grafana/dashboards/qdev_user_data.json index d80d57bab21..578cf095dca 100644 --- a/grafana/dashboards/qdev_user_data.json +++ b/grafana/dashboards/qdev_user_data.json @@ -730,7 +730,7 @@ "group": [], "metricColumn": "none", "rawQuery": true, - "rawSql": "SELECT\n COALESCE(display_name, user_id) as 'User',\n SUM(chat_ai_code_lines) as 'Accepted Lines (Chat)',\n SUM(transformation_lines_ingested) as 'Lines Ingested (Java Transform)',\n SUM(transformation_lines_generated) as 'Lines Generated (Java Transform)',\n SUM(transformation_event_count) as 'Event Count (Java Transform)',\n SUM(code_review_findings_count) as 'Findings (Code Review)',\n SUM(code_fix_accepted_lines) as 'Accepted Lines (Code Fix)',\n SUM(code_fix_generated_lines) as 'Generated Lines (Code Fix)',\n SUM(code_fix_acceptance_event_count) as 'Accepted Count (Code Fix)',\n SUM(code_fix_generation_event_count) as 'Generated Count (Code Fix)',\n CONCAT(ROUND(SUM(code_fix_acceptance_event_count) / NULLIF(SUM(code_fix_generation_event_count), 0) * 100, 2), '%') as 'Acceptance Rate (Code Fix)',\n SUM(inline_ai_code_lines) as 'Accepted Lines (Inline Suggestion)',\n SUM(inline_acceptance_count) as 'Accepted Count (Inline Suggestion)',\n SUM(inline_suggestions_count) as 'Total Count (Inline Suggestion)',\n CONCAT(ROUND(SUM(inline_acceptance_count) / NULLIF(SUM(inline_suggestions_count), 0) * 100, 2), '%') as 'Acceptance Rate (Inline Suggestion)',\n SUM(inline_chat_accepted_line_additions) as 'Accepted Line Additions (Inline Chat)',\n SUM(inline_chat_accepted_line_deletions) as 'Accepted Line Deletions (Inline Chat)',\n SUM(inline_chat_acceptance_event_count) as 'Accepted Events (Inline Chat)',\n SUM(inline_chat_total_event_count) as 'Total Events (Inline Chat)',\n CONCAT(ROUND(SUM(inline_chat_acceptance_event_count) / NULLIF(SUM(inline_chat_total_event_count), 0) * 100, 2), '%') as 'Acceptance Rate (Inline Chat)',\n MIN(date) as 'First Activity',\n MAX(date) as 'Last Activity'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY user_id, display_name\nORDER BY SUM(inline_ai_code_lines) DESC", + "rawSql": "SELECT\n COALESCE(MAX(display_name), user_id) as 'User',\n SUM(chat_ai_code_lines) as 'Accepted Lines (Chat)',\n SUM(transformation_lines_ingested) as 'Lines Ingested (Java Transform)',\n SUM(transformation_lines_generated) as 'Lines Generated (Java Transform)',\n SUM(transformation_event_count) as 'Event Count (Java Transform)',\n SUM(code_review_findings_count) as 'Findings (Code Review)',\n SUM(code_fix_accepted_lines) as 'Accepted Lines (Code Fix)',\n SUM(code_fix_generated_lines) as 'Generated Lines (Code Fix)',\n SUM(code_fix_acceptance_event_count) as 'Accepted Count (Code Fix)',\n SUM(code_fix_generation_event_count) as 'Generated Count (Code Fix)',\n CONCAT(ROUND(SUM(code_fix_acceptance_event_count) / NULLIF(SUM(code_fix_generation_event_count), 0) * 100, 2), '%') as 'Acceptance Rate (Code Fix)',\n SUM(inline_ai_code_lines) as 'Accepted Lines (Inline Suggestion)',\n SUM(inline_acceptance_count) as 'Accepted Count (Inline Suggestion)',\n SUM(inline_suggestions_count) as 'Total Count (Inline Suggestion)',\n CONCAT(ROUND(SUM(inline_acceptance_count) / NULLIF(SUM(inline_suggestions_count), 0) * 100, 2), '%') as 'Acceptance Rate (Inline Suggestion)',\n SUM(inline_chat_accepted_line_additions) as 'Accepted Line Additions (Inline Chat)',\n SUM(inline_chat_accepted_line_deletions) as 'Accepted Line Deletions (Inline Chat)',\n SUM(inline_chat_acceptance_event_count) as 'Accepted Events (Inline Chat)',\n SUM(inline_chat_total_event_count) as 'Total Events (Inline Chat)',\n CONCAT(ROUND(SUM(inline_chat_acceptance_event_count) / NULLIF(SUM(inline_chat_total_event_count), 0) * 100, 2), '%') as 'Acceptance Rate (Inline Chat)',\n SUM(doc_generation_event_count) as 'Doc Gen Events',\n SUM(test_generation_event_count) as 'Test Gen Events',\n SUM(dev_accepted_lines) as 'Dev Accepted Lines',\n MIN(date) as 'First Activity',\n MAX(date) as 'Last Activity'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY user_id\nORDER BY SUM(inline_ai_code_lines) DESC", "refId": "A", "select": [ [ @@ -771,6 +771,393 @@ ], "title": "User Interactions", "type": "table" + }, + { + "datasource": "mysql", + "description": "Daily doc generation events and accepted/rejected lines", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 40 + }, + "id": 11, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(doc_generation_event_count) as 'Doc Generation Events',\n SUM(doc_generation_accepted_line_additions) as 'Accepted Line Additions',\n SUM(doc_generation_accepted_line_updates) as 'Accepted Line Updates',\n SUM(doc_generation_rejected_line_additions) as 'Rejected Line Additions',\n SUM(doc_generation_rejected_line_updates) as 'Rejected Line Updates'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Doc Generation Metrics", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Daily test generation events and lines", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 40 + }, + "id": 12, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(test_generation_event_count) as 'Test Generation Events',\n SUM(test_generation_accepted_tests) as 'Accepted Tests',\n SUM(test_generation_generated_tests) as 'Generated Tests',\n SUM(test_generation_accepted_lines) as 'Accepted Lines',\n SUM(test_generation_generated_lines) as 'Generated Lines'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Test Generation Metrics", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Daily agentic dev events and lines", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 13, + "options": { + "legend": { + "calcs": [ + "mean", + "max", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(dev_generation_event_count) as 'Dev Generation Events',\n SUM(dev_acceptance_event_count) as 'Dev Acceptance Events',\n SUM(dev_generated_lines) as 'Dev Generated Lines',\n SUM(dev_accepted_lines) as 'Dev Accepted Lines'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Dev (Agentic) Metrics", + "type": "timeseries" } ], "preload": false, diff --git a/grafana/dashboards/qdev_user_report.json b/grafana/dashboards/qdev_user_report.json index e1a27bc539b..920fc1f6cde 100644 --- a/grafana/dashboards/qdev_user_report.json +++ b/grafana/dashboards/qdev_user_report.json @@ -305,10 +305,10 @@ "pieType": "pie", "reduceOptions": { "calcs": [ - "sum" + "lastNotNull" ], "fields": "", - "values": false + "values": true }, "tooltip": { "mode": "single", @@ -433,7 +433,7 @@ "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\n COALESCE(display_name, user_id) as 'User',\n subscription_tier as 'Tier',\n client_type as 'Client',\n SUM(credits_used) as 'Credits Used',\n SUM(total_messages) as 'Messages',\n SUM(chat_conversations) as 'Conversations',\n SUM(overage_credits_used) as 'Overage Credits',\n CASE WHEN MAX(CAST(overage_enabled AS UNSIGNED)) = 1 THEN 'Yes' ELSE 'No' END as 'Overage',\n MIN(date) as 'First Activity',\n MAX(date) as 'Last Activity'\nFROM lake._tool_q_dev_user_report\nWHERE $__timeFilter(date)\nGROUP BY user_id, display_name, subscription_tier, client_type\nORDER BY SUM(credits_used) DESC", + "rawSql": "SELECT\n COALESCE(MAX(display_name), user_id) as 'User',\n subscription_tier as 'Tier',\n client_type as 'Client',\n SUM(credits_used) as 'Credits Used',\n SUM(total_messages) as 'Messages',\n SUM(chat_conversations) as 'Conversations',\n SUM(overage_credits_used) as 'Overage Credits',\n CASE WHEN MAX(CAST(overage_enabled AS UNSIGNED)) = 1 THEN 'Yes' ELSE 'No' END as 'Overage',\n MIN(date) as 'First Activity',\n MAX(date) as 'Last Activity'\nFROM lake._tool_q_dev_user_report\nWHERE $__timeFilter(date)\nGROUP BY user_id, subscription_tier, client_type\nORDER BY user_id DESC", "refId": "A" } ], @@ -461,4 +461,4 @@ "title": "Kiro Usage Dashboard", "uid": "qdev_user_report", "version": 1 -} +} \ No newline at end of file From 1fa45ca0ee6819f356e842c2e078511a91da2c36 Mon Sep 17 00:00:00 2001 From: NaRro Date: Tue, 17 Mar 2026 02:19:11 +0000 Subject: [PATCH 17/38] feat(qa): add is_invalid field to qa_test_case_executions (#8764) * feat(qa): add is_invalid field to qa_test_case_executions Add is_invalid boolean field to the domain layer qa_test_case_executions table to allow QA teams to flag test executions as invalid due to environmental issues, flaky tests, false positives, or false negatives. Changes: - Add IsInvalid field to QaTestCaseExecution domain model - Create migration script (20260313_add_is_invalid_to_qa_test_case_executions) - Register migration in migrationscripts/register.go - Update customize service to set default value for is_invalid - Update E2E test data to include new column Resolves #8763 Co-Authored-By: Claude Opus 4.6 * fix(qa): handle missing is_invalid column in CSV import Fix PostgreSQL compatibility issue when CSV files don't contain the is_invalid column. The field now defaults to false instead of an empty string. Changes: - Update qaTestCaseExecutionHandler to check for empty string values - Add E2E test for backward compatibility with CSV files lacking is_invalid - Add explicit IsInvalid initialization in Testmo plugin converter Resolves #8763 --------- Co-authored-by: Claude Opus 4.6 --- .../domainlayer/qa/qa_test_case_execution.go | 1 + ...d_is_invalid_to_qa_test_case_executions.go | 52 +++++++++++++++++++ .../core/models/migrationscripts/register.go | 1 + .../e2e/import_test_case_execution_test.go | 50 ++++++++++++++++++ .../qa_test_case_executions_output.csv | 8 +-- ...est_case_executions_output_incremental.csv | 10 ++-- ...executions_output_no_is_invalid_column.csv | 4 ++ backend/plugins/customize/service/service.go | 4 ++ 8 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 backend/core/models/migrationscripts/20260313_add_is_invalid_to_qa_test_case_executions.go create mode 100644 backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output_no_is_invalid_column.csv diff --git a/backend/core/models/domainlayer/qa/qa_test_case_execution.go b/backend/core/models/domainlayer/qa/qa_test_case_execution.go index cfab89b6d05..aaf237b6fce 100644 --- a/backend/core/models/domainlayer/qa/qa_test_case_execution.go +++ b/backend/core/models/domainlayer/qa/qa_test_case_execution.go @@ -33,6 +33,7 @@ type QaTestCaseExecution struct { FinishTime time.Time `gorm:"comment:Test finish time"` CreatorId string `gorm:"type:varchar(255);comment:Executor ID"` Status string `gorm:"type:varchar(255);comment:Test execution status | PENDING | IN_PROGRESS | SUCCESS | FAILED"` // enum, using string + IsInvalid bool } func (QaTestCaseExecution) TableName() string { diff --git a/backend/core/models/migrationscripts/20260313_add_is_invalid_to_qa_test_case_executions.go b/backend/core/models/migrationscripts/20260313_add_is_invalid_to_qa_test_case_executions.go new file mode 100644 index 00000000000..ce7656e1e4c --- /dev/null +++ b/backend/core/models/migrationscripts/20260313_add_is_invalid_to_qa_test_case_executions.go @@ -0,0 +1,52 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" +) + +var _ plugin.MigrationScript = (*addIsInvalidToQaTestCaseExecution)(nil) + +type qaTestCaseExecution20260313 struct { + IsInvalid bool +} + +func (qaTestCaseExecution20260313) TableName() string { + return "qa_test_case_executions" +} + +type addIsInvalidToQaTestCaseExecution struct{} + +func (*addIsInvalidToQaTestCaseExecution) Up(basicRes context.BasicRes) errors.Error { + db := basicRes.GetDal() + if err := db.AutoMigrate(&qaTestCaseExecution20260313{}); err != nil { + return err + } + return nil +} + +func (*addIsInvalidToQaTestCaseExecution) Version() uint64 { + return 20260313100000 +} + +func (*addIsInvalidToQaTestCaseExecution) Name() string { + return "add is_invalid to qa_test_case_executions" +} diff --git a/backend/core/models/migrationscripts/register.go b/backend/core/models/migrationscripts/register.go index 5b682b66222..9372d8fbd02 100644 --- a/backend/core/models/migrationscripts/register.go +++ b/backend/core/models/migrationscripts/register.go @@ -136,6 +136,7 @@ func All() []plugin.MigrationScript { new(addCqIssueImpacts), new(addDueDateToIssues), new(createQaTables), + new(addIsInvalidToQaTestCaseExecution), new(increaseCqIssueComponentLength), new(extendFieldSizeForCq), new(addIssueFixVerion), diff --git a/backend/plugins/customize/e2e/import_test_case_execution_test.go b/backend/plugins/customize/e2e/import_test_case_execution_test.go index 92d5750b86b..a74c69940a6 100644 --- a/backend/plugins/customize/e2e/import_test_case_execution_test.go +++ b/backend/plugins/customize/e2e/import_test_case_execution_test.go @@ -71,6 +71,7 @@ func TestImportQaTestCaseExecutionsDataFlow(t *testing.T) { "start_time", "finish_time", "creator_id", + "is_invalid", "status", }) dataflowTester.VerifyTableWithRawData( @@ -104,6 +105,7 @@ func TestImportQaTestCaseExecutionsDataFlow(t *testing.T) { "start_time", "finish_time", "creator_id", + "is_invalid", "status", }) @@ -117,3 +119,51 @@ func TestImportQaTestCaseExecutionsDataFlow(t *testing.T) { }, ) } + +// TestImportQaTestCaseExecutions_NoIsInvalidColumn tests backward compatibility: +// Verifies that importing CSV files without the is_invalid column works correctly, +// and the is_invalid field defaults to false. +func TestImportQaTestCaseExecutions_NoIsInvalidColumn(t *testing.T) { + var plugin impl.Customize + dataflowTester := e2ehelper.NewDataFlowTester(t, "customize", plugin) + + // Flush the relevant table + dataflowTester.FlushTabler(&qa.QaTestCaseExecution{}) + dataflowTester.FlushTabler(&crossdomain.Account{}) + + // Create a new service instance + svc := service.NewService(dataflowTester.Dal) + + // Use the existing CSV file that does NOT contain is_invalid column + // This simulates backward compatibility with old CSV files + qaTestCaseExecutionsFile, err := os.Open("raw_tables/qa_test_case_executions_input.csv") + if err != nil { + t.Fatal(err) + } + defer qaTestCaseExecutionsFile.Close() + + // Define a dummy qaProjectId + qaProjectId := "test-backward-compat-project" + + // Import data from the CSV file (which has no is_invalid column) + err = svc.ImportQaTestCaseExecutions(qaProjectId, qaTestCaseExecutionsFile, false) + if err != nil { + t.Fatalf("ImportQaTestCaseExecutions failed: %v", err) + } + + // Verify the imported data has is_invalid defaulted to false + dataflowTester.VerifyTableWithRawData( + &qa.QaTestCaseExecution{}, + "snapshot_tables/qa_test_case_executions_output_no_is_invalid_column.csv", + []string{ + "id", + "qa_project_id", + "qa_test_case_id", + "create_time", + "start_time", + "finish_time", + "creator_id", + "is_invalid", + "status", + }) +} diff --git a/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output.csv b/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output.csv index 1d51d4a0d66..cd78e9ec52e 100644 --- a/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output.csv +++ b/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output.csv @@ -1,4 +1,4 @@ -id,qa_project_id,qa_test_case_id,create_time,start_time,finish_time,creator_id,status,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark -exec-1,test-qa-project-id,tc-1,2023-03-01T10:00:00.000+00:00,2023-03-01T10:01:00.000+00:00,2023-03-01T10:05:00.000+00:00,csv:CsvAccount:0:user-a,SUCCESS,test-qa-project-id,,, -exec-2,test-qa-project-id,tc-2,2023-03-01T11:00:00.000+00:00,2023-03-01T11:02:00.000+00:00,2023-03-01T11:06:00.000+00:00,csv:CsvAccount:0:user-b,FAILED,test-qa-project-id,,, -exec-3,test-qa-project-id,tc-1,2023-03-02T10:00:00.000+00:00,2023-03-02T10:01:00.000+00:00,2023-03-02T10:04:00.000+00:00,csv:CsvAccount:0:user-a,SUCCESS,test-qa-project-id,,, +id,qa_project_id,qa_test_case_id,create_time,start_time,finish_time,creator_id,is_invalid,status,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark +exec-1,test-qa-project-id,tc-1,2023-03-01T10:00:00.000+00:00,2023-03-01T10:01:00.000+00:00,2023-03-01T10:05:00.000+00:00,csv:CsvAccount:0:user-a,0,SUCCESS,test-qa-project-id,,, +exec-2,test-qa-project-id,tc-2,2023-03-01T11:00:00.000+00:00,2023-03-01T11:02:00.000+00:00,2023-03-01T11:06:00.000+00:00,csv:CsvAccount:0:user-b,0,FAILED,test-qa-project-id,,, +exec-3,test-qa-project-id,tc-1,2023-03-02T10:00:00.000+00:00,2023-03-02T10:01:00.000+00:00,2023-03-02T10:04:00.000+00:00,csv:CsvAccount:0:user-a,0,SUCCESS,test-qa-project-id,,, diff --git a/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output_incremental.csv b/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output_incremental.csv index e214d734b23..90e496a27bd 100644 --- a/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output_incremental.csv +++ b/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output_incremental.csv @@ -1,5 +1,5 @@ -id,qa_project_id,qa_test_case_id,create_time,start_time,finish_time,creator_id,status,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark -exec-1,test-qa-project-id,tc-1,2023-03-04T10:00:00.000+00:00,2023-03-04T10:01:00.000+00:00,2023-03-04T10:06:00.000+00:00,csv:CsvAccount:0:user-a,FAILED,test-qa-project-id,,, -exec-2,test-qa-project-id,tc-2,2023-03-01T11:00:00.000+00:00,2023-03-01T11:02:00.000+00:00,2023-03-01T11:06:00.000+00:00,csv:CsvAccount:0:user-b,FAILED,test-qa-project-id,,, -exec-3,test-qa-project-id,tc-1,2023-03-02T10:00:00.000+00:00,2023-03-02T10:01:00.000+00:00,2023-03-02T10:04:00.000+00:00,csv:CsvAccount:0:user-a,SUCCESS,test-qa-project-id,,, -exec-4,test-qa-project-id,tc-3,2023-03-03T10:00:00.000+00:00,2023-03-03T10:01:00.000+00:00,2023-03-03T10:05:00.000+00:00,csv:CsvAccount:0:user-c,SUCCESS,test-qa-project-id,,, +id,qa_project_id,qa_test_case_id,create_time,start_time,finish_time,creator_id,is_invalid,status,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark +exec-1,test-qa-project-id,tc-1,2023-03-04T10:00:00.000+00:00,2023-03-04T10:01:00.000+00:00,2023-03-04T10:06:00.000+00:00,csv:CsvAccount:0:user-a,0,FAILED,test-qa-project-id,,, +exec-2,test-qa-project-id,tc-2,2023-03-01T11:00:00.000+00:00,2023-03-01T11:02:00.000+00:00,2023-03-01T11:06:00.000+00:00,csv:CsvAccount:0:user-b,0,FAILED,test-qa-project-id,,, +exec-3,test-qa-project-id,tc-1,2023-03-02T10:00:00.000+00:00,2023-03-02T10:01:00.000+00:00,2023-03-02T10:04:00.000+00:00,csv:CsvAccount:0:user-a,0,SUCCESS,test-qa-project-id,,, +exec-4,test-qa-project-id,tc-3,2023-03-03T10:00:00.000+00:00,2023-03-03T10:01:00.000+00:00,2023-03-03T10:05:00.000+00:00,csv:CsvAccount:0:user-c,0,SUCCESS,test-qa-project-id,,, diff --git a/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output_no_is_invalid_column.csv b/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output_no_is_invalid_column.csv new file mode 100644 index 00000000000..e313377a0c5 --- /dev/null +++ b/backend/plugins/customize/e2e/snapshot_tables/qa_test_case_executions_output_no_is_invalid_column.csv @@ -0,0 +1,4 @@ +id,qa_project_id,qa_test_case_id,create_time,start_time,finish_time,creator_id,is_invalid,status,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark +exec-1,test-backward-compat-project,tc-1,2023-03-01T10:00:00.000+00:00,2023-03-01T10:01:00.000+00:00,2023-03-01T10:05:00.000+00:00,csv:CsvAccount:0:user-a,0,SUCCESS,test-backward-compat-project,,, +exec-2,test-backward-compat-project,tc-2,2023-03-01T11:00:00.000+00:00,2023-03-01T11:02:00.000+00:00,2023-03-01T11:06:00.000+00:00,csv:CsvAccount:0:user-b,0,FAILED,test-backward-compat-project,,, +exec-3,test-backward-compat-project,tc-1,2023-03-02T10:00:00.000+00:00,2023-03-02T10:01:00.000+00:00,2023-03-02T10:04:00.000+00:00,csv:CsvAccount:0:user-a,0,SUCCESS,test-backward-compat-project,,, \ No newline at end of file diff --git a/backend/plugins/customize/service/service.go b/backend/plugins/customize/service/service.go index 89e8833cf1c..5ef3bcbb3bb 100644 --- a/backend/plugins/customize/service/service.go +++ b/backend/plugins/customize/service/service.go @@ -541,6 +541,10 @@ func (s *Service) qaTestCaseExecutionHandler(qaProjectId string) func(record map } delete(record, "creator_name") record["qa_project_id"] = qaProjectId + // Set default value for is_invalid if not present or empty in the CSV + if isInvalid, exists := record["is_invalid"]; !exists || isInvalid == "" { + record["is_invalid"] = false + } return s.dal.CreateWithMap(&qa.QaTestCaseExecution{}, record) } } From 6bacd17b06117735b9fcc2c85e04e5800086f942 Mon Sep 17 00:00:00 2001 From: Reece Ward <47779818+ReeceXW@users.noreply.github.com> Date: Thu, 19 Mar 2026 13:05:00 +0000 Subject: [PATCH 18/38] feat(linker): link when branch names contain issue keys (#8777) * feat(linker): branch names containing issue keys * chore: add testing data --- backend/plugins/linker/e2e/snapshot_tables/board_issues.csv | 1 + .../linker/e2e/snapshot_tables/pull_request_issues.csv | 1 + backend/plugins/linker/e2e/snapshot_tables/pull_requests.csv | 3 ++- backend/plugins/linker/tasks/link_pr_and_issue.go | 5 +++-- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/plugins/linker/e2e/snapshot_tables/board_issues.csv b/backend/plugins/linker/e2e/snapshot_tables/board_issues.csv index 8c288bf48cf..0955b9ccd93 100644 --- a/backend/plugins/linker/e2e/snapshot_tables/board_issues.csv +++ b/backend/plugins/linker/e2e/snapshot_tables/board_issues.csv @@ -1,3 +1,4 @@ "board_id","issue_id","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark" "github:GithubRepo:1:384111310","github:GithubIssue:1:1237324696","2024-05-14 10:42:37.541","2024-05-28 00:25:41.436","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_graphql_issues",69,"" "github:GithubRepo:1:384111310","github:GithubIssue:1:1237324697","2024-05-14 10:42:37.541","2024-05-28 00:25:41.436","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_graphql_issues",69,"" +"github:GithubRepo:1:384111310","github:GithubIssue:1:1237324698","2024-05-14 10:42:37.541","2024-05-28 00:25:41.436","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_graphql_issues",69,"" diff --git a/backend/plugins/linker/e2e/snapshot_tables/pull_request_issues.csv b/backend/plugins/linker/e2e/snapshot_tables/pull_request_issues.csv index 6b7d30fb8a3..d602f600d5e 100644 --- a/backend/plugins/linker/e2e/snapshot_tables/pull_request_issues.csv +++ b/backend/plugins/linker/e2e/snapshot_tables/pull_request_issues.csv @@ -1,3 +1,4 @@ pull_request_id,issue_id,pull_request_key,issue_key,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark github:GithubPullRequest:1:1819250573,github:GithubIssue:1:1237324696,7317,1884,,,0,"pull_requests," github:GithubPullRequest:1:1819250573,github:GithubIssue:1:1237324697,7317,1885,,,0,"pull_requests," +github:GithubPullRequest:1:1819250574,github:GithubIssue:1:1237324698,7318,1886,,,0,"pull_requests," diff --git a/backend/plugins/linker/e2e/snapshot_tables/pull_requests.csv b/backend/plugins/linker/e2e/snapshot_tables/pull_requests.csv index 22635f9b0b7..3084711b0bc 100644 --- a/backend/plugins/linker/e2e/snapshot_tables/pull_requests.csv +++ b/backend/plugins/linker/e2e/snapshot_tables/pull_requests.csv @@ -1,2 +1,3 @@ "id","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark","base_repo_id","base_ref","base_commit_sha","head_repo_id","head_ref","head_commit_sha","merge_commit_sha","status","original_status","type","component","title","description","url","author_name","author_id","parent_pr_id","pull_request_key","created_date","merged_date","closed_date" -"github:GithubPullRequest:1:1819250573","2024-05-15 12:07:36.778","2024-05-15 12:07:36.778","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_api_pull_requests",191,"","github:GithubRepo:1:384111310","main","64c52748f3529784cb6c8a372691aa0f638fa73d","github:GithubRepo:1:384111310","fix#7275","14fb6488f2208e6a65374a86efce12dd460987e0","91dbce48759da14a4a030124c3ef751f1c5d8389","CLOSED","closed","","","fix: can't GET projects which have / in their name #1884 #1885","desc","https://github.com/apache/incubator-devlake/pull/7317","abeizn","github:GithubAccount:1:101256042","",7317,"2024-04-12 05:31:43.000","2024-04-13 05:31:43.000","2024-04-12 06:44:27.000" \ No newline at end of file +"github:GithubPullRequest:1:1819250573","2024-05-15 12:07:36.778","2024-05-15 12:07:36.778","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_api_pull_requests",191,"","github:GithubRepo:1:384111310","main","64c52748f3529784cb6c8a372691aa0f638fa73d","github:GithubRepo:1:384111310","fix#7275","14fb6488f2208e6a65374a86efce12dd460987e0","91dbce48759da14a4a030124c3ef751f1c5d8389","CLOSED","closed","","","fix: can't GET projects which have / in their name #1884 #1885","desc","https://github.com/apache/incubator-devlake/pull/7317","abeizn","github:GithubAccount:1:101256042","",7317,"2024-04-12 05:31:43.000","2024-04-13 05:31:43.000","2024-04-12 06:44:27.000" +"github:GithubPullRequest:1:1819250574","2024-05-15 12:07:36.778","2024-05-15 12:07:36.778","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_api_pull_requests",192,"","github:GithubRepo:1:384111310","main","64c52748f3529784cb6c8a372691aa0f638fa73d","github:GithubRepo:1:384111310","fix#1886","14fb6488f2208e6a65374a86efce12dd460987e0","","MERGED","merged","","","Fix deployment policy recreation","no issue key here","https://github.com/apache/incubator-devlake/pull/7318","abeizn","github:GithubAccount:1:101256042","",7318,"2024-04-12 05:31:43.000","2024-04-13 05:31:43.000","2024-04-12 06:44:27.000" diff --git a/backend/plugins/linker/tasks/link_pr_and_issue.go b/backend/plugins/linker/tasks/link_pr_and_issue.go index 7fcd3baa5de..52fb7aa861d 100644 --- a/backend/plugins/linker/tasks/link_pr_and_issue.go +++ b/backend/plugins/linker/tasks/link_pr_and_issue.go @@ -18,10 +18,11 @@ limitations under the License. package tasks import ( + "strings" + "github.com/apache/incubator-devlake/core/models/domainlayer/code" "github.com/apache/incubator-devlake/core/models/domainlayer/crossdomain" "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" - "strings" "github.com/apache/incubator-devlake/core/dal" "github.com/apache/incubator-devlake/core/errors" @@ -97,7 +98,7 @@ func LinkPrToIssue(taskCtx plugin.SubTaskContext) errors.Error { Enrich: func(pullRequest *code.PullRequest) ([]interface{}, errors.Error) { var issueKeys []string - for _, text := range []string{pullRequest.Title, pullRequest.Description} { + for _, text := range []string{pullRequest.Title, pullRequest.Description, pullRequest.HeadRef} { foundIssueKeys := data.PrToIssueRegexp.FindAllString(text, -1) if len(foundIssueKeys) > 0 { for _, issueKey := range foundIssueKeys { From 3d413d0595241bb93d9614d231aff663a10193a3 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Thu, 19 Mar 2026 10:40:06 -0400 Subject: [PATCH 19/38] Add codespell support with configuration and fixes (#8761) * ci(codespell): add codespell config and GitHub Actions workflow Add .codespellrc with skip patterns for generated files, camelCase/PascalCase ignore-regex, and project-specific word list (convertor, crypted, te, thur). Add GitHub Actions workflow to run codespell on push to main and PRs. Co-Authored-By: Claude Code 2.1.63 / Claude Opus 4.6 Signed-off-by: Yaroslav Halchenko * fix(codespell): fix ambiguous typos requiring context review Manual fixes for typos that needed human review to avoid breaking code: - Comment/string typos: occured->occurred, destory->destroy, writting->writing, retreive->retrieve, identifer->identifier, etc. - Struct field comments and documentation corrections - Migration script comment fixes (preserving Go identifiers like DataConvertor) Co-Authored-By: Claude Code 2.1.63 / Claude Opus 4.6 Signed-off-by: Yaroslav Halchenko * fix(codespell): fix non-ambiguous typos with codespell -w Automated fix via `codespell -w` for clear-cut typos across backend, config-ui, and grafana dashboards. Examples: sucess->success, occurence->occurrence, exeucte->execute, asynchornous->asynchronous, Grafana panel typos, etc. Co-Authored-By: Claude Code 2.1.63 / Claude Opus 4.6 Signed-off-by: Yaroslav Halchenko --------- Signed-off-by: Yaroslav Halchenko Co-authored-by: Claude Code 2.1.63 / Claude Opus 4.6 --- .codespellrc | 28 +++++++++++++ .github/actions/auto-cherry-pick/action.yml | 2 +- .github/workflows/codespell.yml | 39 +++++++++++++++++++ backend/core/models/domainlayer/README.md | 2 +- backend/core/models/locking.go | 2 +- backend/core/plugin/plugin_blueprint.go | 4 +- backend/core/plugin/plugin_task.go | 2 +- backend/core/utils/network_helper_test.go | 2 +- backend/helpers/e2ehelper/data_flow_tester.go | 2 +- .../migrationhelper/migrationhelper.go | 6 +-- .../migrationhelper/migrationhelper_test.go | 16 ++++---- .../pluginhelper/api/api_async_client.go | 2 +- .../helpers/pluginhelper/api/api_client.go | 2 +- .../pluginhelper/api/batch_save_divider.go | 4 +- .../api/data_convertor_stateful.go | 2 +- .../api/ds_remote_api_scope_list_helper.go | 2 +- backend/helpers/pluginhelper/api/iterator.go | 4 +- .../pluginhelper/api/model_api_helper.go | 4 +- .../pluginhelper/api/worker_scheduler.go | 4 +- backend/helpers/pluginhelper/csv_file_test.go | 4 +- .../helpers/srvhelper/model_service_helper.go | 2 +- .../srvhelper/scope_service_helper_test.go | 2 +- backend/impls/context/default_basic_res.go | 2 +- backend/impls/dalgorm/dalgorm.go | 4 +- backend/plugins/ae/api/connection.go | 2 +- backend/plugins/bamboo/api/connection_api.go | 10 ++--- backend/plugins/bamboo/models/plan.go | 2 +- backend/plugins/bamboo/tasks/shared.go | 2 +- backend/plugins/customize/service/service.go | 2 +- backend/plugins/dora/api/data.go | 6 +-- .../migrationscripts/archived/connection.go | 2 +- .../plugins/gitextractor/parser/repo_gogit.go | 2 +- backend/plugins/gitlab/e2e/job_test.go | 2 +- .../migrationscripts/archived/connection.go | 2 +- backend/plugins/gitlab/tasks/shared.go | 2 +- .../tasks/issue_status_history_convertor.go | 2 +- backend/plugins/jenkins/models/build.go | 2 +- .../20220916_modify_jenkins_build.go | 4 +- .../20221131_add_fullName_for_builds.go | 4 +- .../models/migrationscripts/archived/build.go | 2 +- .../20220716_add_init_tables.go | 2 +- .../migrationscripts/archived/source.go | 2 +- backend/plugins/jira/tasks/issue_extractor.go | 2 +- backend/plugins/linker/impl/impl.go | 2 +- .../refdiff/tasks/refdiff_task_data.go | 6 +-- backend/plugins/tapd/api/blueprint_v200.go | 2 +- .../archived/tapd_connection.go | 2 +- .../migrationscripts/archived/connection.go | 2 +- .../tasks/execution_summary_dev_extractor.go | 2 +- .../plugins/zentao/tasks/task_collector.go | 2 +- backend/python/pydevlake/pydevlake/api.py | 2 +- backend/server/api/README.md | 2 +- backend/server/services/blueprint.go | 2 +- backend/server/services/pipeline.go | 6 +-- backend/server/services/pipeline_runner.go | 4 +- backend/server/services/project.go | 2 +- backend/test/helper/client.go | 2 +- .../register/github/transformation.tsx | 2 +- .../detail/components/sync-policy/index.tsx | 12 +++--- .../src/routes/onboard/components/card.tsx | 4 +- config-ui/src/routes/onboard/index.tsx | 2 +- config-ui/src/routes/onboard/styled.ts | 12 +++--- ...veryQuality(RequireJiraAndGitlabData).json | 2 +- grafana/_archive/Gitlab.json | 4 +- grafana/dashboards/DORADebug.json | 4 +- .../DORADetails-ChangeFailureRate.json | 2 +- ...FastDoWeRespondToCustomerRequirements.json | 2 +- 67 files changed, 174 insertions(+), 107 deletions(-) create mode 100644 .codespellrc create mode 100644 .github/workflows/codespell.yml diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 00000000000..a10c0a3c634 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,28 @@ +# +# 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. +# + +[codespell] +# Ref: https://github.com/codespell-project/codespell#using-a-config-file +skip = .git,.gitignore,.gitattributes,*.svg,go.sum,*.lock,*.css,.codespellrc,.cache,.npm,.yarn,*/e2e/raw_tables/*,*/e2e/snapshot_tables/* +check-hidden = true +# Ignore camelCase and PascalCase identifiers (common in Go and TypeScript code) +ignore-regex = \b[a-z]+[A-Z]\w*\b|\b[A-Z][a-z]+[A-Z]\w*\b +# convertor,convertors - project's deliberate spelling for Go types and filenames (DataConvertor, etc.) +# crypted - variable name in AES encrypt/decrypt functions +# te - Tapd API field name (Te/te struct fields) +# thur - Thursday abbreviation in Grafana dashboard SQL column alias +ignore-words-list = convertor,convertors,crypted,te,thur diff --git a/.github/actions/auto-cherry-pick/action.yml b/.github/actions/auto-cherry-pick/action.yml index 94eafe36f81..054ffbcf39d 100644 --- a/.github/actions/auto-cherry-pick/action.yml +++ b/.github/actions/auto-cherry-pick/action.yml @@ -19,7 +19,7 @@ name: "Auto Cherry Pick" description: "cherry pick commits from Pull Requests into Release branch" inputs: trigger_label_prefix: - description: "The trigger label prefic" + description: "The trigger label prefix" default: "needs-cherrypick-" required: false author_email: diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml new file mode 100644 index 00000000000..7697e7bd09f --- /dev/null +++ b/.github/workflows/codespell.yml @@ -0,0 +1,39 @@ +# +# 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. +# +# Codespell configuration is within .codespellrc +--- +name: Codespell + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: read + +jobs: + codespell: + name: Check for spelling errors + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Codespell + uses: codespell-project/actions-codespell@v2 diff --git a/backend/core/models/domainlayer/README.md b/backend/core/models/domainlayer/README.md index e6b85d4bb9e..18f082db207 100644 --- a/backend/core/models/domainlayer/README.md +++ b/backend/core/models/domainlayer/README.md @@ -57,7 +57,7 @@ The following rules make sure Domain Layer Entities serve its purpose - Read data from platform specific table, convert and store record into one(or multiple) domain table(s) - Generate its own `Id` accordingly -- Generate foreign key accordlingly +- Generate foreign key accordingly - Fields conversion Sample code: diff --git a/backend/core/models/locking.go b/backend/core/models/locking.go index 9510e24f345..ff2b1cdd55f 100644 --- a/backend/core/models/locking.go +++ b/backend/core/models/locking.go @@ -19,7 +19,7 @@ package models import "time" -// LockingHistory is desgned for preventing mutiple delake instances from sharing the same database which may cause +// LockingHistory is desgned for preventing multiple delake instances from sharing the same database which may cause // problems like #3537, #3466. It works by the following step: // // 1. Each devlake insert a record to this table whie `Succeeded=false` diff --git a/backend/core/plugin/plugin_blueprint.go b/backend/core/plugin/plugin_blueprint.go index 492e54d43dd..35c36b36b25 100644 --- a/backend/core/plugin/plugin_blueprint.go +++ b/backend/core/plugin/plugin_blueprint.go @@ -78,9 +78,9 @@ type DataSourcePluginBlueprintV200 interface { // BlueprintConnectionV200 contains the pluginName/connectionId and related Scopes, // MetricPluginBlueprintV200 is similar to the DataSourcePluginBlueprintV200 -// but for Metric Plugin, take dora as an example, it doens't have any scope, +// but for Metric Plugin, take dora as an example, it doesn't have any scope, // nor does it produce any, however, it does require other plugin to be -// executed beforehand, like calcuating refdiff before it can connect PR to the +// executed beforehand, like calculating refdiff before it can connect PR to the // right Deployment keep in mind it would be called IFF the plugin was enabled // for the project. type MetricPluginBlueprintV200 interface { diff --git a/backend/core/plugin/plugin_task.go b/backend/core/plugin/plugin_task.go index 136f4f17eb8..e1404ff0848 100644 --- a/backend/core/plugin/plugin_task.go +++ b/backend/core/plugin/plugin_task.go @@ -106,7 +106,7 @@ type SubTaskMeta struct { Dependencies []*SubTaskMeta DependencyTables []string ProductTables []string - ForceRunOnResume bool // Should a subtask be ran dispite it was finished before + ForceRunOnResume bool // Should a subtask be ran despite it was finished before } // PluginTask Implement this interface to let framework run tasks for you diff --git a/backend/core/utils/network_helper_test.go b/backend/core/utils/network_helper_test.go index 86f76fbb1b2..a46d4096b26 100644 --- a/backend/core/utils/network_helper_test.go +++ b/backend/core/utils/network_helper_test.go @@ -53,7 +53,7 @@ func TestResolvePort(t *testing.T) { } _, err = ResolvePort("", "rabbitmq") if err == nil { - t.Errorf("Expected error %s, Got nil", "schema not fount") + t.Errorf("Expected error %s, Got nil", "schema not found") } _, err = ResolvePort("", "") if err == nil { diff --git a/backend/helpers/e2ehelper/data_flow_tester.go b/backend/helpers/e2ehelper/data_flow_tester.go index 69b6830e2c1..5a2163ef723 100644 --- a/backend/helpers/e2ehelper/data_flow_tester.go +++ b/backend/helpers/e2ehelper/data_flow_tester.go @@ -112,7 +112,7 @@ func NewDataFlowTester(t *testing.T, pluginName string, pluginMeta plugin.Plugin cfg.Set(`DB_URL`, cfg.GetString(`E2E_DB_URL`)) db, err := runner.NewGormDb(cfg, logruslog.Global) if err != nil { - // if here fail with error `acces denied for user` you need to create database by your self as follow command + // if here fail with error `access denied for user` you need to create database by your self as follow command // create databases lake_test; // grant all on lake_test.* to 'merico'@'%'; panic(err) diff --git a/backend/helpers/migrationhelper/migrationhelper.go b/backend/helpers/migrationhelper/migrationhelper.go index 24eb537a793..691413b1a56 100644 --- a/backend/helpers/migrationhelper/migrationhelper.go +++ b/backend/helpers/migrationhelper/migrationhelper.go @@ -32,7 +32,7 @@ import ( helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" ) -// AutoMigrateTables runs AutoMigrate for muliple tables +// AutoMigrateTables runs AutoMigrate for multiple tables func AutoMigrateTables(basicRes context.BasicRes, dst ...interface{}) errors.Error { db := basicRes.GetDal() for _, entity := range dst { @@ -74,14 +74,14 @@ func ChangeColumnsType[D any]( err = db.AutoMigrate(new(D), dal.From(tableName)) if err != nil { - return errors.Default.Wrap(err, "AutoMigrate for Add Colume Error") + return errors.Default.Wrap(err, "AutoMigrate for Add Column Error") } defer func() { if err != nil { err1 := db.DropColumns(tableName, columns...) if err1 != nil { - err = errors.Default.Wrap(err, fmt.Sprintf("RollBack by DropColume failed.Relevant data needs to be repaired manually.%s", err1.Error())) + err = errors.Default.Wrap(err, fmt.Sprintf("RollBack by DropColumn failed.Relevant data needs to be repaired manually.%s", err1.Error())) } } }() diff --git a/backend/helpers/migrationhelper/migrationhelper_test.go b/backend/helpers/migrationhelper/migrationhelper_test.go index 5fe70d52b35..7962100e453 100644 --- a/backend/helpers/migrationhelper/migrationhelper_test.go +++ b/backend/helpers/migrationhelper/migrationhelper_test.go @@ -132,7 +132,7 @@ func TestTransformTable(t *testing.T) { assert.Equal(t, dts[2].Id, "fd61a03af4f77d870fc21e05e7e80678095c92d808cfb3b5c279ee04c74aca1357ef3d346f24f386216563752b0c447a35c041e0b7143f929dc4de27742e3307") }).Return(nil).Once() - // for Primarykey autoincrement cheking + // for Primarykey autoincrement checking mockDal.On("GetColumns", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { tableName := args.Get(0).(dal.Tabler).TableName() assert.Equal(t, tableName, TestTableNameSrc) @@ -188,7 +188,7 @@ func TestTransformTable_RollBack(t *testing.T) { assert.NotEqual(t, oldname, tmpname) }).Return(nil).Once() - // checking if Rename and Drop RollBack working with rigth table + // checking if Rename and Drop RollBack working with right table mockDal.On("RenameTable", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { tmpname, ok := args.Get(0).(string) assert.Equal(t, ok, true) @@ -203,7 +203,7 @@ func TestTransformTable_RollBack(t *testing.T) { assert.Equal(t, oldname, TestTableNameSrc) }).Return(nil).Once() - // for Primarykey autoincrement cheking + // for Primarykey autoincrement checking mockDal.On("GetColumns", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { tableName := args.Get(0).(dal.Tabler).TableName() assert.Equal(t, tableName, TestTableNameSrc) @@ -296,7 +296,7 @@ func TestCopyTableColumns(t *testing.T) { assert.Equal(t, dts[2].Id, "fd61a03af4f77d870fc21e05e7e80678095c92d808cfb3b5c279ee04c74aca1357ef3d346f24f386216563752b0c447a35c041e0b7143f929dc4de27742e3307") }).Return(nil).Once() - // for Primarykey autoincrement cheking + // for Primarykey autoincrement checking mockDal.On("GetColumns", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { tableName := args.Get(0).(dal.Tabler).TableName() assert.Equal(t, tableName, TestTableNameSrc) @@ -352,7 +352,7 @@ func TestCopyTableColumns_RollBack(t *testing.T) { assert.NotEqual(t, oldname, tmpname) }).Return(nil).Once() - // checking if Rename and Drop RollBack working with rigth table + // checking if Rename and Drop RollBack working with right table mockDal.On("RenameTable", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { tmpname, ok := args.Get(0).(string) assert.Equal(t, ok, true) @@ -367,7 +367,7 @@ func TestCopyTableColumns_RollBack(t *testing.T) { assert.Equal(t, oldname, TestTableNameSrc) }).Return(nil).Once() - // for Primarykey autoincrement cheking + // for Primarykey autoincrement checking mockDal.On("GetColumns", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { tableName := args.Get(0).(dal.Tabler).TableName() assert.Equal(t, tableName, TestTableNameSrc) @@ -521,7 +521,7 @@ func TestTransformColumns_RollBack(t *testing.T) { assert.NotEqual(t, columnName, tmpColumnName) }).Return(nil).Once() - // checking if Rename and Drop RollBack working with rigth table + // checking if Rename and Drop RollBack working with right table mockDal.On("RenameColumn", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { tableName, ok := args.Get(0).(string) assert.Equal(t, ok, true) @@ -634,7 +634,7 @@ func TestChangeColumnsType_Rollback(t *testing.T) { assert.NotEqual(t, columnName, tmpColumnName) }).Return(nil).Once() - // checking if Rename and Drop RollBack working with rigth table + // checking if Rename and Drop RollBack working with right table mockDal.On("RenameColumn", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { tableName, ok := args.Get(0).(string) assert.Equal(t, ok, true) diff --git a/backend/helpers/pluginhelper/api/api_async_client.go b/backend/helpers/pluginhelper/api/api_async_client.go index 79ef16f1e90..c926c33ac24 100644 --- a/backend/helpers/pluginhelper/api/api_async_client.go +++ b/backend/helpers/pluginhelper/api/api_async_client.go @@ -122,7 +122,7 @@ func CreateAsyncApiClient( return nil, errors.Default.Wrap(err, "failed to create scheduler") } - // finally, wrap around api client with async sematic + // finally, wrap around api client with async semantic return &ApiAsyncClient{ apiClient, scheduler, diff --git a/backend/helpers/pluginhelper/api/api_client.go b/backend/helpers/pluginhelper/api/api_client.go index b0cfccf499f..7354a29db78 100644 --- a/backend/helpers/pluginhelper/api/api_client.go +++ b/backend/helpers/pluginhelper/api/api_client.go @@ -432,7 +432,7 @@ func UnmarshalResponse(res *http.Response, v interface{}) errors.Error { if err != nil { statusCode := res.StatusCode if statusCode == http.StatusUnauthorized || statusCode == http.StatusForbidden { - statusCode = http.StatusBadRequest // to avoid Basic Auth Dialog poping up + statusCode = http.StatusBadRequest // to avoid Basic Auth Dialog popping up } return errors.HttpStatus(statusCode).Wrap(err, fmt.Sprintf("error decoding response from %s: raw response: %s", res.Request.URL.String(), string(resBody))) } diff --git a/backend/helpers/pluginhelper/api/batch_save_divider.go b/backend/helpers/pluginhelper/api/batch_save_divider.go index 406d638e91d..393bbcc9bd9 100644 --- a/backend/helpers/pluginhelper/api/batch_save_divider.go +++ b/backend/helpers/pluginhelper/api/batch_save_divider.go @@ -73,10 +73,10 @@ func (d *BatchSaveDivider) ForType(rowType reflect.Type) (*BatchSave, errors.Err rowElemType := rowType.Elem() d.log.Debug("missing BatchSave for type %s", rowElemType.Name()) row := reflect.New(rowElemType).Interface() - // check if rowType had RawDataOrigin embeded + // check if rowType had RawDataOrigin embedded field, hasField := rowElemType.FieldByName("RawDataOrigin") if !hasField || field.Type != reflect.TypeOf(common.RawDataOrigin{}) { - return nil, errors.Default.New(fmt.Sprintf("type %s must have RawDataOrigin embeded", rowElemType.Name())) + return nil, errors.Default.New(fmt.Sprintf("type %s must have RawDataOrigin embedded", rowElemType.Name())) } d.batches[rowType] = batch if !d.incrementalMode { diff --git a/backend/helpers/pluginhelper/api/data_convertor_stateful.go b/backend/helpers/pluginhelper/api/data_convertor_stateful.go index 1c5292dc230..f742df83c73 100644 --- a/backend/helpers/pluginhelper/api/data_convertor_stateful.go +++ b/backend/helpers/pluginhelper/api/data_convertor_stateful.go @@ -192,7 +192,7 @@ func (converter *StatefulDataConverter[InputType]) Execute() errors.Error { if err != nil { return err } - // save the incremantal state + // save the incremental state return converter.SubtaskStateManager.Close() } diff --git a/backend/helpers/pluginhelper/api/ds_remote_api_scope_list_helper.go b/backend/helpers/pluginhelper/api/ds_remote_api_scope_list_helper.go index 076b2c6f820..83fef06122b 100644 --- a/backend/helpers/pluginhelper/api/ds_remote_api_scope_list_helper.go +++ b/backend/helpers/pluginhelper/api/ds_remote_api_scope_list_helper.go @@ -31,7 +31,7 @@ const ( RAS_ENTRY_TYPE_SCOPE = "scope" ) -// DsListRemoteScopes is the function type for listing remote scopes that must be implmeneted by the plugin +// DsListRemoteScopes is the function type for listing remote scopes that must be implemented by the plugin type DsListRemoteScopes[C plugin.ToolLayerApiConnection, S plugin.ToolLayerScope, P any] func( connection *C, apiClient plugin.ApiClient, groupId string, page P) (children []models.DsRemoteApiScopeListEntry[S], nextPage *P, errr errors.Error) diff --git a/backend/helpers/pluginhelper/api/iterator.go b/backend/helpers/pluginhelper/api/iterator.go index 37ffd2b85cc..6f991eb9079 100644 --- a/backend/helpers/pluginhelper/api/iterator.go +++ b/backend/helpers/pluginhelper/api/iterator.go @@ -55,7 +55,7 @@ func NewBatchedDalCursorIterator(db dal.Dal, cursor dal.Rows, elemType reflect.T }, nil } -// HasNext increments the row curser. If we're at the end, it'll return false. +// HasNext increments the row cursor. If we're at the end, it'll return false. func (c *DalCursorIterator) HasNext() bool { return c.cursor.Next() } @@ -149,7 +149,7 @@ type QueueIterator struct { queue *Queue } -// HasNext increments the row curser. If we're at the end, it'll return false. +// HasNext increments the row cursor. If we're at the end, it'll return false. func (q *QueueIterator) HasNext() bool { return q.queue.GetCount() > 0 } diff --git a/backend/helpers/pluginhelper/api/model_api_helper.go b/backend/helpers/pluginhelper/api/model_api_helper.go index 3e35a7c5d4c..809192aec71 100644 --- a/backend/helpers/pluginhelper/api/model_api_helper.go +++ b/backend/helpers/pluginhelper/api/model_api_helper.go @@ -226,11 +226,11 @@ func parsePagination[P any](input *plugin.ApiResourceInput) (*P, errors.Error) { pagination := new(P) err := utils.DecodeMapStruct(input.Query, pagination, false) if err != nil { - return nil, errors.BadInput.Wrap(err, "faild to decode pagination from query string") + return nil, errors.BadInput.Wrap(err, "failed to decode pagination from query string") } err = utils.DecodeMapStruct(input.Params, pagination, false) if err != nil { - return nil, errors.BadInput.Wrap(err, "faild to decode pagination from path variables") + return nil, errors.BadInput.Wrap(err, "failed to decode pagination from path variables") } if e := vld.Struct(pagination); e != nil { return nil, errors.BadInput.Wrap(e, "invalid pagination parameters") diff --git a/backend/helpers/pluginhelper/api/worker_scheduler.go b/backend/helpers/pluginhelper/api/worker_scheduler.go index d7cfc50961b..74d1c3f70a3 100644 --- a/backend/helpers/pluginhelper/api/worker_scheduler.go +++ b/backend/helpers/pluginhelper/api/worker_scheduler.go @@ -84,7 +84,7 @@ func NewWorkerScheduler( // It doesn't return error because it wouldn't be any when with a Blocking semantic, returned error does nothing but // causing confusion, more often, people thought it is returned by the task. // Since it is async task, the callframes would not be available for production mode, you can export Environment -// Varaible ASYNC_CF=true to enable callframes capturing when debugging. +// Variable ASYNC_CF=true to enable callframes capturing when debugging. // IMPORTANT: do NOT call SubmitBlocking inside the async task, it is likely to cause a deadlock, call // SubmitNonBlocking instead when number of tasks is relatively small. func (s *WorkerScheduler) SubmitBlocking(task func() errors.Error) { @@ -118,7 +118,7 @@ func (s *WorkerScheduler) SubmitBlocking(task func() errors.Error) { /* func (s *WorkerScheduler) gatherCallFrames() string { - cf := "set Environment Varaible ASYNC_CF=true to enable callframes capturing" + cf := "set Environment Variable ASYNC_CF=true to enable callframes capturing" if callframeEnabled { cf = utils.GatherCallFrames(1) } diff --git a/backend/helpers/pluginhelper/csv_file_test.go b/backend/helpers/pluginhelper/csv_file_test.go index b2444868819..0958ca7d0d8 100644 --- a/backend/helpers/pluginhelper/csv_file_test.go +++ b/backend/helpers/pluginhelper/csv_file_test.go @@ -36,8 +36,8 @@ func TestExampleCsvFile(t *testing.T) { defer iter.Close() for iter.HasNext() { row := iter.Fetch() - assert.Equal(t, row["name"], "foobar", "name not euqal") - assert.Equal(t, row["json"], `{"url": "https://example.com"}`, "json not euqal") + assert.Equal(t, row["name"], "foobar", "name not equal") + assert.Equal(t, row["json"], `{"url": "https://example.com"}`, "json not equal") } } diff --git a/backend/helpers/srvhelper/model_service_helper.go b/backend/helpers/srvhelper/model_service_helper.go index 9c3d05ecee7..0ca94827c52 100644 --- a/backend/helpers/srvhelper/model_service_helper.go +++ b/backend/helpers/srvhelper/model_service_helper.go @@ -89,7 +89,7 @@ func (srv *ModelSrvHelper[M]) ValidateModel(model *M) errors.Error { } // basic validator if e := srv.validator.Struct(model); e != nil { - return errors.BadInput.Wrap(e, "validation faild") + return errors.BadInput.Wrap(e, "validation failed") } return nil } diff --git a/backend/helpers/srvhelper/scope_service_helper_test.go b/backend/helpers/srvhelper/scope_service_helper_test.go index 1052b8164f4..54d7979f17c 100644 --- a/backend/helpers/srvhelper/scope_service_helper_test.go +++ b/backend/helpers/srvhelper/scope_service_helper_test.go @@ -35,7 +35,7 @@ func Test_setDefaultEntities(t *testing.T) { setDefaultEntities(sc1) assert.Equal(t, sc1.Entities, plugin.DOMAIN_TYPES) - // plugin embeded the common ScopeConfig + // plugin embedded the common ScopeConfig sc2 := &struct { common.ScopeConfig }{ diff --git a/backend/impls/context/default_basic_res.go b/backend/impls/context/default_basic_res.go index cb277a540b9..1ee4976dbea 100644 --- a/backend/impls/context/default_basic_res.go +++ b/backend/impls/context/default_basic_res.go @@ -36,7 +36,7 @@ func (c *DefaultBasicRes) GetConfigReader() config.ConfigReader { return c.cfg } -// GetConfig returns the value of the specificed name +// GetConfig returns the value of the specified name func (c *DefaultBasicRes) GetConfig(name string) string { return c.cfg.GetString(name) } diff --git a/backend/impls/dalgorm/dalgorm.go b/backend/impls/dalgorm/dalgorm.go index 3b11312a3c1..ba635355f41 100644 --- a/backend/impls/dalgorm/dalgorm.go +++ b/backend/impls/dalgorm/dalgorm.go @@ -277,7 +277,7 @@ func (d *Dalgorm) Delete(entity interface{}, clauses ...dal.Clause) errors.Error return d.convertGormError(buildTx(d.db, clauses).Delete(entity).Error) } -// UpdateColumn allows you to update mulitple records +// UpdateColumn allows you to update multiple records func (d *Dalgorm) UpdateColumn(entityOrTable interface{}, columnName string, value interface{}, clauses ...dal.Clause) errors.Error { d.unwrapDynamic(&entityOrTable, &clauses) if expr, ok := value.(dal.DalClause); ok { @@ -286,7 +286,7 @@ func (d *Dalgorm) UpdateColumn(entityOrTable interface{}, columnName string, val return d.convertGormError(buildTx(d.db, clauses).Update(columnName, value).Error) } -// UpdateColumns allows you to update multiple columns of mulitple records +// UpdateColumns allows you to update multiple columns of multiple records func (d *Dalgorm) UpdateColumns(entityOrTable interface{}, set []dal.DalSet, clauses ...dal.Clause) errors.Error { d.unwrapDynamic(&entityOrTable, &clauses) updatesSet := make(map[string]interface{}) diff --git a/backend/plugins/ae/api/connection.go b/backend/plugins/ae/api/connection.go index 2e42c6152ee..cc3a3889e6e 100644 --- a/backend/plugins/ae/api/connection.go +++ b/backend/plugins/ae/api/connection.go @@ -52,7 +52,7 @@ func testConnection(ctx context.Context, connection models.AeConn) (*plugin.ApiR return &plugin.ApiResourceOutput{Body: true, Status: 200}, nil case 401: // error secretKey or nonceStr return &plugin.ApiResourceOutput{Body: false, Status: http.StatusBadRequest}, nil - default: // unknow what happen , back to user + default: // unknown what happen , back to user return &plugin.ApiResourceOutput{Body: res.Body, Status: res.StatusCode}, nil } } diff --git a/backend/plugins/bamboo/api/connection_api.go b/backend/plugins/bamboo/api/connection_api.go index 3fd72a22e48..4c142fc5d27 100644 --- a/backend/plugins/bamboo/api/connection_api.go +++ b/backend/plugins/bamboo/api/connection_api.go @@ -108,7 +108,7 @@ func TestExistingConnection(input *plugin.ApiResourceInput) (*plugin.ApiResource // @Param body body models.BambooConnection true "json body" // @Success 200 {object} models.BambooConnection // @Failure 400 {string} errcode.Error "Bad Request" -// @Failure 500 {string} errcode.Error "Internel Error" +// @Failure 500 {string} errcode.Error "Internal Error" // @Router /plugins/bamboo/connections [POST] func PostConnections(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ConnApi.Post(input) @@ -121,7 +121,7 @@ func PostConnections(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, // @Param connectionId path int true "connection ID" // @Success 200 {object} models.BambooConnection // @Failure 400 {string} errcode.Error "Bad Request" -// @Failure 500 {string} errcode.Error "Internel Error" +// @Failure 500 {string} errcode.Error "Internal Error" // @Router /plugins/bamboo/connections/{connectionId} [PATCH] func PatchConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ConnApi.Patch(input) @@ -134,7 +134,7 @@ func PatchConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, // @Success 200 {object} models.BambooConnection // @Failure 400 {string} errcode.Error "Bad Request" // @Failure 409 {object} services.BlueprintProjectPairs "References exist to this connection" -// @Failure 500 {string} errcode.Error "Internel Error" +// @Failure 500 {string} errcode.Error "Internal Error" // @Router /plugins/bamboo/connections/{connectionId} [DELETE] func DeleteConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ConnApi.Delete(input) @@ -145,7 +145,7 @@ func DeleteConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput // @Tags plugins/bamboo // @Success 200 {object} []models.BambooConnection // @Failure 400 {string} errcode.Error "Bad Request" -// @Failure 500 {string} errcode.Error "Internel Error" +// @Failure 500 {string} errcode.Error "Internal Error" // @Router /plugins/bamboo/connections [GET] func ListConnections(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ConnApi.GetAll(input) @@ -157,7 +157,7 @@ func ListConnections(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, // @Param connectionId path int true "connection ID" // @Success 200 {object} models.BambooConnection // @Failure 400 {string} errcode.Error "Bad Request" -// @Failure 500 {string} errcode.Error "Internel Error" +// @Failure 500 {string} errcode.Error "Internal Error" // @Router /plugins/bamboo/connections/{connectionId} [GET] func GetConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ConnApi.GetDetail(input) diff --git a/backend/plugins/bamboo/models/plan.go b/backend/plugins/bamboo/models/plan.go index 3811596f119..386fbbbc433 100644 --- a/backend/plugins/bamboo/models/plan.go +++ b/backend/plugins/bamboo/models/plan.go @@ -110,7 +110,7 @@ type SearchEntity struct { Type string `json:"type"` } -// Name trys to keep plan's name field the same with name in /remote-scopes. +// Name tries to keep plan's name field the same with name in /remote-scopes. // In /remote-scopes, plan's name is "{projectName - planName}". func (entity SearchEntity) Name() string { return strings.Join([]string{entity.ProjectName, entity.PlanName}, " - ") diff --git a/backend/plugins/bamboo/tasks/shared.go b/backend/plugins/bamboo/tasks/shared.go index 182670b954d..fc715aa114f 100644 --- a/backend/plugins/bamboo/tasks/shared.go +++ b/backend/plugins/bamboo/tasks/shared.go @@ -139,7 +139,7 @@ func generateFakeRepoUrl(endpoint string, repoId int) (string, error) { return fmt.Sprintf("fake://%s/repos/%d", endpointURL.Host, repoId), nil } -// covertError will indentify some known errors and transform it to a simple form. +// covertError will identify some known errors and transform it to a simple form. func covertError(err errors.Error) errors.Error { if err == nil { return nil diff --git a/backend/plugins/customize/service/service.go b/backend/plugins/customize/service/service.go index 5ef3bcbb3bb..8217be3a5c1 100644 --- a/backend/plugins/customize/service/service.go +++ b/backend/plugins/customize/service/service.go @@ -550,7 +550,7 @@ func (s *Service) qaTestCaseExecutionHandler(qaProjectId string) func(record map } // issueRepoCommitHandlerFactory returns a handler that will populate the `issue_commits` and `issue_repo_commits` table -// ths issueCommitsFields is used to filter the fields that should be inserted into the `issue_commits` table +// the issueCommitsFields is used to filter the fields that should be inserted into the `issue_commits` table func (s *Service) issueRepoCommitHandler(record map[string]interface{}) errors.Error { err := s.dal.CreateWithMap(&crossdomain.IssueRepoCommit{}, record) if err != nil { diff --git a/backend/plugins/dora/api/data.go b/backend/plugins/dora/api/data.go index baada7a4c46..6f610ffa453 100644 --- a/backend/plugins/dora/api/data.go +++ b/backend/plugins/dora/api/data.go @@ -25,7 +25,7 @@ import ( const RAW_DEPLOYMENTS_TABLE = `dora_deplyments` -//TODO Please modify the folowing code to adapt to your plugin +//TODO Please modify the following code to adapt to your plugin /* POST /plugins/dora/deployments { @@ -39,7 +39,7 @@ func PostDeployments(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, const RAW_ISSUES_TABLE = `dora_issues` -//TODO Please modify the folowing code to adapt to your plugin +//TODO Please modify the following code to adapt to your plugin /* POST /plugins/dora/issues { @@ -51,7 +51,7 @@ func PostIssues(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, erro return &plugin.ApiResourceOutput{Body: nil, Status: http.StatusOK}, nil } -//TODO Please modify the folowing code to adapt to your plugin +//TODO Please modify the following code to adapt to your plugin /* POST /plugins/dora/issues/:id/close { diff --git a/backend/plugins/gitee/models/migrationscripts/archived/connection.go b/backend/plugins/gitee/models/migrationscripts/archived/connection.go index 55af7fc7713..14370ed586a 100644 --- a/backend/plugins/gitee/models/migrationscripts/archived/connection.go +++ b/backend/plugins/gitee/models/migrationscripts/archived/connection.go @@ -30,7 +30,7 @@ type RestConnection struct { BaseConnection `mapstructure:",squash"` Endpoint string `mapstructure:"endpoint" validate:"required" json:"endpoint"` Proxy string `mapstructure:"proxy" json:"proxy"` - RateLimitPerHour int `comment:"api request rate limt per hour" json:"rateLimit"` + RateLimitPerHour int `comment:"api request rate limit per hour" json:"rateLimit"` } type BaseConnection struct { diff --git a/backend/plugins/gitextractor/parser/repo_gogit.go b/backend/plugins/gitextractor/parser/repo_gogit.go index 21cf09cd9e9..8837aa38347 100644 --- a/backend/plugins/gitextractor/parser/repo_gogit.go +++ b/backend/plugins/gitextractor/parser/repo_gogit.go @@ -400,7 +400,7 @@ func (r *GogitRepoCollector) storeParentCommits(commitSha string, commit *object for i := 0; i < commit.NumParents(); i++ { parent, err := commit.Parent(i) if err != nil { - // parent commit might not exist when repo is shallow cloned (tradeoff of supporting timeAfter paramenter) + // parent commit might not exist when repo is shallow cloned (tradeoff of supporting timeAfter parameter) if err.Error() == "object not found" { continue } diff --git a/backend/plugins/gitlab/e2e/job_test.go b/backend/plugins/gitlab/e2e/job_test.go index 1705f59a8c6..64f45824032 100644 --- a/backend/plugins/gitlab/e2e/job_test.go +++ b/backend/plugins/gitlab/e2e/job_test.go @@ -71,7 +71,7 @@ func TestGitlabJobDataFlow(t *testing.T) { ), ) - // verifi when production regex is omitted + // verify when production regex is omitted dataflowTester.FlushTabler(&devops.CICDTask{}) dataflowTester.Subtask(tasks.ConvertJobMeta, taskData) dataflowTester.VerifyTableWithOptions(&devops.CICDTask{}, e2ehelper.TableOptions{ diff --git a/backend/plugins/gitlab/models/migrationscripts/archived/connection.go b/backend/plugins/gitlab/models/migrationscripts/archived/connection.go index f7b7f9f6783..7d717b5ddd7 100644 --- a/backend/plugins/gitlab/models/migrationscripts/archived/connection.go +++ b/backend/plugins/gitlab/models/migrationscripts/archived/connection.go @@ -31,7 +31,7 @@ type RestConnection struct { BaseConnection `mapstructure:",squash"` Endpoint string `mapstructure:"endpoint" validate:"required" json:"endpoint"` Proxy string `mapstructure:"proxy" json:"proxy"` - RateLimitPerHour int `comment:"api request rate limt per hour" json:"rateLimit"` + RateLimitPerHour int `comment:"api request rate limit per hour" json:"rateLimit"` } type BaseConnection struct { diff --git a/backend/plugins/gitlab/tasks/shared.go b/backend/plugins/gitlab/tasks/shared.go index 3c100d7dd2e..6621ba3f2fd 100644 --- a/backend/plugins/gitlab/tasks/shared.go +++ b/backend/plugins/gitlab/tasks/shared.go @@ -187,7 +187,7 @@ func GetMergeRequestsIterator(taskCtx plugin.SubTaskContext, apiCollector *api.S clauses := []dal.Clause{ dal.Select("gmr.gitlab_id, gmr.iid"), dal.From("_tool_gitlab_merge_requests gmr"), - // collect only openning merge request's notes and commits to speed up the process + // collect only opening merge request's notes and commits to speed up the process dal.Where( `gmr.project_id = ? and gmr.connection_id = ?`, data.Options.ProjectId, data.Options.ConnectionId, diff --git a/backend/plugins/issue_trace/tasks/issue_status_history_convertor.go b/backend/plugins/issue_trace/tasks/issue_status_history_convertor.go index 42bfd0fd328..efe8ddb4f9a 100644 --- a/backend/plugins/issue_trace/tasks/issue_status_history_convertor.go +++ b/backend/plugins/issue_trace/tasks/issue_status_history_convertor.go @@ -219,7 +219,7 @@ func ConvertIssueStatusHistory(taskCtx plugin.SubTaskContext) errors.Error { } } } - logger.Info("issues status history covert successfully") + logger.Info("issues status history converted successfully") return nil } diff --git a/backend/plugins/jenkins/models/build.go b/backend/plugins/jenkins/models/build.go index 203d81d0023..b38aaa15afa 100644 --- a/backend/plugins/jenkins/models/build.go +++ b/backend/plugins/jenkins/models/build.go @@ -35,7 +35,7 @@ type JenkinsBuild struct { Number int64 `gorm:"index"` Result string // Result Timestamp int64 // start time - StartTime time.Time // convered by timestamp + StartTime time.Time // converted by timestamp Type string `gorm:"index;type:varchar(255)"` Class string `gorm:"index;type:varchar(255)" ` TriggeredBy string `gorm:"type:varchar(255)"` diff --git a/backend/plugins/jenkins/models/migrationscripts/20220916_modify_jenkins_build.go b/backend/plugins/jenkins/models/migrationscripts/20220916_modify_jenkins_build.go index c0d49a0e913..ec4e3322966 100644 --- a/backend/plugins/jenkins/models/migrationscripts/20220916_modify_jenkins_build.go +++ b/backend/plugins/jenkins/models/migrationscripts/20220916_modify_jenkins_build.go @@ -40,7 +40,7 @@ type jenkinsBuild20220916Before struct { Number int64 `gorm:"primaryKey"` Result string // Result Timestamp int64 // start time - StartTime time.Time // convered by timestamp + StartTime time.Time // converted by timestamp Type string `gorm:"index;type:varchar(255)"` Class string `gorm:"index;type:varchar(255)" ` TriggeredBy string `gorm:"type:varchar(255)"` @@ -63,7 +63,7 @@ type jenkinsBuild20220916After struct { Number int64 `gorm:"index"` Result string // Result Timestamp int64 // start time - StartTime time.Time // convered by timestamp + StartTime time.Time // converted by timestamp Type string `gorm:"index;type:varchar(255)"` Class string `gorm:"index;type:varchar(255)" ` TriggeredBy string `gorm:"type:varchar(255)"` diff --git a/backend/plugins/jenkins/models/migrationscripts/20221131_add_fullName_for_builds.go b/backend/plugins/jenkins/models/migrationscripts/20221131_add_fullName_for_builds.go index a7c0692c25c..2802835e033 100644 --- a/backend/plugins/jenkins/models/migrationscripts/20221131_add_fullName_for_builds.go +++ b/backend/plugins/jenkins/models/migrationscripts/20221131_add_fullName_for_builds.go @@ -48,7 +48,7 @@ type jenkinsBuild20221131Before struct { Number int64 `gorm:"index"` Result string // Result Timestamp int64 // start time - StartTime time.Time // convered by timestamp + StartTime time.Time // converted by timestamp Type string `gorm:"index;type:varchar(255)"` Class string `gorm:"index;type:varchar(255)" ` TriggeredBy string `gorm:"type:varchar(255)"` @@ -72,7 +72,7 @@ type jenkinsBuild20221131After struct { Number int64 `gorm:"index"` Result string // Result Timestamp int64 // start time - StartTime time.Time // convered by timestamp + StartTime time.Time // converted by timestamp Type string `gorm:"index;type:varchar(255)"` Class string `gorm:"index;type:varchar(255)" ` TriggeredBy string `gorm:"type:varchar(255)"` diff --git a/backend/plugins/jenkins/models/migrationscripts/archived/build.go b/backend/plugins/jenkins/models/migrationscripts/archived/build.go index 4659e0cc2da..70bc781f62d 100644 --- a/backend/plugins/jenkins/models/migrationscripts/archived/build.go +++ b/backend/plugins/jenkins/models/migrationscripts/archived/build.go @@ -35,7 +35,7 @@ type JenkinsBuild struct { Number int64 `gorm:"primaryKey"` Result string // Result Timestamp int64 // start time - StartTime time.Time // convered by timestamp + StartTime time.Time // converted by timestamp CommitSha string `gorm:"type:varchar(255)"` } diff --git a/backend/plugins/jira/models/migrationscripts/20220716_add_init_tables.go b/backend/plugins/jira/models/migrationscripts/20220716_add_init_tables.go index d27726f76c3..6f161976c0b 100644 --- a/backend/plugins/jira/models/migrationscripts/20220716_add_init_tables.go +++ b/backend/plugins/jira/models/migrationscripts/20220716_add_init_tables.go @@ -45,7 +45,7 @@ type jiraConnection20220716Before struct { StoryPointField string `gorm:"type:varchar(50);" json:"storyPointField"` RemotelinkCommitShaPattern string `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"` Proxy string `json:"proxy"` - RateLimit int `comment:"api request rate limt per hour" json:"rateLimit"` + RateLimit int `comment:"api request rate limit per hour" json:"rateLimit"` } type addInitTables20220716 struct{} diff --git a/backend/plugins/jira/models/migrationscripts/archived/source.go b/backend/plugins/jira/models/migrationscripts/archived/source.go index 2ceed1613b3..951eba5b598 100644 --- a/backend/plugins/jira/models/migrationscripts/archived/source.go +++ b/backend/plugins/jira/models/migrationscripts/archived/source.go @@ -30,7 +30,7 @@ type JiraSource struct { StoryPointField string `gorm:"type:varchar(50);" json:"storyPointField"` RemotelinkCommitShaPattern string `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"` Proxy string `json:"proxy"` - RateLimit int `comment:"api request rate limt per second"` + RateLimit int `comment:"api request rate limit per second"` } type JiraIssueTypeMapping struct { diff --git a/backend/plugins/jira/tasks/issue_extractor.go b/backend/plugins/jira/tasks/issue_extractor.go index d25423b918f..94620711399 100644 --- a/backend/plugins/jira/tasks/issue_extractor.go +++ b/backend/plugins/jira/tasks/issue_extractor.go @@ -163,7 +163,7 @@ func extractIssues(data *JiraTaskData, mappings *typeMappings, apiIssue *apiv2mo if value, ok := mappings.StandardStatusMappings[issue.Type][issue.StatusKey]; ok { issue.StdStatus = value.StandardStatus } - // issue commments + // issue comments results = append(results, issue) for _, comment := range comments { results = append(results, comment) diff --git a/backend/plugins/linker/impl/impl.go b/backend/plugins/linker/impl/impl.go index 917b22df9aa..e2efb809d9d 100644 --- a/backend/plugins/linker/impl/impl.go +++ b/backend/plugins/linker/impl/impl.go @@ -42,7 +42,7 @@ var _ interface { type Linker struct{} func (p Linker) Description() string { - return "link some cross table datas together" + return "link some cross table data together" } // RequiredDataEntities hasn't been used so far diff --git a/backend/plugins/refdiff/tasks/refdiff_task_data.go b/backend/plugins/refdiff/tasks/refdiff_task_data.go index 782bb921419..c4bc074a234 100644 --- a/backend/plugins/refdiff/tasks/refdiff_task_data.go +++ b/backend/plugins/refdiff/tasks/refdiff_task_data.go @@ -121,7 +121,7 @@ func (rs RefsReverseSemver) Swap(i, j int) { func CalculateTagPattern(db dal.Dal, tagsPattern string, tagsLimit int, tagsOrder string) (Refs, errors.Error) { rs := Refs{} - // caculate Pattern part + // calculate Pattern part if tagsPattern == "" || tagsLimit <= 1 { return rs, nil } @@ -176,7 +176,7 @@ func CalculateCommitPairs(db dal.Dal, repoId string, pairs []models.RefPair, rs commitPairs = append(commitPairs, [4]string{rs[i-1].CommitSha, rs[i].CommitSha, rs[i-1].Name, rs[i].Name}) } - // caculate pairs part + // calculate pairs part // convert ref pairs into commit pairs ref2sha := func(refName string) (string, error) { ref := &code.Ref{} @@ -186,7 +186,7 @@ func CalculateCommitPairs(db dal.Dal, repoId string, pairs []models.RefPair, rs ref.Id = fmt.Sprintf("%s:%s", repoId, refName) err := db.First(ref) if err != nil && !db.IsErrorNotFound(err) { - return "", errors.NotFound.Wrap(err, fmt.Sprintf("faild to load Ref info for repoId:%s, refName:%s", repoId, refName)) + return "", errors.NotFound.Wrap(err, fmt.Sprintf("failed to load Ref info for repoId:%s, refName:%s", repoId, refName)) } return ref.CommitSha, nil } diff --git a/backend/plugins/tapd/api/blueprint_v200.go b/backend/plugins/tapd/api/blueprint_v200.go index 676ed30cf00..abb8695a72b 100644 --- a/backend/plugins/tapd/api/blueprint_v200.go +++ b/backend/plugins/tapd/api/blueprint_v200.go @@ -96,7 +96,7 @@ func makeScopesV200( // get workspace and scope config from db tapdWorkspace, scopeConfig := scopeDetail.Scope, scopeDetail.ScopeConfig - // add wrokspace to scopes + // add workspace to scopes if utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_TICKET) { id := idgen.Generate(connection.ID, tapdWorkspace.Id) board := ticket.NewBoard(id, tapdWorkspace.Name) diff --git a/backend/plugins/tapd/models/migrationscripts/archived/tapd_connection.go b/backend/plugins/tapd/models/migrationscripts/archived/tapd_connection.go index b07d89d6a9f..9af60b102c2 100644 --- a/backend/plugins/tapd/models/migrationscripts/archived/tapd_connection.go +++ b/backend/plugins/tapd/models/migrationscripts/archived/tapd_connection.go @@ -39,7 +39,7 @@ type RestConnection struct { BaseConnection `mapstructure:",squash"` Endpoint string `mapstructure:"endpoint" validate:"required" json:"endpoint"` Proxy string `mapstructure:"proxy" json:"proxy"` - RateLimitPerHour int `comment:"api request rate limt per hour" json:"rateLimit"` + RateLimitPerHour int `comment:"api request rate limit per hour" json:"rateLimit"` } type TapdConnection struct { diff --git a/backend/plugins/zentao/models/migrationscripts/archived/connection.go b/backend/plugins/zentao/models/migrationscripts/archived/connection.go index dab806d988b..7bee6db349b 100644 --- a/backend/plugins/zentao/models/migrationscripts/archived/connection.go +++ b/backend/plugins/zentao/models/migrationscripts/archived/connection.go @@ -46,7 +46,7 @@ type RestConnection struct { BaseConnection `mapstructure:",squash"` Endpoint string `mapstructure:"endpoint" validate:"required" json:"endpoint"` Proxy string `mapstructure:"proxy" json:"proxy"` - RateLimitPerHour int `comment:"api request rate limt per hour" json:"rateLimit"` + RateLimitPerHour int `comment:"api request rate limit per hour" json:"rateLimit"` } type BaseConnection struct { diff --git a/backend/plugins/zentao/tasks/execution_summary_dev_extractor.go b/backend/plugins/zentao/tasks/execution_summary_dev_extractor.go index 7d3fd24a38e..b77ab4f2638 100644 --- a/backend/plugins/zentao/tasks/execution_summary_dev_extractor.go +++ b/backend/plugins/zentao/tasks/execution_summary_dev_extractor.go @@ -33,7 +33,7 @@ var ExtractExecutionSummaryDevMeta = plugin.SubTaskMeta{ Name: "extractExecutionSummaryDev", EntryPoint: ExtractExecutionSummaryDev, EnabledByDefault: true, - Description: "extract Zentao execution summary from build-in page api", + Description: "extract Zentao execution summary from built-in page api", DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, } diff --git a/backend/plugins/zentao/tasks/task_collector.go b/backend/plugins/zentao/tasks/task_collector.go index ea8a3976a6e..ac0d9d7e6d9 100644 --- a/backend/plugins/zentao/tasks/task_collector.go +++ b/backend/plugins/zentao/tasks/task_collector.go @@ -88,7 +88,7 @@ func CollectTask(taskCtx plugin.SubTaskContext) errors.Error { // extract task's children childTasks, err := extractChildrenWithDFS(task) if err != nil { - return nil, errors.Default.New(fmt.Sprintf("extract task: %v chidren err: %v", task, err)) + return nil, errors.Default.New(fmt.Sprintf("extract task: %v children err: %v", task, err)) } for _, task := range childTasks { allTaskRecords[task.Id] = task diff --git a/backend/python/pydevlake/pydevlake/api.py b/backend/python/pydevlake/pydevlake/api.py index a50b71d9424..cc47601cdfd 100644 --- a/backend/python/pydevlake/pydevlake/api.py +++ b/backend/python/pydevlake/pydevlake/api.py @@ -221,7 +221,7 @@ def get_next_page_id(self, response) -> Optional[int | str]: """ Extracts or compute the id of the next page from the response, e.g. incrementing the value of `page` of a JSON body. - This id will be suplied to the next request via `set_next_page_param`. + This id will be supplied to the next request via `set_next_page_param`. Returning None indicates that the response is the last page. """ pass diff --git a/backend/server/api/README.md b/backend/server/api/README.md index 887a85b90ff..04273b38526 100644 --- a/backend/server/api/README.md +++ b/backend/server/api/README.md @@ -18,7 +18,7 @@ limitations under the License. ### Summary -Users can set pipepline plan by config-ui to create schedule jobs. +Users can set pipeline plan by config-ui to create schedule jobs. And config-ui will send blueprint request with cronConfig in crontab format. ### Cron Job diff --git a/backend/server/services/blueprint.go b/backend/server/services/blueprint.go index 91bab693420..2fb05c3b718 100644 --- a/backend/server/services/blueprint.go +++ b/backend/server/services/blueprint.go @@ -258,7 +258,7 @@ func DeleteBlueprint(id uint64) errors.Error { var blueprintReloadLock sync.Mutex var bpCronIdMap map[uint64]cron.EntryID -// ReloadBlueprints reloades cronjobs based on blueprints +// ReloadBlueprints reloads cronjobs based on blueprints func ReloadBlueprints() (err errors.Error) { enable := true isManual := false diff --git a/backend/server/services/pipeline.go b/backend/server/services/pipeline.go index f6c770f9c6f..080028079ac 100644 --- a/backend/server/services/pipeline.go +++ b/backend/server/services/pipeline.go @@ -439,7 +439,7 @@ func CancelPipeline(pipelineId uint64) errors.Error { pipeline.Status = models.TASK_CANCELLED err = db.Update(pipeline) if err != nil { - return errors.Default.Wrap(err, "faile to update pipeline") + return errors.Default.Wrap(err, "failed to update pipeline") } // now, with RunPipelineInQueue being block and target pipeline got updated // we should update the related tasks as well @@ -449,7 +449,7 @@ func CancelPipeline(pipelineId uint64) errors.Error { dal.Where("pipeline_id = ?", pipelineId), ) if err != nil { - return errors.Default.Wrap(err, "faile to update pipeline tasks") + return errors.Default.Wrap(err, "failed to update pipeline tasks") } // the target pipeline is pending, no running, no need to perform the actual cancel operation return nil @@ -563,7 +563,7 @@ func RerunPipeline(pipelineId uint64, task *models.Task) (tasks []*models.Task, rerunTasks = append(rerunTasks, rerunTask) } - // mark pipline rerun + // mark pipeline rerun err = tx.UpdateColumn(&models.Pipeline{}, "status", models.TASK_RERUN, dal.Where("id = ?", pipelineId), diff --git a/backend/server/services/pipeline_runner.go b/backend/server/services/pipeline_runner.go index b16dc2dc389..0f215a061ff 100644 --- a/backend/server/services/pipeline_runner.go +++ b/backend/server/services/pipeline_runner.go @@ -106,8 +106,8 @@ func runPipeline(pipelineId uint64) errors.Error { return NotifyExternal(pipelineId) } -// ComputePipelineStatus determines pipleline status by its latest(rerun included) tasks statuses -// 1. TASK_COMPLETED: all tasks were executed sucessfully +// ComputePipelineStatus determines pipeline status by its latest(rerun included) tasks statuses +// 1. TASK_COMPLETED: all tasks were executed successfully // 2. TASK_FAILED: SkipOnFail=false with failed task(s) // 3. TASK_PARTIAL: SkipOnFail=true with failed task(s) func ComputePipelineStatus(pipeline *models.Pipeline, isCancelled bool) (string, errors.Error) { diff --git a/backend/server/services/project.go b/backend/server/services/project.go index c030a9af53d..a1b92b03ae4 100644 --- a/backend/server/services/project.go +++ b/backend/server/services/project.go @@ -106,7 +106,7 @@ func CreateProject(projectInput *models.ApiInputProject) (*models.ApiOutputProje return nil, err } - // create transaction to updte multiple tables + // create transaction to update multiple tables var err errors.Error tx := db.Begin() defer func() { diff --git a/backend/test/helper/client.go b/backend/test/helper/client.go index 0af014b0513..8c5c9d22aed 100644 --- a/backend/test/helper/client.go +++ b/backend/test/helper/client.go @@ -345,7 +345,7 @@ func runWithTimeout(timeout time.Duration, f func() (bool, errors.Error)) errors select { case <-timer: if !resp.completed { - return errors.Default.New(fmt.Sprintf("timed out calling function after %d miliseconds", timeout.Milliseconds())) + return errors.Default.New(fmt.Sprintf("timed out calling function after %d milliseconds", timeout.Milliseconds())) } return nil case resp = <-resChan: diff --git a/config-ui/src/plugins/register/github/transformation.tsx b/config-ui/src/plugins/register/github/transformation.tsx index ef9d4d7473f..1758f7e6835 100644 --- a/config-ui/src/plugins/register/github/transformation.tsx +++ b/config-ui/src/plugins/register/github/transformation.tsx @@ -206,7 +206,7 @@ const renderCollapseItems = ({ label={ <> Issue Severity - + } > diff --git a/config-ui/src/routes/blueprint/detail/components/sync-policy/index.tsx b/config-ui/src/routes/blueprint/detail/components/sync-policy/index.tsx index 9efd012f16f..9f7b24c7340 100644 --- a/config-ui/src/routes/blueprint/detail/components/sync-policy/index.tsx +++ b/config-ui/src/routes/blueprint/detail/components/sync-policy/index.tsx @@ -76,7 +76,7 @@ export const SyncPolicy = ({ const cron = useMemo(() => getCron(isManual, cronConfig), [isManual, cronConfig]); - const [mintue, hour, day, month, week] = useMemo(() => cronConfig.split(' '), [cronConfig]); + const [minute, hour, day, month, week] = useMemo(() => cronConfig.split(' '), [cronConfig]); const handleChangeFrequency = (e: RadioChangeEvent) => { const value = e.target.value; @@ -152,32 +152,32 @@ export const SyncPolicy = ({ onChangeCronConfig([e.target.value, hour, day, month, week].join(' '))} /> onChangeCronConfig([mintue, e.target.value, day, month, week].join(' '))} + onChange={(e) => onChangeCronConfig([minute, e.target.value, day, month, week].join(' '))} /> onChangeCronConfig([mintue, hour, e.target.value, month, week].join(' '))} + onChange={(e) => onChangeCronConfig([minute, hour, e.target.value, month, week].join(' '))} /> onChangeCronConfig([mintue, hour, day, e.target.value, week].join(' '))} + onChange={(e) => onChangeCronConfig([minute, hour, day, e.target.value, week].join(' '))} /> onChangeCronConfig([mintue, hour, day, month, e.target.value].join(' '))} + onChange={(e) => onChangeCronConfig([minute, hour, day, month, e.target.value].join(' '))} /> diff --git a/config-ui/src/routes/onboard/components/card.tsx b/config-ui/src/routes/onboard/components/card.tsx index 3c59ee082d2..d2250573da3 100644 --- a/config-ui/src/routes/onboard/components/card.tsx +++ b/config-ui/src/routes/onboard/components/card.tsx @@ -32,7 +32,7 @@ interface Props { } export const OnboardCard = ({ style }: Props) => { - const [oeprating, setOperating] = useState(false); + const [operating, setOperating] = useState(false); const [version, setVersion] = useState(0); const navigate = useNavigate(); @@ -91,7 +91,7 @@ export const OnboardCard = ({ style }: Props) => { title: 'Permanently close this entry?', content: 'You will not be able to get back to the onboarding session again.', okButtonProps: { - loading: oeprating, + loading: operating, }, okText: 'Confirm', onOk: async () => { diff --git a/config-ui/src/routes/onboard/index.tsx b/config-ui/src/routes/onboard/index.tsx index 061be20331f..d29ed40fbcc 100644 --- a/config-ui/src/routes/onboard/index.tsx +++ b/config-ui/src/routes/onboard/index.tsx @@ -129,7 +129,7 @@ export const Onboard = ({ logo, title }: Props) => { {[1, 2, 3].includes(step) && ( {steps.map((it) => ( - + {it.step} {it.title} diff --git a/config-ui/src/routes/onboard/styled.ts b/config-ui/src/routes/onboard/styled.ts index b8d95a9e798..3e083694c9b 100644 --- a/config-ui/src/routes/onboard/styled.ts +++ b/config-ui/src/routes/onboard/styled.ts @@ -49,7 +49,7 @@ export const Step = styled.ul` margin-bottom: 50px; `; -export const StepItem = styled.li<{ $actived: boolean; $activedColor: string }>` +export const StepItem = styled.li<{ $activated: boolean; $activatedColor: string }>` display: flex; align-items: center; position: relative; @@ -65,19 +65,19 @@ export const StepItem = styled.li<{ $actived: boolean; $activedColor: string }>` border: 1px solid rgba(0, 0, 0, 0.25); border-radius: 50%; - ${({ $actived, $activedColor }) => - $actived + ${({ $activated, $activatedColor }) => + $activated ? ` color: #fff; - background-color: ${$activedColor}; + background-color: ${$activatedColor}; border: none; ` : ''} } span:last-child { - ${({ $actived }) => - $actived + ${({ $activated }) => + $activated ? ` font-size: 24px; font-weight: 600;` diff --git a/grafana/_archive/DeliveryQuality(RequireJiraAndGitlabData).json b/grafana/_archive/DeliveryQuality(RequireJiraAndGitlabData).json index 92e2fef5ee0..4f384919be4 100644 --- a/grafana/_archive/DeliveryQuality(RequireJiraAndGitlabData).json +++ b/grafana/_archive/DeliveryQuality(RequireJiraAndGitlabData).json @@ -621,7 +621,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "SELECT\n timestamp(DATE_ADD(date(gitlab_created_at), INTERVAL -$interval(date(gitlab_created_at))+1 DAY)) as time,\n avg(review_rounds) as \"Pull Request Reveiw Round\"\nFROM\n gitlab_merge_requests gmr\n LEFT JOIN jira_board_gitlab_projects jbgp ON jbgp.gitlab_project_id = gmr.project_id\nWHERE\n state = 'merged'\n and review_rounds > 0\n and jbgp.jira_board_id = $board_id\n and $__timeFilter(gitlab_created_at)\nGROUP BY 1\nORDER BY 1", + "rawSql": "SELECT\n timestamp(DATE_ADD(date(gitlab_created_at), INTERVAL -$interval(date(gitlab_created_at))+1 DAY)) as time,\n avg(review_rounds) as \"Pull Request Review Round\"\nFROM\n gitlab_merge_requests gmr\n LEFT JOIN jira_board_gitlab_projects jbgp ON jbgp.gitlab_project_id = gmr.project_id\nWHERE\n state = 'merged'\n and review_rounds > 0\n and jbgp.jira_board_id = $board_id\n and $__timeFilter(gitlab_created_at)\nGROUP BY 1\nORDER BY 1", "refId": "A", "select": [ [ diff --git a/grafana/_archive/Gitlab.json b/grafana/_archive/Gitlab.json index 1baf386b8c6..806613efbf0 100644 --- a/grafana/_archive/Gitlab.json +++ b/grafana/_archive/Gitlab.json @@ -56,7 +56,7 @@ }, "id": 48, "options": { - "content": "
\n
\n \"No.1\"\n

MR Troughput and Pass Rate

\n
\n
", + "content": "
\n
\n \"No.1\"\n

MR Throughput and Pass Rate

\n
\n
", "mode": "html" }, "pluginVersion": "8.0.6", @@ -857,7 +857,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "SELECT\n timestamp(DATE_ADD(date(gitlab_created_at), INTERVAL -$interval(date(gitlab_created_at))+1 DAY)) as time,\n avg(review_rounds) as \"Pull Request Reveiw Round\"\nFROM\n gitlab_merge_requests gmr\nWHERE\n state = 'merged'\n and review_rounds > 0\n and gmr.project_id = $repo_id\n and $__timeFilter(gitlab_created_at)\nGROUP BY 1\nORDER BY 1", + "rawSql": "SELECT\n timestamp(DATE_ADD(date(gitlab_created_at), INTERVAL -$interval(date(gitlab_created_at))+1 DAY)) as time,\n avg(review_rounds) as \"Pull Request Review Round\"\nFROM\n gitlab_merge_requests gmr\nWHERE\n state = 'merged'\n and review_rounds > 0\n and gmr.project_id = $repo_id\n and $__timeFilter(gitlab_created_at)\nGROUP BY 1\nORDER BY 1", "refId": "A", "select": [ [ diff --git a/grafana/dashboards/DORADebug.json b/grafana/dashboards/DORADebug.json index 935b035c1da..1fc487e930e 100644 --- a/grafana/dashboards/DORADebug.json +++ b/grafana/dashboards/DORADebug.json @@ -2641,7 +2641,7 @@ ] } ], - "title": "Step 5 - check the median change lead time for each month in Figure 4 (Compare the change_lead_time with the max ranks in GREEN before the first occurence of ORANGE in each month)", + "title": "Step 5 - check the median change lead time for each month in Figure 4 (Compare the change_lead_time with the max ranks in GREEN before the first occurrence of ORANGE in each month)", "type": "table" }, { @@ -3464,7 +3464,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "with _deployments as(\n select\n distinct d.cicd_deployment_id as deployment_id,\n d.result,\n d.environment,\n d.finished_date,\n d.cicd_scope_id,\n pm.project_name\n from\n cicd_deployment_commits d\n join project_mapping pm on d.cicd_scope_id = pm.row_id\n and pm.`table` = 'cicd_scopes'\n where\n -- only result needs to specified, not envioronment\n d.result = 'SUCCESS' -- choose your project_name\n and pm.project_name in ($project)\n),\n_incidents as(\n select\n distinct i.id as issue_id,\n i.created_date,\n pm.project_name\n from\n incidents i\n join project_mapping pm on i.scope_id = pm.row_id\n and i.`table` = pm.`table`\n where\n -- choose your project_name\n pm.project_name in ($project)\n)\nselect\n deployment_id as id,\n 'DEPLOYMENT' as type,\n finished_date as time\nfrom\n _deployments\nunion\nselect\n issue_id as id,\n 'INCIDENT' as type,\n created_date as time\nfrom\n _incidents\norder by\n time", + "rawSql": "with _deployments as(\n select\n distinct d.cicd_deployment_id as deployment_id,\n d.result,\n d.environment,\n d.finished_date,\n d.cicd_scope_id,\n pm.project_name\n from\n cicd_deployment_commits d\n join project_mapping pm on d.cicd_scope_id = pm.row_id\n and pm.`table` = 'cicd_scopes'\n where\n -- only result needs to specified, not environment\n d.result = 'SUCCESS' -- choose your project_name\n and pm.project_name in ($project)\n),\n_incidents as(\n select\n distinct i.id as issue_id,\n i.created_date,\n pm.project_name\n from\n incidents i\n join project_mapping pm on i.scope_id = pm.row_id\n and i.`table` = pm.`table`\n where\n -- choose your project_name\n pm.project_name in ($project)\n)\nselect\n deployment_id as id,\n 'DEPLOYMENT' as type,\n finished_date as time\nfrom\n _deployments\nunion\nselect\n issue_id as id,\n 'INCIDENT' as type,\n created_date as time\nfrom\n _incidents\norder by\n time", "refId": "A", "select": [ [ diff --git a/grafana/dashboards/DORADetails-ChangeFailureRate.json b/grafana/dashboards/DORADetails-ChangeFailureRate.json index 8048b282b1f..87e3b9779a0 100644 --- a/grafana/dashboards/DORADetails-ChangeFailureRate.json +++ b/grafana/dashboards/DORADetails-ChangeFailureRate.json @@ -627,7 +627,7 @@ "metricColumn": "none", "queryType": "randomWalk", "rawQuery": true, - "rawSql": "with _deployments as(\n select\n distinct d.cicd_deployment_id as deployment_id,\n d.result,\n d.environment,\n d.finished_date,\n d.cicd_scope_id,\n pm.project_name\n from\n cicd_deployment_commits d\n join project_mapping pm on d.cicd_scope_id = pm.row_id\n and pm.`table` = 'cicd_scopes'\n where\n -- only result needs to specified, not envioronment\n d.result = 'SUCCESS' -- choose your project_name\n and pm.project_name in ($project)\n and $__timeFilter(d.finished_date)\n),\n_incidents as(\n select\n distinct i.id as issue_id,\n i.created_date,\n pm.project_name\n from\n incidents i\n join project_mapping pm on i.scope_id = pm.row_id\n and i.`table` = pm.`table`\n where\n -- choose your project_name\n pm.project_name in ($project)\n and $__timeFilter(i.created_date)\n)\nselect\n finished_date as 'Time (Ascending)',\n deployment_id as 'Entity ID',\n 'DEPLOYMENT' as 'Entity Type (Deployment/Incident)'\nfrom\n _deployments\nunion\nselect\n created_date as 'Time (Ascending)',\n issue_id as 'Entity ID',\n 'INCIDENT' as 'Entity Type (Deployment/Incident)'\nfrom\n _incidents\norder by\n 1", + "rawSql": "with _deployments as(\n select\n distinct d.cicd_deployment_id as deployment_id,\n d.result,\n d.environment,\n d.finished_date,\n d.cicd_scope_id,\n pm.project_name\n from\n cicd_deployment_commits d\n join project_mapping pm on d.cicd_scope_id = pm.row_id\n and pm.`table` = 'cicd_scopes'\n where\n -- only result needs to specified, not environment\n d.result = 'SUCCESS' -- choose your project_name\n and pm.project_name in ($project)\n and $__timeFilter(d.finished_date)\n),\n_incidents as(\n select\n distinct i.id as issue_id,\n i.created_date,\n pm.project_name\n from\n incidents i\n join project_mapping pm on i.scope_id = pm.row_id\n and i.`table` = pm.`table`\n where\n -- choose your project_name\n pm.project_name in ($project)\n and $__timeFilter(i.created_date)\n)\nselect\n finished_date as 'Time (Ascending)',\n deployment_id as 'Entity ID',\n 'DEPLOYMENT' as 'Entity Type (Deployment/Incident)'\nfrom\n _deployments\nunion\nselect\n created_date as 'Time (Ascending)',\n issue_id as 'Entity ID',\n 'INCIDENT' as 'Entity Type (Deployment/Incident)'\nfrom\n _incidents\norder by\n 1", "refId": "A", "select": [ [ diff --git a/grafana/dashboards/DemoHowFastDoWeRespondToCustomerRequirements.json b/grafana/dashboards/DemoHowFastDoWeRespondToCustomerRequirements.json index 5a4b1ccfadb..c15b08cafbe 100644 --- a/grafana/dashboards/DemoHowFastDoWeRespondToCustomerRequirements.json +++ b/grafana/dashboards/DemoHowFastDoWeRespondToCustomerRequirements.json @@ -169,7 +169,7 @@ }, "id": 101, "options": { - "content": "
\n \"Merico\"\n

MARI Guide - Requirement Lead Time

\n
\n\nSection | Description\n:----------------- | :-------------\nMetric Definition | Total duration of requirements from proposal to delivery. It can be divided by flow status in the practice domain or project management system to count the time share of each phase and help locate the links that drag out the requirement delivery cycle.\nMetric Value | The Requirement Lead Time reflects the rapid responsiveness of the R&D team.
In theory, the faster you can deliver value to customers, the better, but other aspects such as whether the delivered value meets customer expectations, requirement throughput, and delivery quality must be considered together. Fast delivery does not necessarily equate to good R&D practices.\n\n***\n#### *M (Measure)*\n1. Count the average or 80th percentile requiremnt lead time for different times.\n2. Counts the average or 80th percentile requiremnt lead time for different projects.
\n3. Count the length of time that requirements stay in different practice domains (requirements analysis, design, development, testing, release) or in different states.\n\n##### *A (Analyze)*\n1. Compare the requirement delivery speed of different projects to find the fastest and slowest delivering projects.\n2. Analyze the trend of the average requirement lead time within each cycle, make a vertical comparison, and locate the key points such as maximum value, minimum value, continuous up cycle, and continuous down cycle.\n3. Analyze the trend of the delivery cycle of 80% of the requirements within each cycle, make a longitudinal comparison, and locate the key points such as maximum value, minimum value, continuous up cycle, and continuous down cycle.

\nWhy choose the 80% quantile instead of using the average?
\nThe point of statistics is to make predictions with real and valid data to support better decisions, while the mean and median cannot have the role of supporting predictions.
\nTypically, the mean and 80% quantile statistics will appear twice as far apart, and the 80% and 99% quantile tend to be approximately twice as related.
\nTherefore, the 80% quantile is a good balance point for prediction.\n
\n4. Analysis compares the length of time requirement stays in different practice domains or different states to identify the most time-consuming links and find the key bottlenecks that affect overall delivery speed.\n5. Requirement lead time is correlated with requirement throughput to identify whether the requirement delivery trend is healthy or not.\n - Healthy trend: requirement lead time is shortened and requirement throughput is increased.\n - Unhealthy trend: longer requirement lead time and lower requirement throughput.\n\n\n##### *R (Review)*\nBased on the analysis results, focus on a few key points and use Ishikawa diagram (fishbone diagram) or Root Cause Analysis (RCA) to conduct root cause analysis, research and review. For example, if the requirement delivery cycle becomes longer in several consecutive statistical cycles, it is necessary to further investigate the length of stay of requirements in different phases and find the longest phase for root cause analysis.\n\n1. The requirements phase takes too long: unclear requirements, frequent changes, overly granular requirements, requirements priorities not clearly defined, insufficient resources or experience of requirements analysts or product managers?\n2. The design phase takes too long: unclear requirement documents, insufficient resources or experience of R&D leaders or architects?\n3. The development phase takes too long: unclear design documents, uneven task distribution, high stream load (parallel tasks), too much technical debt, too many bugs, insufficient resources or experience of developers?\n4. The testing phase takes too long: unclear requirements documentation, poor code quality, few automated tests, insufficient resources or experience of testers?\n5. The release phase takes too long: too long build or deployment time, insufficient resources or experience of operation and maintenance staff?\n\n##### *I (Improve)*\nBased on the review results, focus on the key root causes, and give targeted improvement measures in terms of norms, processes, tools and behaviors, etc., with clear improvement targets, improvement measures, verification cycles and responsible persons.\n\nThe following are the improvement ideas for reference:\n\n1. Communicate with customers or business parties to clarify requirements, reasonably disassemble requirements and define priorities, and invite business parties, R&D leaders and testing leaders to review requirements.\n2. Invite product managers, R&D personnel, and test leaders to conduct design reviews.\n3. Reduce requirement or task granularity, distribute tasks evenly, reduce flow load, increase unit testing, and solve technical debt and code problems in time to reduce the number of bugs and rework.\n4. Test left, develop self-test, code review, increase automated testing, and improve continuous integration capabilities.\n5. Automate deployment, shorten build time, and improve continuous delivery.\n6. Reasonable resource allocation and necessary training for each job holder.\n7. The improvement results should also be quantifiable to facilitate continuous metrics and tracking of improvement effects.", + "content": "
\n \"Merico\"\n

MARI Guide - Requirement Lead Time

\n
\n\nSection | Description\n:----------------- | :-------------\nMetric Definition | Total duration of requirements from proposal to delivery. It can be divided by flow status in the practice domain or project management system to count the time share of each phase and help locate the links that drag out the requirement delivery cycle.\nMetric Value | The Requirement Lead Time reflects the rapid responsiveness of the R&D team.
In theory, the faster you can deliver value to customers, the better, but other aspects such as whether the delivered value meets customer expectations, requirement throughput, and delivery quality must be considered together. Fast delivery does not necessarily equate to good R&D practices.\n\n***\n#### *M (Measure)*\n1. Count the average or 80th percentile requirement lead time for different times.\n2. Counts the average or 80th percentile requirement lead time for different projects.
\n3. Count the length of time that requirements stay in different practice domains (requirements analysis, design, development, testing, release) or in different states.\n\n##### *A (Analyze)*\n1. Compare the requirement delivery speed of different projects to find the fastest and slowest delivering projects.\n2. Analyze the trend of the average requirement lead time within each cycle, make a vertical comparison, and locate the key points such as maximum value, minimum value, continuous up cycle, and continuous down cycle.\n3. Analyze the trend of the delivery cycle of 80% of the requirements within each cycle, make a longitudinal comparison, and locate the key points such as maximum value, minimum value, continuous up cycle, and continuous down cycle.

\nWhy choose the 80% quantile instead of using the average?
\nThe point of statistics is to make predictions with real and valid data to support better decisions, while the mean and median cannot have the role of supporting predictions.
\nTypically, the mean and 80% quantile statistics will appear twice as far apart, and the 80% and 99% quantile tend to be approximately twice as related.
\nTherefore, the 80% quantile is a good balance point for prediction.\n
\n4. Analysis compares the length of time requirement stays in different practice domains or different states to identify the most time-consuming links and find the key bottlenecks that affect overall delivery speed.\n5. Requirement lead time is correlated with requirement throughput to identify whether the requirement delivery trend is healthy or not.\n - Healthy trend: requirement lead time is shortened and requirement throughput is increased.\n - Unhealthy trend: longer requirement lead time and lower requirement throughput.\n\n\n##### *R (Review)*\nBased on the analysis results, focus on a few key points and use Ishikawa diagram (fishbone diagram) or Root Cause Analysis (RCA) to conduct root cause analysis, research and review. For example, if the requirement delivery cycle becomes longer in several consecutive statistical cycles, it is necessary to further investigate the length of stay of requirements in different phases and find the longest phase for root cause analysis.\n\n1. The requirements phase takes too long: unclear requirements, frequent changes, overly granular requirements, requirements priorities not clearly defined, insufficient resources or experience of requirements analysts or product managers?\n2. The design phase takes too long: unclear requirement documents, insufficient resources or experience of R&D leaders or architects?\n3. The development phase takes too long: unclear design documents, uneven task distribution, high stream load (parallel tasks), too much technical debt, too many bugs, insufficient resources or experience of developers?\n4. The testing phase takes too long: unclear requirements documentation, poor code quality, few automated tests, insufficient resources or experience of testers?\n5. The release phase takes too long: too long build or deployment time, insufficient resources or experience of operation and maintenance staff?\n\n##### *I (Improve)*\nBased on the review results, focus on the key root causes, and give targeted improvement measures in terms of norms, processes, tools and behaviors, etc., with clear improvement targets, improvement measures, verification cycles and responsible persons.\n\nThe following are the improvement ideas for reference:\n\n1. Communicate with customers or business parties to clarify requirements, reasonably disassemble requirements and define priorities, and invite business parties, R&D leaders and testing leaders to review requirements.\n2. Invite product managers, R&D personnel, and test leaders to conduct design reviews.\n3. Reduce requirement or task granularity, distribute tasks evenly, reduce flow load, increase unit testing, and solve technical debt and code problems in time to reduce the number of bugs and rework.\n4. Test left, develop self-test, code review, increase automated testing, and improve continuous integration capabilities.\n5. Automate deployment, shorten build time, and improve continuous delivery.\n6. Reasonable resource allocation and necessary training for each job holder.\n7. The improvement results should also be quantifiable to facilitate continuous metrics and tracking of improvement effects.", "mode": "markdown" }, "pluginVersion": "8.0.6", From d06e6b9440a3d170537451357c546e8b46903023 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sat, 21 Mar 2026 10:08:42 +0800 Subject: [PATCH 20/38] feat(q-dev): enrich logging fields, separate dashboards, add E2E tests (#8786) * feat(q-dev): enrich logging fields, separate dashboards by data source, add E2E tests - Add new fields to chat_log: CodeReferenceCount, WebLinkCount, HasFollowupPrompts (from codeReferenceEvents, supplementaryWebLinksEvent, followupPrompts in JSON) - Add new fields to completion_log: LeftContextLength, RightContextLength (from leftContext/rightContext in JSON) - Update s3_logging_extractor to parse and populate new fields - Add migration script 20260319_add_logging_fields - Create qdev_feature_metrics dashboard for legacy by_user_analytic data - Reorganize qdev_executive dashboard with Row dividers labeling data sources and cross-dashboard navigation links - Enrich qdev_logging dashboard with new panels: Chat Trigger Type Distribution, Response Enrichment Breakdown, Completion Context Size Trends, Response Enrichment Trends - Fix SQL compatibility with only_full_group_by mode in executive dashboard (Weekly Active Users Trend, New vs Returning Users) - Fix Steering Adoption stat panel returning string instead of numeric value - Add Playwright E2E test covering full pipeline flow and dashboard verification * fix: add Apache license headers to e2e files, fix gofmt alignment --- backend/plugins/q_dev/models/chat_log.go | 3 + .../plugins/q_dev/models/completion_log.go | 22 +- .../20260319_add_logging_fields.go | 45 + .../migrationscripts/archived/chat_log.go | 3 + .../archived/completion_log.go | 22 +- .../q_dev/models/migrationscripts/register.go | 1 + .../q_dev/tasks/s3_logging_extractor.go | 32 +- e2e/package.json | 16 + e2e/playwright.config.ts | 39 + e2e/qdev-full-flow.spec.ts | 248 +++++ grafana/dashboards/qdev_executive.json | 438 +++----- grafana/dashboards/qdev_feature_metrics.json | 948 ++++++++++++++++++ grafana/dashboards/qdev_logging.json | 338 ++++++- 13 files changed, 1801 insertions(+), 354 deletions(-) create mode 100644 backend/plugins/q_dev/models/migrationscripts/20260319_add_logging_fields.go create mode 100644 e2e/package.json create mode 100644 e2e/playwright.config.ts create mode 100644 e2e/qdev-full-flow.spec.ts create mode 100644 grafana/dashboards/qdev_feature_metrics.json diff --git a/backend/plugins/q_dev/models/chat_log.go b/backend/plugins/q_dev/models/chat_log.go index 06679c515b6..6b39bffa4de 100644 --- a/backend/plugins/q_dev/models/chat_log.go +++ b/backend/plugins/q_dev/models/chat_log.go @@ -44,6 +44,9 @@ type QDevChatLog struct { ActiveFileExtension string `gorm:"type:varchar(50)" json:"activeFileExtension"` HasSteering bool `json:"hasSteering"` IsSpecMode bool `json:"isSpecMode"` + CodeReferenceCount int `json:"codeReferenceCount"` + WebLinkCount int `json:"webLinkCount"` + HasFollowupPrompts bool `json:"hasFollowupPrompts"` } func (QDevChatLog) TableName() string { diff --git a/backend/plugins/q_dev/models/completion_log.go b/backend/plugins/q_dev/models/completion_log.go index 0d0e0404ce8..00a1b471f13 100644 --- a/backend/plugins/q_dev/models/completion_log.go +++ b/backend/plugins/q_dev/models/completion_log.go @@ -26,16 +26,18 @@ import ( // QDevCompletionLog stores parsed data from GenerateCompletions logging events type QDevCompletionLog struct { common.NoPKModel - ConnectionId uint64 `gorm:"primaryKey"` - ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` - RequestId string `gorm:"primaryKey;type:varchar(255)" json:"requestId"` - UserId string `gorm:"index;type:varchar(255)" json:"userId"` - DisplayName string `gorm:"type:varchar(255)" json:"displayName"` - Timestamp time.Time `gorm:"index" json:"timestamp"` - FileName string `gorm:"type:varchar(512)" json:"fileName"` - FileExtension string `gorm:"type:varchar(50)" json:"fileExtension"` - HasCustomization bool `json:"hasCustomization"` - CompletionsCount int `json:"completionsCount"` + ConnectionId uint64 `gorm:"primaryKey"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + RequestId string `gorm:"primaryKey;type:varchar(255)" json:"requestId"` + UserId string `gorm:"index;type:varchar(255)" json:"userId"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` + Timestamp time.Time `gorm:"index" json:"timestamp"` + FileName string `gorm:"type:varchar(512)" json:"fileName"` + FileExtension string `gorm:"type:varchar(50)" json:"fileExtension"` + HasCustomization bool `json:"hasCustomization"` + CompletionsCount int `json:"completionsCount"` + LeftContextLength int `json:"leftContextLength"` + RightContextLength int `json:"rightContextLength"` } func (QDevCompletionLog) TableName() string { diff --git a/backend/plugins/q_dev/models/migrationscripts/20260319_add_logging_fields.go b/backend/plugins/q_dev/models/migrationscripts/20260319_add_logging_fields.go new file mode 100644 index 00000000000..f98c3d1066f --- /dev/null +++ b/backend/plugins/q_dev/models/migrationscripts/20260319_add_logging_fields.go @@ -0,0 +1,45 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/helpers/migrationhelper" + "github.com/apache/incubator-devlake/plugins/q_dev/models/migrationscripts/archived" +) + +var _ = (*addLoggingFields)(nil) + +type addLoggingFields struct{} + +func (*addLoggingFields) Up(basicRes context.BasicRes) errors.Error { + return migrationhelper.AutoMigrateTables( + basicRes, + &archived.QDevChatLog{}, + &archived.QDevCompletionLog{}, + ) +} + +func (*addLoggingFields) Version() uint64 { + return 20260319000001 +} + +func (*addLoggingFields) Name() string { + return "Add code_reference_count, web_link_count, has_followup_prompts to chat_log; left/right_context_length to completion_log" +} diff --git a/backend/plugins/q_dev/models/migrationscripts/archived/chat_log.go b/backend/plugins/q_dev/models/migrationscripts/archived/chat_log.go index 8278f52ff1e..ee7d10a1e87 100644 --- a/backend/plugins/q_dev/models/migrationscripts/archived/chat_log.go +++ b/backend/plugins/q_dev/models/migrationscripts/archived/chat_log.go @@ -43,6 +43,9 @@ type QDevChatLog struct { ActiveFileExtension string `gorm:"type:varchar(50)" json:"activeFileExtension"` HasSteering bool `json:"hasSteering"` IsSpecMode bool `json:"isSpecMode"` + CodeReferenceCount int `json:"codeReferenceCount"` + WebLinkCount int `json:"webLinkCount"` + HasFollowupPrompts bool `json:"hasFollowupPrompts"` } func (QDevChatLog) TableName() string { diff --git a/backend/plugins/q_dev/models/migrationscripts/archived/completion_log.go b/backend/plugins/q_dev/models/migrationscripts/archived/completion_log.go index 035c13ef2e0..4acff956978 100644 --- a/backend/plugins/q_dev/models/migrationscripts/archived/completion_log.go +++ b/backend/plugins/q_dev/models/migrationscripts/archived/completion_log.go @@ -25,16 +25,18 @@ import ( type QDevCompletionLog struct { archived.NoPKModel - ConnectionId uint64 `gorm:"primaryKey"` - ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` - RequestId string `gorm:"primaryKey;type:varchar(255)" json:"requestId"` - UserId string `gorm:"index;type:varchar(255)" json:"userId"` - DisplayName string `gorm:"type:varchar(255)" json:"displayName"` - Timestamp time.Time `gorm:"index" json:"timestamp"` - FileName string `gorm:"type:varchar(512)" json:"fileName"` - FileExtension string `gorm:"type:varchar(50)" json:"fileExtension"` - HasCustomization bool `json:"hasCustomization"` - CompletionsCount int `json:"completionsCount"` + ConnectionId uint64 `gorm:"primaryKey"` + ScopeId string `gorm:"primaryKey;type:varchar(255)" json:"scopeId"` + RequestId string `gorm:"primaryKey;type:varchar(255)" json:"requestId"` + UserId string `gorm:"index;type:varchar(255)" json:"userId"` + DisplayName string `gorm:"type:varchar(255)" json:"displayName"` + Timestamp time.Time `gorm:"index" json:"timestamp"` + FileName string `gorm:"type:varchar(512)" json:"fileName"` + FileExtension string `gorm:"type:varchar(50)" json:"fileExtension"` + HasCustomization bool `json:"hasCustomization"` + CompletionsCount int `json:"completionsCount"` + LeftContextLength int `json:"leftContextLength"` + RightContextLength int `json:"rightContextLength"` } func (QDevCompletionLog) TableName() string { diff --git a/backend/plugins/q_dev/models/migrationscripts/register.go b/backend/plugins/q_dev/models/migrationscripts/register.go index 5480d5eaf29..8b5de0bcc16 100644 --- a/backend/plugins/q_dev/models/migrationscripts/register.go +++ b/backend/plugins/q_dev/models/migrationscripts/register.go @@ -36,5 +36,6 @@ func All() []plugin.MigrationScript { new(fixDedupUserTables), new(resetS3FileMetaProcessed), new(addLoggingTables), + new(addLoggingFields), } } diff --git a/backend/plugins/q_dev/tasks/s3_logging_extractor.go b/backend/plugins/q_dev/tasks/s3_logging_extractor.go index df55a663b13..3fa771789a1 100644 --- a/backend/plugins/q_dev/tasks/s3_logging_extractor.go +++ b/backend/plugins/q_dev/tasks/s3_logging_extractor.go @@ -280,10 +280,13 @@ type chatLogRequest struct { type chatLogResponse struct { RequestID string `json:"requestId"` AssistantResponse string `json:"assistantResponse"` + FollowupPrompts string `json:"followupPrompts"` MessageMetadata struct { ConversationID *string `json:"conversationId"` UtteranceID *string `json:"utteranceId"` } `json:"messageMetadata"` + CodeReferenceEvents []json.RawMessage `json:"codeReferenceEvents"` + SupplementaryWebLinksEvent []json.RawMessage `json:"supplementaryWebLinksEvent"` } type completionLogRecord struct { @@ -296,6 +299,8 @@ type completionLogRequest struct { Timestamp string `json:"timeStamp"` FileName string `json:"fileName"` CustomizationArn *string `json:"customizationArn"` + LeftContext string `json:"leftContext"` + RightContext string `json:"rightContext"` } type completionLogResponse struct { @@ -347,6 +352,11 @@ func parseChatRecord(raw json.RawMessage, fileMeta *models.QDevS3FileMeta, ident chatLog.UtteranceId = *record.Response.MessageMetadata.UtteranceID } + // New fields from docs: codeReferenceEvents, supplementaryWebLinksEvent, followupPrompts + chatLog.CodeReferenceCount = len(record.Response.CodeReferenceEvents) + chatLog.WebLinkCount = len(record.Response.SupplementaryWebLinksEvent) + chatLog.HasFollowupPrompts = record.Response.FollowupPrompts != "" + return chatLog, nil } @@ -406,16 +416,18 @@ func parseCompletionRecord(raw json.RawMessage, fileMeta *models.QDevS3FileMeta, userId := normalizeUserId(record.Request.UserID) return &models.QDevCompletionLog{ - ConnectionId: fileMeta.ConnectionId, - ScopeId: fileMeta.ScopeId, - RequestId: record.Response.RequestID, - UserId: userId, - DisplayName: cachedResolveDisplayName(userId, identityClient, cache), - Timestamp: ts, - FileName: record.Request.FileName, - FileExtension: filepath.Ext(record.Request.FileName), - HasCustomization: record.Request.CustomizationArn != nil && *record.Request.CustomizationArn != "", - CompletionsCount: len(record.Response.Completions), + ConnectionId: fileMeta.ConnectionId, + ScopeId: fileMeta.ScopeId, + RequestId: record.Response.RequestID, + UserId: userId, + DisplayName: cachedResolveDisplayName(userId, identityClient, cache), + Timestamp: ts, + FileName: record.Request.FileName, + FileExtension: filepath.Ext(record.Request.FileName), + HasCustomization: record.Request.CustomizationArn != nil && *record.Request.CustomizationArn != "", + CompletionsCount: len(record.Response.Completions), + LeftContextLength: len(record.Request.LeftContext), + RightContextLength: len(record.Request.RightContext), }, nil } diff --git a/e2e/package.json b/e2e/package.json new file mode 100644 index 00000000000..af179c7b6e7 --- /dev/null +++ b/e2e/package.json @@ -0,0 +1,16 @@ +{ + "name": "e2e", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "dependencies": { + "@playwright/test": "^1.58.2" + } +} diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts new file mode 100644 index 00000000000..d4006283687 --- /dev/null +++ b/e2e/playwright.config.ts @@ -0,0 +1,39 @@ +/* +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. +*/ + +import { defineConfig } from '@playwright/test'; + +export default defineConfig({ + testDir: '.', + testMatch: '*.spec.ts', + timeout: 180000, + expect: { + timeout: 10000, + }, + use: { + baseURL: 'http://localhost:4000', + screenshot: 'on', + trace: 'on-first-retry', + }, + reporter: [['html', { open: 'never' }], ['list']], + projects: [ + { + name: 'chromium', + use: { browserName: 'chromium', viewport: { width: 1440, height: 900 } }, + }, + ], +}); diff --git a/e2e/qdev-full-flow.spec.ts b/e2e/qdev-full-flow.spec.ts new file mode 100644 index 00000000000..0498df67baa --- /dev/null +++ b/e2e/qdev-full-flow.spec.ts @@ -0,0 +1,248 @@ +/* +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. +*/ + +import { test, expect, request, Page } from '@playwright/test'; +import * as path from 'path'; +import * as fs from 'fs'; + +const API = 'http://localhost:8080'; +const UI = 'http://localhost:4000'; +const GRAFANA = 'http://localhost:3002'; +const SCREENSHOT_DIR = path.join(__dirname, 'screenshots'); + +// Use existing connection with valid credentials +const EXISTING_CONNECTION_ID = 5; + +const state: { + connectionId: number; + scopeId: string; + blueprintId: number; + pipelineId: number; +} = { connectionId: EXISTING_CONNECTION_ID, scopeId: '', blueprintId: 0, pipelineId: 0 }; + +fs.mkdirSync(SCREENSHOT_DIR, { recursive: true }); + +async function grafanaLogin(page: Page) { + await page.goto(`${GRAFANA}/grafana/login`); + await page.waitForLoadState('networkidle'); + if (page.url().includes('/login')) { + await page.locator('input[name="user"]').fill('admin'); + await page.locator('input[name="password"]').fill('admin'); + await page.locator('button[type="submit"]').click(); + await page.waitForTimeout(2000); + // Handle "change password" prompt if shown + const skipBtn = page.locator('a:has-text("Skip")'); + if (await skipBtn.isVisible({ timeout: 2000 }).catch(() => false)) { + await skipBtn.click(); + } + await page.waitForTimeout(1000); + } +} + +async function openGrafanaDashboard(page: Page, uid: string, screenshotPath: string) { + await grafanaLogin(page); + await page.goto(`${GRAFANA}/grafana/d/${uid}?orgId=1&from=now-90d&to=now`); + + // Wait for first panel data to load + try { + await page.waitForResponse( + (resp) => resp.url().includes('/api/ds/query') && resp.status() === 200, + { timeout: 30000 } + ); + } catch { /* some dashboards may not fire queries immediately */ } + + // Wait for rendering to settle + await page.waitForTimeout(5000); + + // Take viewport screenshot (top section) + await page.screenshot({ path: screenshotPath.replace('.png', '-top.png') }); + + // Scroll down and take more sections + const scrollHeight = await page.evaluate(() => document.body.scrollHeight); + let section = 1; + for (let y = 900; y < scrollHeight; y += 900) { + await page.evaluate((scrollY) => window.scrollTo(0, scrollY), y); + await page.waitForTimeout(3000); + section++; + await page.screenshot({ path: screenshotPath.replace('.png', `-section${section}.png`) }); + } + + // Also take full page screenshot + await page.evaluate(() => window.scrollTo(0, 0)); + await page.waitForTimeout(2000); + await page.screenshot({ path: screenshotPath, fullPage: true }); +} + +test.describe.serial('Q-Dev Plugin Full Flow', () => { + + test('Step 1: Verify Existing Connection via API', async () => { + const api = await request.newContext({ baseURL: API }); + + const resp = await api.get(`/plugins/q_dev/connections/${state.connectionId}`); + expect(resp.ok()).toBeTruthy(); + const conn = await resp.json(); + console.log(`Using connection: id=${conn.id}, name=${conn.name}, bucket=${conn.bucket}`); + + const testResp = await api.post(`/plugins/q_dev/connections/${state.connectionId}/test`); + const testBody = await testResp.json(); + console.log('Test connection:', testBody.success ? 'OK' : testBody.message); + expect(testResp.ok()).toBeTruthy(); + }); + + test('Step 2: View Config-UI Home', async ({ page }) => { + await page.goto(UI); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(1000); + await page.screenshot({ path: path.join(SCREENSHOT_DIR, '01-config-ui-home.png'), fullPage: true }); + console.log('Screenshot: Config-UI home'); + }); + + test('Step 3: Create Scope (S3 Slice) via API', async () => { + const api = await request.newContext({ baseURL: API }); + + const resp = await api.put(`/plugins/q_dev/connections/${state.connectionId}/scopes`, { + data: { + data: [ + { + accountId: '034362076319', + basePath: '', + year: 2026, + month: 3, + }, + ], + }, + }); + + const body = await resp.json(); + console.log('Scope created:', resp.status()); + expect(resp.ok()).toBeTruthy(); + state.scopeId = body[0]?.id; + expect(state.scopeId).toBeTruthy(); + console.log(`Scope id: ${state.scopeId}`); + }); + + test('Step 4: Create Blueprint via API', async () => { + const api = await request.newContext({ baseURL: API }); + + const resp = await api.post('/blueprints', { + data: { + name: `e2e-blueprint-${Date.now()}`, + mode: 'NORMAL', + enable: true, + cronConfig: '0 0 * * *', + isManual: true, + connections: [ + { + pluginName: 'q_dev', + connectionId: state.connectionId, + scopes: [{ scopeId: state.scopeId }], + }, + ], + }, + }); + + const body = await resp.json(); + expect(resp.ok()).toBeTruthy(); + state.blueprintId = body.id; + console.log(`Blueprint created: id=${state.blueprintId}`); + }); + + test('Step 5: Trigger Pipeline via API', async () => { + const api = await request.newContext({ baseURL: API }); + + const resp = await api.post(`/blueprints/${state.blueprintId}/trigger`, { data: {} }); + const body = await resp.json(); + expect(resp.ok()).toBeTruthy(); + state.pipelineId = body.id; + console.log(`Pipeline triggered: id=${state.pipelineId}`); + }); + + test('Step 6: Wait for Pipeline to Complete', async () => { + const api = await request.newContext({ baseURL: API }); + const maxWait = 120000; + const start = Date.now(); + let status = ''; + + while (Date.now() - start < maxWait) { + const resp = await api.get(`/pipelines/${state.pipelineId}`); + const pipeline = await resp.json(); + status = pipeline.status; + console.log(`Pipeline status: ${status} (${Math.round((Date.now() - start) / 1000)}s)`); + if (['TASK_COMPLETED', 'TASK_FAILED', 'TASK_PARTIAL'].includes(status)) break; + await new Promise((r) => setTimeout(r, 3000)); + } + + // Print task details + const tasksResp = await api.get(`/pipelines/${state.pipelineId}/tasks`); + if (tasksResp.ok()) { + const { tasks } = await tasksResp.json(); + for (const t of tasks || []) { + console.log(` Task ${t.id}: ${t.status}${t.failedSubTask ? ` (failed: ${t.failedSubTask})` : ''}`); + if (t.message) console.log(` Error: ${t.message.substring(0, 300)}`); + } + } + + expect(status).toBe('TASK_COMPLETED'); + }); + + test('Step 7: Verify Data via MySQL', async () => { + const api = await request.newContext({ baseURL: API }); + + // Use pipeline tasks to confirm data was processed + const tasksResp = await api.get(`/pipelines/${state.pipelineId}/tasks`); + const { tasks } = await tasksResp.json(); + expect(tasks[0].status).toBe('TASK_COMPLETED'); + console.log(`Pipeline completed in ${tasks[0].spentSeconds}s`); + }); + + test('Step 8: Grafana - Kiro Usage Dashboard (new format)', async ({ page }) => { + await openGrafanaDashboard(page, 'qdev_user_report', path.join(SCREENSHOT_DIR, '02-dashboard-user-report.png')); + console.log('Screenshot: Kiro Usage Dashboard'); + }); + + test('Step 9: Grafana - Kiro Legacy Feature Metrics', async ({ page }) => { + await openGrafanaDashboard(page, 'qdev_feature_metrics', path.join(SCREENSHOT_DIR, '03-dashboard-feature-metrics.png')); + console.log('Screenshot: Kiro Legacy Feature Metrics'); + }); + + test('Step 10: Grafana - Kiro AI Activity Insights (logging)', async ({ page }) => { + await openGrafanaDashboard(page, 'qdev_logging', path.join(SCREENSHOT_DIR, '04-dashboard-logging.png')); + console.log('Screenshot: Kiro AI Activity Insights'); + }); + + test('Step 11: Grafana - Kiro Executive Dashboard', async ({ page }) => { + await openGrafanaDashboard(page, 'qdev_executive', path.join(SCREENSHOT_DIR, '05-dashboard-executive.png')); + console.log('Screenshot: Kiro Executive Dashboard'); + }); + + test('Step 12: View Pipeline in Config-UI', async ({ page }) => { + // Navigate to the API proxy route for pipelines + await page.goto(`${UI}/api/pipelines?pageSize=5`); + await page.waitForLoadState('networkidle'); + await page.screenshot({ path: path.join(SCREENSHOT_DIR, '06-config-ui-pipelines.png'), fullPage: true }); + console.log('Screenshot: Pipelines API response'); + }); + + test('Step 13: Cleanup', async () => { + const api = await request.newContext({ baseURL: API }); + if (state.blueprintId) { + await api.delete(`/blueprints/${state.blueprintId}`); + console.log(`Deleted blueprint ${state.blueprintId}`); + } + console.log('Cleanup complete'); + }); +}); diff --git a/grafana/dashboards/qdev_executive.json b/grafana/dashboards/qdev_executive.json index c6e2524d70b..df36a6c9e0e 100644 --- a/grafana/dashboards/qdev_executive.json +++ b/grafana/dashboards/qdev_executive.json @@ -16,11 +16,61 @@ "fiscalYearStartMonth": 0, "graphTooltip": 0, "id": null, - "links": [], + "links": [ + { + "asDropdown": false, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [], + "targetBlank": true, + "title": "Usage (New)", + "tooltip": "Kiro Usage Dashboard - Credits & Messages (new format)", + "type": "link", + "url": "/d/qdev_user_report" + }, + { + "asDropdown": false, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [], + "targetBlank": true, + "title": "Feature Metrics (Legacy)", + "tooltip": "Kiro Legacy Feature Metrics (old format)", + "type": "link", + "url": "/d/qdev_feature_metrics" + }, + { + "asDropdown": false, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [], + "targetBlank": true, + "title": "Prompt Logging", + "tooltip": "Kiro AI Activity Insights - Prompt Logging", + "type": "link", + "url": "/d/qdev_logging" + } + ], "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 100, + "panels": [], + "title": "KPI Overview (cross-source)", + "type": "row" + }, { "datasource": "mysql", - "description": "Distinct users with chat activity in the last 7 days", + "description": "Distinct users with chat activity in the last 7 days (from prompt logging)", "fieldConfig": { "defaults": { "color": { @@ -42,7 +92,7 @@ "h": 6, "w": 6, "x": 0, - "y": 0 + "y": 1 }, "id": 1, "options": { @@ -74,12 +124,12 @@ "refId": "A" } ], - "title": "Weekly Active Users", + "title": "Weekly Active Users (logging)", "type": "stat" }, { "datasource": "mysql", - "description": "Average credits spent per accepted line of code", + "description": "Average credits spent per accepted line of code (new report + legacy metrics)", "fieldConfig": { "defaults": { "color": { @@ -101,7 +151,7 @@ "h": 6, "w": 6, "x": 6, - "y": 0 + "y": 1 }, "id": 2, "options": { @@ -133,12 +183,12 @@ "refId": "A" } ], - "title": "Credits Efficiency", + "title": "Credits Efficiency (new + legacy)", "type": "stat" }, { "datasource": "mysql", - "description": "Percentage of inline suggestions accepted", + "description": "Percentage of inline suggestions accepted (from legacy feature metrics)", "fieldConfig": { "defaults": { "color": { @@ -160,7 +210,7 @@ "h": 6, "w": 6, "x": 12, - "y": 0 + "y": 1 }, "id": 3, "options": { @@ -192,12 +242,12 @@ "refId": "A" } ], - "title": "Inline Acceptance Rate", + "title": "Inline Acceptance Rate (legacy)", "type": "stat" }, { "datasource": "mysql", - "description": "Percentage of users using steering rules", + "description": "Percentage of users who used steering rules (from prompt logging)", "fieldConfig": { "defaults": { "color": { @@ -211,7 +261,8 @@ "color": "green" } ] - } + }, + "unit": "percent" }, "overrides": [] }, @@ -219,7 +270,7 @@ "h": 6, "w": 6, "x": 18, - "y": 0 + "y": 1 }, "id": 4, "options": { @@ -247,16 +298,29 @@ "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT CONCAT(ROUND(COUNT(DISTINCT CASE WHEN has_steering = 1 THEN user_id END) / NULLIF(COUNT(DISTINCT user_id), 0) * 100, 0), '%') as 'Users with Steering'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)", + "rawSql": "SELECT ROUND(COUNT(DISTINCT CASE WHEN has_steering = 1 THEN user_id END) / NULLIF(COUNT(DISTINCT user_id), 0) * 100, 0) as 'Steering %'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)", "refId": "A" } ], - "title": "Steering Adoption", + "title": "Steering Adoption (logging)", "type": "stat" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 101, + "panels": [], + "title": "User Engagement (logging data: _tool_q_dev_chat_log)", + "type": "row" + }, { "datasource": "mysql", - "description": "Weekly active user count over time", + "description": "Weekly active user count over time (from prompt logging)", "fieldConfig": { "defaults": { "color": { @@ -312,7 +376,7 @@ "h": 8, "w": 12, "x": 0, - "y": 6 + "y": 8 }, "id": 5, "options": { @@ -339,7 +403,7 @@ "editorMode": "code", "format": "time_series", "rawQuery": true, - "rawSql": "SELECT\n STR_TO_DATE(CONCAT(YEARWEEK(timestamp, 1), ' Monday'), '%X%V %W') as time,\n COUNT(DISTINCT user_id) as 'Active Users'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY YEARWEEK(timestamp, 1)\nORDER BY time", + "rawSql": "SELECT\n STR_TO_DATE(CONCAT(yw, ' Monday'), '%X%V %W') as time,\n COUNT(DISTINCT user_id) as 'Active Users'\nFROM (\n SELECT user_id, YEARWEEK(timestamp, 1) as yw\n FROM lake._tool_q_dev_chat_log\n WHERE $__timeFilter(timestamp)\n) t\nGROUP BY yw\nORDER BY time", "refId": "A" } ], @@ -348,7 +412,7 @@ }, { "datasource": "mysql", - "description": "New vs returning users by week", + "description": "New vs returning users by week (from prompt logging)", "fieldConfig": { "defaults": { "color": { @@ -404,7 +468,7 @@ "h": 8, "w": 12, "x": 12, - "y": 6 + "y": 8 }, "id": 6, "options": { @@ -431,7 +495,7 @@ "editorMode": "code", "format": "time_series", "rawQuery": true, - "rawSql": "SELECT\n week as time,\n SUM(CASE WHEN is_new = 1 THEN 1 ELSE 0 END) as 'New Users',\n SUM(CASE WHEN is_new = 0 THEN 1 ELSE 0 END) as 'Returning Users'\nFROM (\n SELECT\n u.user_id,\n STR_TO_DATE(CONCAT(YEARWEEK(u.timestamp, 1), ' Monday'), '%X%V %W') as week,\n CASE WHEN STR_TO_DATE(CONCAT(YEARWEEK(u.timestamp, 1), ' Monday'), '%X%V %W') = STR_TO_DATE(CONCAT(YEARWEEK(f.first_seen, 1), ' Monday'), '%X%V %W') THEN 1 ELSE 0 END as is_new\n FROM lake._tool_q_dev_chat_log u\n JOIN (SELECT user_id, MIN(timestamp) as first_seen FROM lake._tool_q_dev_chat_log GROUP BY user_id) f ON u.user_id = f.user_id\n WHERE $__timeFilter(u.timestamp)\n GROUP BY u.user_id, YEARWEEK(u.timestamp, 1), f.first_seen\n) weekly\nGROUP BY week\nORDER BY week", + "rawSql": "SELECT\n STR_TO_DATE(CONCAT(yw, ' Monday'), '%X%V %W') as time,\n SUM(CASE WHEN yw = first_yw THEN 1 ELSE 0 END) as 'New Users',\n SUM(CASE WHEN yw != first_yw THEN 1 ELSE 0 END) as 'Returning Users'\nFROM (\n SELECT DISTINCT u.user_id, YEARWEEK(u.timestamp, 1) as yw, f.first_yw\n FROM lake._tool_q_dev_chat_log u\n JOIN (SELECT user_id, YEARWEEK(MIN(timestamp), 1) as first_yw FROM lake._tool_q_dev_chat_log GROUP BY user_id) f\n ON u.user_id = f.user_id\n WHERE $__timeFilter(u.timestamp)\n) weekly\nGROUP BY yw\nORDER BY time", "refId": "A" } ], @@ -439,104 +503,21 @@ "type": "timeseries" }, { - "datasource": "mysql", - "description": "Number of users who used each feature", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.8, - "drawStyle": "bars", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, + "collapsed": false, "gridPos": { - "h": 8, - "w": 12, + "h": 1, + "w": 24, "x": 0, - "y": 14 - }, - "id": 7, - "options": { - "barRadius": 0.1, - "barWidth": 0.8, - "fullHighlight": false, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "orientation": "horizontal", - "showValue": "auto", - "stacking": "none", - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - }, - "xTickLabelRotation": 0 + "y": 16 }, - "pluginVersion": "11.6.2", - "targets": [ - { - "datasource": "mysql", - "editorMode": "code", - "format": "table", - "rawQuery": true, - "rawSql": "SELECT\n 'Chat' as Feature, COUNT(DISTINCT CASE WHEN chat_messages_sent > 0 THEN user_id END) as Users FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Inline Suggestions', COUNT(DISTINCT CASE WHEN inline_suggestions_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Code Fix', COUNT(DISTINCT CASE WHEN code_fix_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Code Review', COUNT(DISTINCT CASE WHEN code_review_succeeded_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Doc Generation', COUNT(DISTINCT CASE WHEN doc_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Test Generation', COUNT(DISTINCT CASE WHEN test_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Dev (Agentic)', COUNT(DISTINCT CASE WHEN dev_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Steering', COUNT(DISTINCT CASE WHEN has_steering = 1 THEN user_id END) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)\nUNION ALL SELECT 'Spec Mode', COUNT(DISTINCT CASE WHEN is_spec_mode = 1 THEN user_id END) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)", - "refId": "A" - } - ], - "title": "Feature Adoption Funnel", - "type": "barchart" + "id": 102, + "panels": [], + "title": "Credits & Subscription (new format: _tool_q_dev_user_report)", + "type": "row" }, { "datasource": "mysql", - "description": "Cumulative credits this month vs projected total", + "description": "Cumulative credits this month vs projected total (from new user_report)", "fieldConfig": { "defaults": { "color": { @@ -591,8 +572,8 @@ "gridPos": { "h": 8, "w": 12, - "x": 12, - "y": 14 + "x": 0, + "y": 17 }, "id": 8, "options": { @@ -628,191 +609,7 @@ }, { "datasource": "mysql", - "description": "Acceptance rates for inline suggestions, code fix, and inline chat over time", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 22 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ - "mean", - "max", - "sum" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "11.6.2", - "targets": [ - { - "datasource": "mysql", - "editorMode": "code", - "format": "time_series", - "rawQuery": true, - "rawSql": "SELECT\n date as time,\n SUM(inline_acceptance_count) / NULLIF(SUM(inline_suggestions_count), 0) as 'Inline Suggestions',\n SUM(code_fix_acceptance_event_count) / NULLIF(SUM(code_fix_generation_event_count), 0) as 'Code Fix',\n SUM(inline_chat_acceptance_event_count) / NULLIF(SUM(inline_chat_total_event_count), 0) as 'Inline Chat'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", - "refId": "A" - } - ], - "title": "Acceptance Rate Trends", - "type": "timeseries" - }, - { - "datasource": "mysql", - "description": "Code review findings and test generation metrics over time", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 22 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ - "mean", - "max", - "sum" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "11.6.2", - "targets": [ - { - "datasource": "mysql", - "editorMode": "code", - "format": "time_series", - "rawQuery": true, - "rawSql": "SELECT\n date as time,\n SUM(code_review_findings_count) as 'Review Findings',\n SUM(test_generation_event_count) as 'Test Gen Events',\n SUM(test_generation_accepted_tests) as 'Tests Accepted'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", - "refId": "A" - } - ], - "title": "Code Review Findings & Test Generation", - "type": "timeseries" - }, - { - "datasource": "mysql", - "description": "Per-user productivity and efficiency metrics", + "description": "Power tier users with no activity in the last 14 days (from new user_report)", "fieldConfig": { "defaults": { "color": { @@ -839,12 +636,12 @@ "overrides": [] }, "gridPos": { - "h": 10, - "w": 24, - "x": 0, - "y": 30 + "h": 8, + "w": 12, + "x": 12, + "y": 17 }, - "id": 11, + "id": 12, "options": { "cellHeight": "sm", "footer": { @@ -865,16 +662,29 @@ "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\n COALESCE(MAX(d.display_name), d.user_id) as 'User',\n COALESCE(MAX(r.subscription_tier), '') as 'Tier',\n ROUND(SUM(r.credits_used), 1) as 'Credits Used',\n SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) as 'Total Accepted Lines',\n CASE WHEN SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) > 0\n THEN ROUND(SUM(r.credits_used) / SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines), 2)\n ELSE NULL END as 'Credits/Line',\n CONCAT(ROUND(SUM(d.inline_acceptance_count) / NULLIF(SUM(d.inline_suggestions_count), 0) * 100, 1), '%') as 'Accept Rate',\n SUM(d.code_review_findings_count) as 'Review Findings',\n SUM(d.test_generation_event_count) as 'Test Gen Events',\n SUM(d.dev_accepted_lines) as 'Agentic Lines',\n MIN(d.date) as 'First Active',\n MAX(d.date) as 'Last Active'\nFROM lake._tool_q_dev_user_data d\nLEFT JOIN (\n SELECT user_id, date, SUM(credits_used) as credits_used, MAX(subscription_tier) as subscription_tier\n FROM lake._tool_q_dev_user_report\n WHERE $__timeFilter(date)\n GROUP BY user_id, date\n) r ON d.user_id = r.user_id AND d.date = r.date\nWHERE $__timeFilter(d.date)\nGROUP BY d.user_id\nORDER BY SUM(r.credits_used) DESC", + "rawSql": "SELECT\n COALESCE(MAX(display_name), user_id) as 'User',\n MAX(subscription_tier) as 'Tier',\n ROUND(SUM(credits_used), 1) as 'Total Credits Used',\n MAX(date) as 'Last Activity'\nFROM lake._tool_q_dev_user_report\nWHERE $__timeFilter(date)\n AND subscription_tier = 'POWER'\nGROUP BY user_id\nHAVING MAX(date) < DATE_SUB(NOW(), INTERVAL 14 DAY)\nORDER BY MAX(date)", "refId": "A" } ], - "title": "User Productivity & Efficiency", + "title": "Idle Power Users (No Activity in 14 Days)", "type": "table" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 103, + "panels": [], + "title": "Cross-Source: User Productivity (new report + legacy metrics)", + "type": "row" + }, { "datasource": "mysql", - "description": "Power tier users with no activity in the last 14 days", + "description": "Per-user productivity combining credits (new format) with feature metrics (legacy). Only shows users present in both data sources.", "fieldConfig": { "defaults": { "color": { @@ -901,12 +711,12 @@ "overrides": [] }, "gridPos": { - "h": 8, + "h": 10, "w": 24, "x": 0, - "y": 40 + "y": 26 }, - "id": 12, + "id": 11, "options": { "cellHeight": "sm", "footer": { @@ -927,11 +737,11 @@ "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\n COALESCE(MAX(display_name), user_id) as 'User',\n MAX(subscription_tier) as 'Tier',\n ROUND(SUM(credits_used), 1) as 'Total Credits Used',\n MAX(date) as 'Last Activity'\nFROM lake._tool_q_dev_user_report\nWHERE $__timeFilter(date)\n AND subscription_tier = 'POWER'\nGROUP BY user_id\nHAVING MAX(date) < DATE_SUB(NOW(), INTERVAL 14 DAY)\nORDER BY MAX(date)", + "rawSql": "SELECT\n COALESCE(MAX(d.display_name), d.user_id) as 'User',\n COALESCE(MAX(r.subscription_tier), '') as 'Tier',\n ROUND(SUM(r.credits_used), 1) as 'Credits Used',\n SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) as 'Total Accepted Lines',\n CASE WHEN SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines) > 0\n THEN ROUND(SUM(r.credits_used) / SUM(d.chat_ai_code_lines + d.inline_ai_code_lines + d.code_fix_accepted_lines + d.dev_accepted_lines), 2)\n ELSE NULL END as 'Credits/Line',\n CONCAT(ROUND(SUM(d.inline_acceptance_count) / NULLIF(SUM(d.inline_suggestions_count), 0) * 100, 1), '%') as 'Accept Rate',\n SUM(d.code_review_findings_count) as 'Review Findings',\n SUM(d.test_generation_event_count) as 'Test Gen Events',\n SUM(d.dev_accepted_lines) as 'Agentic Lines',\n MIN(d.date) as 'First Active',\n MAX(d.date) as 'Last Active'\nFROM lake._tool_q_dev_user_data d\nLEFT JOIN (\n SELECT user_id, date, SUM(credits_used) as credits_used, MAX(subscription_tier) as subscription_tier\n FROM lake._tool_q_dev_user_report\n WHERE $__timeFilter(date)\n GROUP BY user_id, date\n) r ON d.user_id = r.user_id AND d.date = r.date\nWHERE $__timeFilter(d.date)\nGROUP BY d.user_id\nORDER BY SUM(r.credits_used) DESC", "refId": "A" } ], - "title": "Idle Power Users (No Activity in 14 Days)", + "title": "User Productivity & Efficiency", "type": "table" } ], @@ -955,4 +765,4 @@ "title": "Kiro Executive Dashboard", "uid": "qdev_executive", "version": 1 -} \ No newline at end of file +} diff --git a/grafana/dashboards/qdev_feature_metrics.json b/grafana/dashboards/qdev_feature_metrics.json new file mode 100644 index 00000000000..597217bcf0e --- /dev/null +++ b/grafana/dashboards/qdev_feature_metrics.json @@ -0,0 +1,948 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "datasource": "mysql", + "description": "High-level summary of legacy feature-level activity metrics (from by_user_analytic CSV reports)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n COUNT(DISTINCT user_id) as 'Active Users',\n SUM(inline_suggestions_count) as 'Inline Suggestions',\n SUM(inline_acceptance_count) as 'Inline Accepted',\n SUM(chat_messages_sent) as 'Chat Messages',\n SUM(chat_ai_code_lines) as 'Chat AI Lines',\n SUM(code_review_findings_count) as 'Review Findings',\n SUM(test_generation_event_count) as 'Test Gen Events',\n SUM(dev_accepted_lines) as 'Agentic Lines'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)", + "refId": "A" + } + ], + "title": "Legacy Feature Metrics Overview", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 6 + }, + "id": 20, + "panels": [], + "title": "Inline Suggestions", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Daily inline suggestion and acceptance counts", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 7 + }, + "id": 2, + "options": { + "legend": { + "calcs": [ + "mean", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(inline_suggestions_count) as 'Suggestions',\n SUM(inline_acceptance_count) as 'Accepted',\n SUM(inline_ai_code_lines) as 'AI Code Lines'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Inline Suggestions & Acceptance", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Acceptance rates for inline suggestions, code fix, and inline chat over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 7 + }, + "id": 3, + "options": { + "legend": { + "calcs": [ + "mean", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(inline_acceptance_count) / NULLIF(SUM(inline_suggestions_count), 0) as 'Inline Suggestions',\n SUM(code_fix_acceptance_event_count) / NULLIF(SUM(code_fix_generation_event_count), 0) as 'Code Fix',\n SUM(inline_chat_acceptance_event_count) / NULLIF(SUM(inline_chat_total_event_count), 0) as 'Inline Chat'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Acceptance Rate Trends", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 21, + "panels": [], + "title": "Chat & Agentic (Dev)", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Daily chat messages sent and AI-generated code lines from chat", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 4, + "options": { + "legend": { + "calcs": [ + "mean", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(chat_messages_sent) as 'Messages Sent',\n SUM(chat_messages_interacted) as 'Messages Interacted',\n SUM(chat_ai_code_lines) as 'AI Code Lines'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Chat Activity", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Agentic (Dev) code generation and acceptance metrics", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 5, + "options": { + "legend": { + "calcs": [ + "mean", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(dev_generation_event_count) as 'Generation Events',\n SUM(dev_generated_lines) as 'Generated Lines',\n SUM(dev_accepted_lines) as 'Accepted Lines',\n SUM(dev_acceptance_event_count) as 'Acceptance Events'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Agentic (Dev) Activity", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 22, + "panels": [], + "title": "Code Review, Test Gen & Transformations", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Code review findings and test generation metrics over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 25 + }, + "id": 6, + "options": { + "legend": { + "calcs": [ + "mean", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(code_review_findings_count) as 'Review Findings',\n SUM(code_review_succeeded_event_count) as 'Reviews Succeeded',\n SUM(code_review_failed_event_count) as 'Reviews Failed'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Code Review Activity", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Test generation events and acceptance over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 25 + }, + "id": 7, + "options": { + "legend": { + "calcs": [ + "mean", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(test_generation_event_count) as 'Test Gen Events',\n SUM(test_generation_generated_tests) as 'Tests Generated',\n SUM(test_generation_accepted_tests) as 'Tests Accepted',\n SUM(test_generation_generated_lines) as 'Lines Generated',\n SUM(test_generation_accepted_lines) as 'Lines Accepted'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Test Generation Activity", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Doc generation and code transformation events", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 33 + }, + "id": 8, + "options": { + "legend": { + "calcs": [ + "mean", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n date as time,\n SUM(doc_generation_event_count) as 'Doc Gen Events',\n SUM(doc_generation_accepted_line_additions) as 'Doc Lines Accepted',\n SUM(transformation_event_count) as 'Transformation Events',\n SUM(transformation_lines_generated) as 'Transform Lines Generated'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY date\nORDER BY date", + "refId": "A" + } + ], + "title": "Doc Generation & Transformations", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Number of users who used each feature in the selected period", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.8, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 33 + }, + "id": 9, + "options": { + "barRadius": 0.1, + "barWidth": 0.8, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "orientation": "horizontal", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0 + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT 'Chat' as Feature, COUNT(DISTINCT CASE WHEN chat_messages_sent > 0 THEN user_id END) as Users FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Inline Suggestions', COUNT(DISTINCT CASE WHEN inline_suggestions_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Code Fix', COUNT(DISTINCT CASE WHEN code_fix_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Code Review', COUNT(DISTINCT CASE WHEN code_review_succeeded_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Doc Generation', COUNT(DISTINCT CASE WHEN doc_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Test Generation', COUNT(DISTINCT CASE WHEN test_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Dev (Agentic)', COUNT(DISTINCT CASE WHEN dev_generation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)\nUNION ALL SELECT 'Transformation', COUNT(DISTINCT CASE WHEN transformation_event_count > 0 THEN user_id END) FROM lake._tool_q_dev_user_data WHERE $__timeFilter(date)", + "refId": "A" + } + ], + "title": "Feature Adoption (Users per Feature)", + "type": "barchart" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 41 + }, + "id": 23, + "panels": [], + "title": "Per-User Detail", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Per-user breakdown of legacy feature-level metrics", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": true, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 42 + }, + "id": 10, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n COALESCE(MAX(display_name), user_id) as 'User',\n SUM(inline_suggestions_count) as 'Suggestions',\n SUM(inline_acceptance_count) as 'Accepted',\n CONCAT(ROUND(SUM(inline_acceptance_count) / NULLIF(SUM(inline_suggestions_count), 0) * 100, 1), '%') as 'Accept %',\n SUM(chat_messages_sent) as 'Chat Msgs',\n SUM(chat_ai_code_lines) as 'Chat Lines',\n SUM(dev_accepted_lines) as 'Agentic Lines',\n SUM(code_review_findings_count) as 'Review Findings',\n SUM(test_generation_accepted_tests) as 'Tests Accepted',\n SUM(doc_generation_event_count) as 'Doc Gen',\n SUM(transformation_event_count) as 'Transforms',\n MIN(date) as 'First Active',\n MAX(date) as 'Last Active'\nFROM lake._tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY user_id\nORDER BY SUM(inline_suggestions_count) DESC", + "refId": "A" + } + ], + "title": "Per-User Feature Metrics", + "type": "table" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": [ + "q_dev", + "legacy", + "kiro" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-30d", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Kiro Legacy Feature Metrics", + "uid": "qdev_feature_metrics", + "version": 1 +} diff --git a/grafana/dashboards/qdev_logging.json b/grafana/dashboards/qdev_logging.json index 462adcd986e..6a47b03bf2b 100644 --- a/grafana/dashboards/qdev_logging.json +++ b/grafana/dashboards/qdev_logging.json @@ -70,7 +70,7 @@ "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\n (SELECT COUNT(*) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)) as 'Chat Events',\n (SELECT COUNT(DISTINCT user_id) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)) as 'Chat Users',\n (SELECT COUNT(DISTINCT conversation_id) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp) AND conversation_id != '') as 'Conversations',\n (SELECT COUNT(*) FROM lake._tool_q_dev_completion_log WHERE $__timeFilter(timestamp)) as 'Completion Events',\n (SELECT COUNT(DISTINCT user_id) FROM lake._tool_q_dev_completion_log WHERE $__timeFilter(timestamp)) as 'Completion Users'", + "rawSql": "SELECT\n (SELECT COUNT(*) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)) as 'Chat Events',\n (SELECT COUNT(DISTINCT user_id) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)) as 'Chat Users',\n (SELECT COUNT(DISTINCT conversation_id) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp) AND conversation_id != '') as 'Conversations',\n (SELECT COUNT(*) FROM lake._tool_q_dev_completion_log WHERE $__timeFilter(timestamp)) as 'Completion Events',\n (SELECT COUNT(DISTINCT user_id) FROM lake._tool_q_dev_completion_log WHERE $__timeFilter(timestamp)) as 'Completion Users',\n (SELECT SUM(code_reference_count) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)) as 'Code References',\n (SELECT SUM(web_link_count) FROM lake._tool_q_dev_chat_log WHERE $__timeFilter(timestamp)) as 'Web Links Cited'", "refId": "A" } ], @@ -168,7 +168,7 @@ }, { "datasource": "mysql", - "description": "Distribution of model usage across chat events", + "description": "Distribution of chat trigger types: MANUAL (chat window) vs INLINE_CHAT", "fieldConfig": { "defaults": { "color": { @@ -188,10 +188,78 @@ }, "gridPos": { "h": 8, - "w": 12, + "w": 8, "x": 0, "y": 14 }, + "id": 11, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n CASE\n WHEN chat_trigger_type = '' OR chat_trigger_type IS NULL THEN '(unknown)'\n ELSE chat_trigger_type\n END as 'Trigger Type',\n COUNT(*) as 'Events'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY chat_trigger_type\nORDER BY COUNT(*) DESC", + "refId": "A" + } + ], + "title": "Chat Trigger Type Distribution", + "type": "piechart" + }, + { + "datasource": "mysql", + "description": "Distribution of model usage across chat events", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 14 + }, "id": 3, "options": { "displayLabels": [ @@ -256,8 +324,8 @@ }, "gridPos": { "h": 8, - "w": 12, - "x": 12, + "w": 8, + "x": 16, "y": 14 }, "id": 4, @@ -541,7 +609,7 @@ "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": "SELECT\n COALESCE(u.display_name, u.user_id) as 'User',\n u.user_id as 'User ID',\n u.chat_events as 'Chat Events',\n u.conversations as 'Conversations',\n ROUND(u.chat_events / NULLIF(u.conversations, 0), 1) as 'Avg Turns',\n COALESCE(c.completion_events, 0) as 'Completion Events',\n COALESCE(c.files_count, 0) as 'Distinct Files',\n ROUND(u.avg_prompt_len) as 'Avg Prompt Len',\n ROUND(u.avg_response_len) as 'Avg Response Len',\n u.steering_count as 'Steering Uses',\n u.spec_count as 'Spec Mode Uses',\n u.models_used as 'Models Used',\n u.first_seen as 'First Seen',\n GREATEST(u.last_seen, COALESCE(c.last_seen, u.last_seen)) as 'Last Seen'\nFROM (\n SELECT\n user_id,\n MAX(display_name) as display_name,\n COUNT(*) as chat_events,\n COUNT(DISTINCT CASE WHEN conversation_id != '' THEN conversation_id END) as conversations,\n AVG(prompt_length) as avg_prompt_len,\n AVG(response_length) as avg_response_len,\n GROUP_CONCAT(DISTINCT CASE WHEN model_id != '' AND model_id IS NOT NULL THEN model_id END ORDER BY model_id SEPARATOR ', ') as models_used,\n SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) as steering_count,\n SUM(CASE WHEN is_spec_mode = 1 THEN 1 ELSE 0 END) as spec_count,\n MIN(timestamp) as first_seen,\n MAX(timestamp) as last_seen\n FROM lake._tool_q_dev_chat_log\n WHERE $__timeFilter(timestamp)\n GROUP BY user_id\n) u\nLEFT JOIN (\n SELECT\n user_id,\n COUNT(*) as completion_events,\n COUNT(DISTINCT file_name) as files_count,\n MAX(timestamp) as last_seen\n FROM lake._tool_q_dev_completion_log\n WHERE $__timeFilter(timestamp)\n GROUP BY user_id\n) c ON u.user_id = c.user_id\nORDER BY u.user_id", + "rawSql": "SELECT\n COALESCE(u.display_name, u.user_id) as 'User',\n u.user_id as 'User ID',\n u.chat_events as 'Chat Events',\n u.conversations as 'Conversations',\n ROUND(u.chat_events / NULLIF(u.conversations, 0), 1) as 'Avg Turns',\n COALESCE(c.completion_events, 0) as 'Completion Events',\n COALESCE(c.files_count, 0) as 'Distinct Files',\n ROUND(u.avg_prompt_len) as 'Avg Prompt Len',\n ROUND(u.avg_response_len) as 'Avg Response Len',\n u.steering_count as 'Steering Uses',\n u.spec_count as 'Spec Mode Uses',\n u.code_ref_count as 'Code Refs',\n u.web_link_count as 'Web Links',\n u.models_used as 'Models Used',\n u.first_seen as 'First Seen',\n GREATEST(u.last_seen, COALESCE(c.last_seen, u.last_seen)) as 'Last Seen'\nFROM (\n SELECT\n user_id,\n MAX(display_name) as display_name,\n COUNT(*) as chat_events,\n COUNT(DISTINCT CASE WHEN conversation_id != '' THEN conversation_id END) as conversations,\n AVG(prompt_length) as avg_prompt_len,\n AVG(response_length) as avg_response_len,\n GROUP_CONCAT(DISTINCT CASE WHEN model_id != '' AND model_id IS NOT NULL THEN model_id END ORDER BY model_id SEPARATOR ', ') as models_used,\n SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) as steering_count,\n SUM(CASE WHEN is_spec_mode = 1 THEN 1 ELSE 0 END) as spec_count,\n SUM(code_reference_count) as code_ref_count,\n SUM(web_link_count) as web_link_count,\n MIN(timestamp) as first_seen,\n MAX(timestamp) as last_seen\n FROM lake._tool_q_dev_chat_log\n WHERE $__timeFilter(timestamp)\n GROUP BY user_id\n) u\nLEFT JOIN (\n SELECT\n user_id,\n COUNT(*) as completion_events,\n COUNT(DISTINCT file_name) as files_count,\n MAX(timestamp) as last_seen\n FROM lake._tool_q_dev_completion_log\n WHERE $__timeFilter(timestamp)\n GROUP BY user_id\n) c ON u.user_id = c.user_id\nORDER BY u.user_id", "refId": "A" } ], @@ -570,7 +638,7 @@ }, "gridPos": { "h": 8, - "w": 12, + "w": 8, "x": 0, "y": 48 }, @@ -638,8 +706,8 @@ }, "gridPos": { "h": 8, - "w": 12, - "x": 12, + "w": 8, + "x": 8, "y": 48 }, "id": 9, @@ -684,6 +752,74 @@ "title": "Active File Types in Chat", "type": "piechart" }, + { + "datasource": "mysql", + "description": "How often Kiro responses include code references and web links", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 48 + }, + "id": 12, + "options": { + "displayLabels": [ + "name", + "percent" + ], + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n SUM(CASE WHEN code_reference_count > 0 THEN 1 ELSE 0 END) as 'With Code References',\n SUM(CASE WHEN web_link_count > 0 THEN 1 ELSE 0 END) as 'With Web Links',\n SUM(CASE WHEN has_followup_prompts = 1 THEN 1 ELSE 0 END) as 'With Followup Prompts',\n SUM(CASE WHEN code_reference_count = 0 AND web_link_count = 0 AND has_followup_prompts = 0 THEN 1 ELSE 0 END) as 'Plain Response'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)", + "refId": "A" + } + ], + "title": "Response Enrichment Breakdown", + "type": "piechart" + }, { "datasource": "mysql", "description": "Average and maximum prompt/response lengths over time", @@ -775,6 +911,188 @@ ], "title": "Prompt & Response Length Trends", "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Average code context size provided to inline completions over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Characters", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 13, + "options": { + "legend": { + "calcs": [ + "mean", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE(timestamp) as time,\n ROUND(AVG(left_context_length)) as 'Avg Left Context',\n ROUND(AVG(right_context_length)) as 'Avg Right Context',\n ROUND(AVG(left_context_length + right_context_length)) as 'Avg Total Context'\nFROM lake._tool_q_dev_completion_log\nWHERE $__timeFilter(timestamp)\nGROUP BY DATE(timestamp)\nORDER BY DATE(timestamp)", + "refId": "A" + } + ], + "title": "Completion Context Size Trends", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Daily trend of code references and web links in chat responses", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 72 + }, + "id": 14, + "options": { + "legend": { + "calcs": [ + "mean", + "sum" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.6.2", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE(timestamp) as time,\n SUM(code_reference_count) as 'Code References',\n SUM(web_link_count) as 'Web Links',\n SUM(CASE WHEN has_followup_prompts = 1 THEN 1 ELSE 0 END) as 'Followup Prompts'\nFROM lake._tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY DATE(timestamp)\nORDER BY DATE(timestamp)", + "refId": "A" + } + ], + "title": "Response Enrichment Trends", + "type": "timeseries" } ], "preload": false, @@ -797,4 +1115,4 @@ "title": "Kiro AI Activity Insights", "uid": "qdev_logging", "version": 1 -} \ No newline at end of file +} From 6e7b5f117c70713d333be28108b72d410ed666b3 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sat, 21 Mar 2026 10:09:31 +0800 Subject: [PATCH 21/38] fix: add SQL identifier validation to prevent SQL injection via table/column names (#8769) Add ValidateTableName and ValidateColumnName functions in core/dal to ensure table and column names used in dynamic SQL are safe identifiers. Applied to scope_service_helper, scope_generic_helper, and customized_fields_extractor. --- backend/core/dal/identifier.go | 50 +++++++++++++++++++ .../pluginhelper/api/scope_generic_helper.go | 3 ++ .../helpers/srvhelper/scope_service_helper.go | 3 ++ .../tasks/customized_fields_extractor.go | 18 +++++-- 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 backend/core/dal/identifier.go diff --git a/backend/core/dal/identifier.go b/backend/core/dal/identifier.go new file mode 100644 index 00000000000..710d94e6fdb --- /dev/null +++ b/backend/core/dal/identifier.go @@ -0,0 +1,50 @@ +/* +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 dal + +import ( + "fmt" + "regexp" + + "github.com/apache/incubator-devlake/core/errors" +) + +// validIdentifierRegex matches valid SQL identifiers: alphanumeric, underscores, and dots (for schema.table) +var validIdentifierRegex = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_.]*$`) + +// ValidateTableName checks that a table name is a safe SQL identifier to prevent SQL injection. +func ValidateTableName(name string) errors.Error { + if name == "" { + return errors.Default.New("table name must not be empty") + } + if !validIdentifierRegex.MatchString(name) { + return errors.Default.New(fmt.Sprintf("invalid table name: %q", name)) + } + return nil +} + +// ValidateColumnName checks that a column name is a safe SQL identifier to prevent SQL injection. +func ValidateColumnName(name string) errors.Error { + if name == "" { + return errors.Default.New("column name must not be empty") + } + if !validIdentifierRegex.MatchString(name) { + return errors.Default.New(fmt.Sprintf("invalid column name: %q", name)) + } + return nil +} diff --git a/backend/helpers/pluginhelper/api/scope_generic_helper.go b/backend/helpers/pluginhelper/api/scope_generic_helper.go index a782b4e091e..895f3427a4d 100644 --- a/backend/helpers/pluginhelper/api/scope_generic_helper.go +++ b/backend/helpers/pluginhelper/api/scope_generic_helper.go @@ -565,6 +565,9 @@ func (gs *GenericScopeApiHelper[Conn, Scope, ScopeConfig]) transactionalDelete(t } tx := gs.db.Begin() for _, table := range tables { + if err := dal.ValidateTableName(table); err != nil { + return errors.Default.Wrap(err, fmt.Sprintf("unsafe table name %q when deleting scope data", table)) + } where, params := generateWhereClause(table) gs.log.Info("deleting data from table %s with WHERE \"%s\" and params: \"%v\"", table, where, params) sql := fmt.Sprintf("DELETE FROM %s WHERE %s", table, where) diff --git a/backend/helpers/srvhelper/scope_service_helper.go b/backend/helpers/srvhelper/scope_service_helper.go index 544536f01c2..e5d4671c53d 100644 --- a/backend/helpers/srvhelper/scope_service_helper.go +++ b/backend/helpers/srvhelper/scope_service_helper.go @@ -255,6 +255,9 @@ func (scopeSrv *ScopeSrvHelper[C, S, SC]) deleteScopeData(scope plugin.ToolLayer } tables := errors.Must1(scopeSrv.getAffectedTables()) for _, table := range tables { + if err := dal.ValidateTableName(table); err != nil { + panic(errors.Default.Wrap(err, fmt.Sprintf("unsafe table name %q when deleting scope data", table))) + } where, params := generateWhereClause(table) scopeSrv.log.Info("deleting data from table %s with WHERE \"%s\" and params: \"%v\"", table, where, params) sql := fmt.Sprintf("DELETE FROM %s WHERE %s", table, where) diff --git a/backend/plugins/customize/tasks/customized_fields_extractor.go b/backend/plugins/customize/tasks/customized_fields_extractor.go index b9f7c10081b..7bd1d932d7b 100644 --- a/backend/plugins/customize/tasks/customized_fields_extractor.go +++ b/backend/plugins/customize/tasks/customized_fields_extractor.go @@ -149,7 +149,10 @@ func extractCustomizedFields(ctx context.Context, d dal.Dal, table, rawTable, ra // remove columns that are not primary key delete(row, "_raw_data_id") delete(row, "data") - query, params := mkUpdate(table, updates, row) + query, params, err := mkUpdate(table, updates, row) + if err != nil { + return err + } err = d.Exec(query, params...) if err != nil { return errors.Default.Wrap(err, "Exec SQL error") @@ -169,18 +172,27 @@ func fillInUpdates(result gjson.Result, field string, updates map[string]interfa } // mkUpdate generates SQL statement and parameters for updating a record -func mkUpdate(table string, updates map[string]interface{}, pk map[string]interface{}) (string, []interface{}) { +func mkUpdate(table string, updates map[string]interface{}, pk map[string]interface{}) (string, []interface{}, error) { + if err := dal.ValidateTableName(table); err != nil { + return "", nil, err + } var params []interface{} stat := fmt.Sprintf("UPDATE %s SET ", table) var uu []string for field, value := range updates { + if err := dal.ValidateColumnName(field); err != nil { + return "", nil, err + } uu = append(uu, fmt.Sprintf("%s = ?", field)) params = append(params, value) } var ww []string for field, value := range pk { + if err := dal.ValidateColumnName(field); err != nil { + return "", nil, err + } ww = append(ww, fmt.Sprintf("%s = ?", field)) params = append(params, value) } - return stat + strings.Join(uu, ", ") + " WHERE " + strings.Join(ww, " AND "), params + return stat + strings.Join(uu, ", ") + " WHERE " + strings.Join(ww, " AND "), params, nil } From 1fc5be14735a31db16aa5d81aac514411781a4b3 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sun, 22 Mar 2026 22:17:28 +0800 Subject: [PATCH 22/38] feat(q-dev): add Kiro Credits + DORA Correlation dashboard (#8792) Add a new Grafana dashboard that correlates Kiro AI usage (credits, messages, active users) with DORA metrics at weekly aggregate level. Panels include: - Pearson's r correlation between weekly credits and PR cycle time - High AI Usage vs Low AI Usage cycle time comparison - Weekly credits vs deployment frequency trend - Weekly credits vs change failure rate trend Data is joined by week_start between _tool_q_dev_user_report and project_pr_metrics / cicd_deployment_commits. --- grafana/dashboards/KiroCreditsDORA.json | 426 ++++++++++++++++++++++++ 1 file changed, 426 insertions(+) create mode 100644 grafana/dashboards/KiroCreditsDORA.json diff --git a/grafana/dashboards/KiroCreditsDORA.json b/grafana/dashboards/KiroCreditsDORA.json new file mode 100644 index 00000000000..d8195d8bee5 --- /dev/null +++ b/grafana/dashboards/KiroCreditsDORA.json @@ -0,0 +1,426 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [ + { + "asDropdown": false, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [], + "targetBlank": true, + "title": "DORA Dashboard", + "type": "link", + "url": "/d/qNo8_0M4z/dora" + }, + { + "asDropdown": false, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [], + "targetBlank": true, + "title": "Kiro Usage Dashboard", + "type": "link", + "url": "/d/qdev_user_report" + } + ], + "panels": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { "h": 3, "w": 24, "x": 0, "y": 0 }, + "id": 1, + "options": { + "code": { "language": "plaintext", "showLineNumbers": false, "showMiniMap": false }, + "content": "## Kiro Credits + DORA Correlation\nThis dashboard correlates **Kiro AI usage (credits and messages)** with **DORA** performance indicators at a weekly aggregate level.\n\n- **Pearson's r** measures linear correlation: negative r suggests higher AI usage may correlate with shorter cycle times.\n- Data is aggregated by **week** and joined on `week_start`.", + "mode": "markdown" + }, + "title": "Dashboard Introduction", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 3 }, + "id": 2, + "panels": [], + "title": "Overview", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Pearson correlation coefficient between weekly Kiro credits and PR cycle time", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [{ "options": { "match": "null", "result": { "text": "Need more data" } }, "type": "special" }], + "thresholds": { + "mode": "absolute", + "steps": [ + { "color": "green", "value": null }, + { "color": "yellow", "value": -0.3 }, + { "color": "orange", "value": 0.3 } + ] + } + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 8, "x": 0, "y": 4 }, + "id": 3, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, + "showPercentChange": false, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "WITH _kiro_weekly AS (\n SELECT\n DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS week_start,\n SUM(credits_used) AS weekly_credits\n FROM _tool_q_dev_user_report\n WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n),\n_pr_weekly AS (\n SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_cycle_hours\n FROM project_pr_metrics\n WHERE pr_merged_date IS NOT NULL\n AND pr_cycle_time IS NOT NULL\n AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_joined AS (\n SELECT k.weekly_credits AS x, p.avg_cycle_hours AS y\n FROM _kiro_weekly k\n INNER JOIN _pr_weekly p ON k.week_start = p.week_start\n),\n_stats AS (\n SELECT COUNT(*) AS n, AVG(x) AS mx, AVG(y) AS my, STDDEV_POP(x) AS sx, STDDEV_POP(y) AS sy\n FROM _joined\n)\nSELECT CASE\n WHEN s.n < 4 THEN NULL\n WHEN s.sx = 0 OR s.sy = 0 THEN 0\n ELSE ROUND((SELECT SUM((j.x - s.mx) * (j.y - s.my)) FROM _joined j) / (s.n * s.sx * s.sy), 2)\nEND AS 'r'\nFROM _stats s", + "refId": "A" + } + ], + "title": "Credits vs Cycle Time (r)", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Total Kiro credits consumed in period", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 4, "x": 8, "y": 4 }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT SUM(credits_used) AS 'Credits Used'\nFROM _tool_q_dev_user_report\nWHERE $__timeFilter(date)", + "refId": "A" + } + ], + "title": "Total Credits", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Median PR cycle time in hours", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, + "unit": "h" + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 4, "x": 12, "y": 4 }, + "id": 5, + "options": { + "colorMode": "value", + "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "WITH _ranked AS (\n SELECT pr_cycle_time / 60.0 AS ct,\n PERCENT_RANK() OVER (ORDER BY pr_cycle_time) AS prank\n FROM project_pr_metrics\n WHERE pr_merged_date IS NOT NULL AND pr_cycle_time IS NOT NULL\n AND $__timeFilter(pr_merged_date)\n)\nSELECT ROUND(MAX(ct), 1) AS 'Median Cycle Time'\nFROM _ranked WHERE prank <= 0.5", + "refId": "A" + } + ], + "title": "Median Cycle Time", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Cycle time comparison: weeks with above-median vs below-median AI credits usage", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, + "unit": "h" + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 8, "x": 16, "y": 4 }, + "id": 6, + "options": { + "barRadius": 0.1, + "barWidth": 0.6, + "orientation": "horizontal", + "showValue": "auto", + "stacking": "none", + "tooltip": { "mode": "single" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "WITH _kiro_weekly AS (\n SELECT DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS week_start,\n SUM(credits_used) AS weekly_credits\n FROM _tool_q_dev_user_report WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n),\n_pr_weekly AS (\n SELECT DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS week_start,\n AVG(pr_cycle_time) / 60.0 AS avg_ct\n FROM project_pr_metrics\n WHERE pr_merged_date IS NOT NULL AND pr_cycle_time IS NOT NULL AND $__timeFilter(pr_merged_date)\n GROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\n),\n_joined AS (\n SELECT k.weekly_credits, p.avg_ct FROM _kiro_weekly k INNER JOIN _pr_weekly p ON k.week_start = p.week_start\n),\n_med AS (\n SELECT weekly_credits AS med FROM _joined ORDER BY weekly_credits LIMIT 1 OFFSET (SELECT FLOOR(COUNT(*)/2) FROM _joined)\n)\nSELECT\n CASE WHEN j.weekly_credits >= m.med THEN 'High AI Usage' ELSE 'Low AI Usage' END AS 'Tier',\n ROUND(AVG(j.avg_ct), 1) AS 'Avg Cycle Time'\nFROM _joined j, _med m\nGROUP BY CASE WHEN j.weekly_credits >= m.med THEN 'High AI Usage' ELSE 'Low AI Usage' END", + "refId": "A" + } + ], + "title": "Cycle Time: High vs Low AI Usage", + "type": "bargauge" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 10 }, + "id": 10, + "panels": [], + "title": "Weekly Trends", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Weekly Kiro credits consumed", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 11 }, + "id": 11, + "options": { + "legend": { "calcs": ["mean", "sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS time,\n SUM(credits_used) AS 'Credits Used',\n COUNT(DISTINCT user_id) AS 'Active Users'\nFROM _tool_q_dev_user_report\nWHERE $__timeFilter(date)\nGROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\nORDER BY time", + "refId": "A" + } + ], + "title": "Weekly Kiro Credits & Active Users", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Weekly average PR cycle time in hours", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "h" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 11 }, + "id": 12, + "options": { + "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY) AS time,\n ROUND(AVG(pr_cycle_time) / 60.0, 1) AS 'Avg Cycle Time (hrs)',\n COUNT(*) AS 'PRs Merged'\nFROM project_pr_metrics\nWHERE pr_merged_date IS NOT NULL AND pr_cycle_time IS NOT NULL\n AND $__timeFilter(pr_merged_date)\nGROUP BY DATE_SUB(DATE(pr_merged_date), INTERVAL WEEKDAY(DATE(pr_merged_date)) DAY)\nORDER BY time", + "refId": "A" + } + ], + "title": "Weekly PR Cycle Time & Volume", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 19 }, + "id": 20, + "panels": [], + "title": "Deployment Frequency", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Pearson correlation between weekly credits and deployment count", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [{ "options": { "match": "null", "result": { "text": "Need more data" } }, "type": "special" }], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 6, "x": 0, "y": 20 }, + "id": 21, + "options": { + "colorMode": "value", + "graphMode": "none", + "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "WITH _kiro_weekly AS (\n SELECT DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS week_start,\n SUM(credits_used) AS weekly_credits\n FROM _tool_q_dev_user_report WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n),\n_deploy_weekly AS (\n SELECT DATE_SUB(DATE(cdc.finished_date), INTERVAL WEEKDAY(DATE(cdc.finished_date)) DAY) AS week_start,\n COUNT(DISTINCT cdc.cicd_deployment_id) AS deploys\n FROM cicd_deployment_commits cdc\n JOIN project_mapping pm ON cdc.cicd_scope_id = pm.row_id AND pm.`table` = 'cicd_scopes'\n WHERE cdc.result = 'SUCCESS' AND cdc.environment = 'PRODUCTION'\n AND $__timeFilter(cdc.finished_date)\n GROUP BY DATE_SUB(DATE(cdc.finished_date), INTERVAL WEEKDAY(DATE(cdc.finished_date)) DAY)\n),\n_joined AS (\n SELECT k.weekly_credits AS x, d.deploys AS y\n FROM _kiro_weekly k INNER JOIN _deploy_weekly d ON k.week_start = d.week_start\n),\n_stats AS (\n SELECT COUNT(*) AS n, AVG(x) AS mx, AVG(y) AS my, STDDEV_POP(x) AS sx, STDDEV_POP(y) AS sy FROM _joined\n)\nSELECT CASE\n WHEN s.n < 4 THEN NULL\n WHEN s.sx = 0 OR s.sy = 0 THEN 0\n ELSE ROUND((SELECT SUM((j.x - s.mx) * (j.y - s.my)) FROM _joined j) / (s.n * s.sx * s.sy), 2)\nEND AS 'r'\nFROM _stats s", + "refId": "A" + } + ], + "title": "Credits vs Deploy Freq (r)", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Weekly credits overlaid with deployment count", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 18, "x": 6, "y": 20 }, + "id": 22, + "options": { + "legend": { "calcs": ["mean", "sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT time, SUM(credits) AS 'Credits Used', SUM(deploys) AS 'Deployments'\nFROM (\n SELECT DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS time,\n SUM(credits_used) AS credits, 0 AS deploys\n FROM _tool_q_dev_user_report WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n UNION ALL\n SELECT DATE_SUB(DATE(cdc.finished_date), INTERVAL WEEKDAY(DATE(cdc.finished_date)) DAY) AS time,\n 0 AS credits, COUNT(DISTINCT cdc.cicd_deployment_id) AS deploys\n FROM cicd_deployment_commits cdc\n JOIN project_mapping pm ON cdc.cicd_scope_id = pm.row_id AND pm.`table` = 'cicd_scopes'\n WHERE cdc.result = 'SUCCESS' AND cdc.environment = 'PRODUCTION'\n AND $__timeFilter(cdc.finished_date)\n GROUP BY DATE_SUB(DATE(cdc.finished_date), INTERVAL WEEKDAY(DATE(cdc.finished_date)) DAY)\n) combined\nGROUP BY time ORDER BY time", + "refId": "A" + } + ], + "title": "Weekly Credits vs Deployments", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 28 }, + "id": 30, + "panels": [], + "title": "Change Failure Rate", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Change failure rate: % of deployments that caused incidents", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 29 }, + "id": 31, + "options": { + "legend": { "calcs": ["mean", "sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT time, SUM(credits) AS 'Credits Used', SUM(cfr) AS 'Change Failure Rate'\nFROM (\n SELECT DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS time,\n SUM(credits_used) AS credits, 0 AS cfr\n FROM _tool_q_dev_user_report WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n UNION ALL\n SELECT DATE_SUB(DATE(d.deployment_finished_date), INTERVAL WEEKDAY(DATE(d.deployment_finished_date)) DAY) AS time,\n 0 AS credits,\n SUM(CASE WHEN i.id IS NOT NULL THEN 1 ELSE 0 END) / COUNT(DISTINCT d.deployment_id) AS cfr\n FROM (\n SELECT cdc.cicd_deployment_id AS deployment_id, MAX(cdc.finished_date) AS deployment_finished_date\n FROM cicd_deployment_commits cdc\n JOIN project_mapping pm ON cdc.cicd_scope_id = pm.row_id AND pm.`table` = 'cicd_scopes'\n WHERE cdc.result = 'SUCCESS' AND cdc.environment = 'PRODUCTION'\n AND $__timeFilter(cdc.finished_date)\n GROUP BY cdc.cicd_deployment_id\n ) d\n LEFT JOIN project_incident_deployment_relationships pidr ON d.deployment_id = pidr.deployment_id\n LEFT JOIN incidents i ON pidr.id = i.id\n GROUP BY DATE_SUB(DATE(d.deployment_finished_date), INTERVAL WEEKDAY(DATE(d.deployment_finished_date)) DAY)\n) combined\nGROUP BY time ORDER BY time", + "refId": "A" + } + ], + "title": "Weekly Credits vs Change Failure Rate", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": ["q_dev", "dora", "kiro", "correlation"], + "templating": { + "list": [ + { + "current": { "selected": true, "text": ["All"], "value": ["$__all"] }, + "datasource": "mysql", + "definition": "SELECT DISTINCT name FROM projects", + "hide": 0, + "includeAll": true, + "label": "Project", + "multi": true, + "name": "project", + "options": [], + "query": "SELECT DISTINCT name FROM projects", + "refresh": 1, + "type": "query" + } + ] + }, + "time": { "from": "now-90d", "to": "now" }, + "timepicker": {}, + "timezone": "utc", + "title": "Kiro Credits + DORA Correlation", + "uid": "kiro_credits_dora", + "version": 1 +} From 2592c2dc8b0bd5b037f54f6af5576a31e11ff359 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sun, 22 Mar 2026 22:17:48 +0800 Subject: [PATCH 23/38] feat(q-dev): add AI Cost-Efficiency dashboard (#8793) Add a Grafana dashboard showing AI tool cost-efficiency metrics: - Credits per merged PR (overall + weekly trend) - Credits per production deployment (overall + weekly trend) - Credits per issue resolved (overall + weekly trend) - Weekly AI activity volume (credits, messages, conversations) Joins _tool_q_dev_user_report with pull_requests, cicd_deployment_commits, and issues by weekly aggregation. --- grafana/dashboards/AICostEfficiency.json | 317 +++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 grafana/dashboards/AICostEfficiency.json diff --git a/grafana/dashboards/AICostEfficiency.json b/grafana/dashboards/AICostEfficiency.json new file mode 100644 index 00000000000..d6e8bf4a998 --- /dev/null +++ b/grafana/dashboards/AICostEfficiency.json @@ -0,0 +1,317 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [ + { + "asDropdown": false, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [], + "targetBlank": true, + "title": "Kiro Usage Dashboard", + "type": "link", + "url": "/d/qdev_user_report" + } + ], + "panels": [ + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, + "id": 1, + "panels": [], + "title": "Summary", + "type": "row" + }, + { + "datasource": "mysql", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "blue", "value": null }] } + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 6, "x": 0, "y": 1 }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(SUM(credits_used)) AS 'Total Credits'\nFROM _tool_q_dev_user_report WHERE $__timeFilter(date)", + "refId": "A" + } + ], + "title": "Total Credits Used", + "type": "stat" + }, + { + "datasource": "mysql", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 6, "x": 6, "y": 1 }, + "id": 3, + "options": { + "colorMode": "value", + "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(SUM(r.credits_used) / NULLIF(COUNT(DISTINCT pr.id), 0), 1) AS 'Credits / PR'\nFROM _tool_q_dev_user_report r\nCROSS JOIN (\n SELECT DISTINCT id FROM pull_requests\n WHERE merged_date IS NOT NULL AND $__timeFilter(merged_date)\n) pr\nWHERE $__timeFilter(r.date)", + "refId": "A" + } + ], + "title": "Credits per PR (Overall)", + "type": "stat" + }, + { + "datasource": "mysql", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 6, "x": 12, "y": 1 }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(SUM(r.credits_used) / NULLIF(COUNT(DISTINCT cdc.cicd_deployment_id), 0), 1) AS 'Credits / Deploy'\nFROM _tool_q_dev_user_report r\nCROSS JOIN (\n SELECT DISTINCT cicd_deployment_id\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS' AND environment = 'PRODUCTION'\n AND $__timeFilter(finished_date)\n) cdc\nWHERE $__timeFilter(r.date)", + "refId": "A" + } + ], + "title": "Credits per Deployment (Overall)", + "type": "stat" + }, + { + "datasource": "mysql", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] } + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 6, "x": 18, "y": 1 }, + "id": 5, + "options": { + "colorMode": "value", + "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(SUM(r.credits_used) / NULLIF(COUNT(DISTINCT i.id), 0), 1) AS 'Credits / Issue'\nFROM _tool_q_dev_user_report r\nCROSS JOIN (\n SELECT DISTINCT id FROM issues\n WHERE resolution_date IS NOT NULL AND type != 'INCIDENT'\n AND $__timeFilter(resolution_date)\n) i\nWHERE $__timeFilter(r.date)", + "refId": "A" + } + ], + "title": "Credits per Issue Resolved", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 7 }, + "id": 10, + "panels": [], + "title": "Weekly Trends", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Weekly cost per merged PR", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 }, + "id": 11, + "options": { + "legend": { "calcs": ["mean", "min"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "WITH _credits AS (\n SELECT DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS week_start,\n SUM(credits_used) AS credits\n FROM _tool_q_dev_user_report WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n),\n_prs AS (\n SELECT DATE_SUB(DATE(merged_date), INTERVAL WEEKDAY(DATE(merged_date)) DAY) AS week_start,\n COUNT(*) AS prs\n FROM pull_requests\n WHERE merged_date IS NOT NULL AND $__timeFilter(merged_date)\n GROUP BY DATE_SUB(DATE(merged_date), INTERVAL WEEKDAY(DATE(merged_date)) DAY)\n)\nSELECT c.week_start AS time,\n ROUND(c.credits / NULLIF(p.prs, 0), 1) AS 'Credits per PR'\nFROM _credits c\nLEFT JOIN _prs p ON c.week_start = p.week_start\nORDER BY time", + "refId": "A" + } + ], + "title": "Credits per Merged PR (Weekly)", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Weekly cost per production deployment", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 }, + "id": 12, + "options": { + "legend": { "calcs": ["mean", "min"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "WITH _credits AS (\n SELECT DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS week_start,\n SUM(credits_used) AS credits\n FROM _tool_q_dev_user_report WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n),\n_deploys AS (\n SELECT DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY) AS week_start,\n COUNT(DISTINCT cicd_deployment_id) AS deploys\n FROM cicd_deployment_commits\n WHERE result = 'SUCCESS' AND environment = 'PRODUCTION'\n AND $__timeFilter(finished_date)\n GROUP BY DATE_SUB(DATE(finished_date), INTERVAL WEEKDAY(DATE(finished_date)) DAY)\n)\nSELECT c.week_start AS time,\n ROUND(c.credits / NULLIF(d.deploys, 0), 1) AS 'Credits per Deploy'\nFROM _credits c\nLEFT JOIN _deploys d ON c.week_start = d.week_start\nORDER BY time", + "refId": "A" + } + ], + "title": "Credits per Deployment (Weekly)", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Weekly cost per resolved issue", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 16 }, + "id": 13, + "options": { + "legend": { "calcs": ["mean", "min"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "WITH _credits AS (\n SELECT DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS week_start,\n SUM(credits_used) AS credits\n FROM _tool_q_dev_user_report WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n),\n_issues AS (\n SELECT DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY) AS week_start,\n COUNT(*) AS resolved\n FROM issues\n WHERE resolution_date IS NOT NULL AND type != 'INCIDENT'\n AND $__timeFilter(resolution_date)\n GROUP BY DATE_SUB(DATE(resolution_date), INTERVAL WEEKDAY(DATE(resolution_date)) DAY)\n)\nSELECT c.week_start AS time,\n ROUND(c.credits / NULLIF(i.resolved, 0), 1) AS 'Credits per Issue'\nFROM _credits c\nLEFT JOIN _issues i ON c.week_start = i.week_start\nORDER BY time", + "refId": "A" + } + ], + "title": "Credits per Issue Resolved (Weekly)", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Is cost efficiency improving over time?", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 16 }, + "id": 14, + "options": { + "legend": { "calcs": ["mean", "sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS time,\n SUM(credits_used) AS 'Credits',\n SUM(total_messages) AS 'Messages',\n SUM(chat_conversations) AS 'Conversations'\nFROM _tool_q_dev_user_report\nWHERE $__timeFilter(date)\nGROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\nORDER BY time", + "refId": "A" + } + ], + "title": "Weekly AI Activity Volume", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": ["q_dev", "kiro", "cost", "efficiency"], + "templating": { "list": [] }, + "time": { "from": "now-90d", "to": "now" }, + "timepicker": {}, + "timezone": "utc", + "title": "AI Cost-Efficiency", + "uid": "ai_cost_efficiency", + "version": 1 +} From 6ad1ffea25b7326bac815a8adde893405c196595 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sun, 22 Mar 2026 22:18:05 +0800 Subject: [PATCH 24/38] feat(q-dev): add Multi-AI Tool Comparison dashboard (Copilot vs Kiro) (#8794) Add a Grafana dashboard comparing GitHub Copilot and Kiro side by side: - Weekly active users comparison - Code suggestions & acceptance events (per tool) - LOC accepted comparison (combined time series) - Acceptance rate comparison (bar gauge) Template variables for Copilot connection/scope selection. Data from _tool_copilot_enterprise_daily_metrics vs _tool_q_dev_user_report and _tool_q_dev_user_data. --- grafana/dashboards/MultiAIComparison.json | 299 ++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 grafana/dashboards/MultiAIComparison.json diff --git a/grafana/dashboards/MultiAIComparison.json b/grafana/dashboards/MultiAIComparison.json new file mode 100644 index 00000000000..0ca1a3367ab --- /dev/null +++ b/grafana/dashboards/MultiAIComparison.json @@ -0,0 +1,299 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [ + { + "asDropdown": false, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [], + "targetBlank": true, + "title": "Kiro Usage", + "type": "link", + "url": "/d/qdev_user_report" + }, + { + "asDropdown": false, + "icon": "external link", + "includeVars": true, + "keepTime": true, + "tags": [], + "targetBlank": true, + "title": "Copilot Adoption", + "type": "link", + "url": "/d/copilot_adoption" + } + ], + "panels": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { "h": 3, "w": 24, "x": 0, "y": 0 }, + "id": 1, + "options": { + "code": { "language": "plaintext", "showLineNumbers": false, "showMiniMap": false }, + "content": "## Multi-AI Tool Comparison: Copilot vs Kiro\nCompare GitHub Copilot and Kiro (Amazon Q Developer) adoption and usage side by side.\n\n**Note:** Copilot metrics come from `_tool_copilot_enterprise_daily_metrics` (enterprise-level aggregates). Kiro metrics come from `_tool_q_dev_user_report` and `_tool_q_dev_user_data`. Select the Copilot connection and scope using the dropdowns above.", + "mode": "markdown" + }, + "title": "About", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 3 }, + "id": 2, + "panels": [], + "title": "Active Users", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Weekly active users for both tools", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 4 }, + "id": 3, + "options": { + "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS time,\n COUNT(DISTINCT user_id) AS 'Kiro Active Users'\nFROM _tool_q_dev_user_report\nWHERE $__timeFilter(date)\nGROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\nORDER BY time", + "refId": "A" + }, + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_SUB(DATE(day), INTERVAL WEEKDAY(DATE(day)) DAY) AS time,\n MAX(daily_active_users) AS 'Copilot Active Users'\nFROM _tool_copilot_enterprise_daily_metrics\nWHERE connection_id = ${copilot_connection_id}\n AND scope_id = '${copilot_scope_id}'\n AND $__timeFilter(day)\nGROUP BY DATE_SUB(DATE(day), INTERVAL WEEKDAY(DATE(day)) DAY)\nORDER BY time", + "refId": "B" + } + ], + "title": "Weekly Active Users Comparison", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 12 }, + "id": 10, + "panels": [], + "title": "Code Generation", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Weekly code generation and acceptance events", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 13 }, + "id": 11, + "options": { + "legend": { "calcs": ["mean", "sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS time,\n SUM(inline_suggestions_count) AS 'Kiro: Suggestions',\n SUM(inline_acceptance_count) AS 'Kiro: Accepted'\nFROM _tool_q_dev_user_data\nWHERE $__timeFilter(date)\nGROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\nORDER BY time", + "refId": "A" + } + ], + "title": "Kiro: Code Suggestions & Acceptance", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Weekly Copilot code generation and acceptance events", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 13 }, + "id": 12, + "options": { + "legend": { "calcs": ["mean", "sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_SUB(DATE(day), INTERVAL WEEKDAY(DATE(day)) DAY) AS time,\n SUM(code_generation_activity_count) AS 'Copilot: Suggestions',\n SUM(code_acceptance_activity_count) AS 'Copilot: Accepted'\nFROM _tool_copilot_enterprise_daily_metrics\nWHERE connection_id = ${copilot_connection_id}\n AND scope_id = '${copilot_scope_id}'\n AND $__timeFilter(day)\nGROUP BY DATE_SUB(DATE(day), INTERVAL WEEKDAY(DATE(day)) DAY)\nORDER BY time", + "refId": "A" + } + ], + "title": "Copilot: Code Suggestions & Acceptance", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { "h": 1, "w": 24, "x": 0, "y": 21 }, + "id": 20, + "panels": [], + "title": "Lines of Code & Acceptance Rate", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Weekly AI-generated lines of code accepted", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisBorderShow": false, "axisLabel": "", "axisPlacement": "auto", + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "pointSize": 5, "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 22 }, + "id": 21, + "options": { + "legend": { "calcs": ["mean", "sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT time, SUM(kiro_loc) AS 'Kiro LOC Accepted', SUM(copilot_loc) AS 'Copilot LOC Added'\nFROM (\n SELECT DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY) AS time,\n SUM(inline_ai_code_lines + chat_ai_code_lines) AS kiro_loc, 0 AS copilot_loc\n FROM _tool_q_dev_user_data WHERE $__timeFilter(date)\n GROUP BY DATE_SUB(DATE(date), INTERVAL WEEKDAY(DATE(date)) DAY)\n UNION ALL\n SELECT DATE_SUB(DATE(day), INTERVAL WEEKDAY(DATE(day)) DAY) AS time,\n 0 AS kiro_loc, SUM(loc_added_sum) AS copilot_loc\n FROM _tool_copilot_enterprise_daily_metrics\n WHERE connection_id = ${copilot_connection_id}\n AND scope_id = '${copilot_scope_id}'\n AND $__timeFilter(day)\n GROUP BY DATE_SUB(DATE(day), INTERVAL WEEKDAY(DATE(day)) DAY)\n) combined\nGROUP BY time ORDER BY time", + "refId": "A" + } + ], + "title": "LOC Accepted: Kiro vs Copilot", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Overall acceptance rates for both tools", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 22 }, + "id": 22, + "options": { + "barRadius": 0.1, + "barWidth": 0.5, + "orientation": "horizontal", + "showValue": "auto", + "stacking": "none", + "tooltip": { "mode": "single" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT 'Kiro' AS Tool,\n ROUND(SUM(inline_acceptance_count) * 100.0 / NULLIF(SUM(inline_suggestions_count), 0), 1) AS 'Acceptance Rate'\nFROM _tool_q_dev_user_data\nWHERE $__timeFilter(date)\nUNION ALL\nSELECT 'Copilot' AS Tool,\n ROUND(SUM(code_acceptance_activity_count) * 100.0 / NULLIF(SUM(code_generation_activity_count), 0), 1)\nFROM _tool_copilot_enterprise_daily_metrics\nWHERE connection_id = ${copilot_connection_id}\n AND scope_id = '${copilot_scope_id}'\n AND $__timeFilter(day)", + "refId": "A" + } + ], + "title": "Acceptance Rate Comparison", + "type": "bargauge" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": ["q_dev", "copilot", "kiro", "comparison"], + "templating": { + "list": [ + { + "current": {}, + "datasource": "mysql", + "definition": "SELECT DISTINCT connection_id FROM _tool_copilot_scopes ORDER BY connection_id DESC", + "hide": 0, + "label": "Copilot Connection", + "name": "copilot_connection_id", + "options": [], + "query": "SELECT DISTINCT connection_id FROM _tool_copilot_scopes ORDER BY connection_id DESC", + "refresh": 1, + "type": "query" + }, + { + "current": {}, + "datasource": "mysql", + "definition": "SELECT DISTINCT id FROM _tool_copilot_scopes WHERE connection_id = CAST('${copilot_connection_id}' AS UNSIGNED)", + "hide": 0, + "label": "Copilot Scope", + "name": "copilot_scope_id", + "options": [], + "query": "SELECT DISTINCT id FROM _tool_copilot_scopes WHERE connection_id = CAST('${copilot_connection_id}' AS UNSIGNED)", + "refresh": 1, + "type": "query" + } + ] + }, + "time": { "from": "now-90d", "to": "now" }, + "timepicker": {}, + "timezone": "utc", + "title": "Multi-AI Tool Comparison", + "uid": "multi_ai_comparison", + "version": 1 +} From 4d987b8b905d319e507a2c92645e424f33eb9d12 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sun, 22 Mar 2026 22:36:02 +0800 Subject: [PATCH 25/38] feat(q-dev): add Kiro AI Model ROI dashboard (#8795) Add a Grafana dashboard analyzing per-model performance from chat logs: - Model Performance Summary table (requests, share%, avg prompt/response length, response/prompt ratio, steering/spec mode usage) - Daily Model Usage Distribution (stacked bar chart) - Avg Response Length by Model trend (output quality proxy) Data source: _tool_q_dev_chat_log grouped by model_id. --- grafana/dashboards/AIModelROI.json | 124 +++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 grafana/dashboards/AIModelROI.json diff --git a/grafana/dashboards/AIModelROI.json b/grafana/dashboards/AIModelROI.json new file mode 100644 index 00000000000..4ee15620bb1 --- /dev/null +++ b/grafana/dashboards/AIModelROI.json @@ -0,0 +1,124 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "panels": [ + { + "datasource": "mysql", + "description": "Requests, avg prompt/response length, and usage share per model", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "custom": { "align": "auto", "cellOptions": { "type": "auto" }, "filterable": true }, + "thresholds": { "mode": "absolute", "steps": [{ "color": "green" }] } + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 0 }, + "id": 1, + "options": { "cellHeight": "sm", "showHeader": true, "sortBy": [] }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n CASE WHEN model_id = '' OR model_id IS NULL THEN '(unknown)' ELSE model_id END AS 'Model',\n COUNT(*) AS 'Requests',\n ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM _tool_q_dev_chat_log WHERE $__timeFilter(timestamp)), 1) AS 'Share %',\n ROUND(AVG(prompt_length)) AS 'Avg Prompt Len',\n ROUND(AVG(response_length)) AS 'Avg Response Len',\n ROUND(AVG(response_length) / NULLIF(AVG(prompt_length), 0), 2) AS 'Response/Prompt Ratio',\n SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) AS 'Steering Uses',\n SUM(CASE WHEN is_spec_mode = 1 THEN 1 ELSE 0 END) AS 'Spec Mode Uses'\nFROM _tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY model_id\nORDER BY COUNT(*) DESC", + "refId": "A" + } + ], + "title": "Model Performance Summary", + "type": "table" + }, + { + "datasource": "mysql", + "description": "Request volume by model over time", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "bars", "fillOpacity": 80, "lineWidth": 1, + "stacking": { "mode": "normal" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 8 }, + "id": 2, + "options": { + "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT DATE(timestamp) AS time,\n CASE WHEN model_id = '' OR model_id IS NULL THEN '(unknown)' ELSE model_id END AS metric,\n COUNT(*) AS value\nFROM _tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY DATE(timestamp), model_id\nORDER BY time", + "refId": "A" + } + ], + "title": "Daily Model Usage Distribution", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Average response length per model over time — proxy for output quality", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 16 }, + "id": 3, + "options": { + "legend": { "calcs": ["mean"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT DATE(timestamp) AS time,\n CASE WHEN model_id = '' OR model_id IS NULL THEN '(unknown)' ELSE model_id END AS metric,\n ROUND(AVG(response_length)) AS value\nFROM _tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY DATE(timestamp), model_id\nORDER BY time", + "refId": "A" + } + ], + "title": "Avg Response Length by Model (Daily)", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": ["q_dev", "kiro", "model", "roi"], + "templating": { "list": [] }, + "time": { "from": "now-90d", "to": "now" }, + "timepicker": {}, + "timezone": "utc", + "title": "Kiro AI Model ROI", + "uid": "kiro_model_roi", + "version": 1 +} From f067fd42d36a8918462d20bfdc1d7035d0e80f41 Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sun, 22 Mar 2026 22:36:39 +0800 Subject: [PATCH 26/38] feat(q-dev): add Steering & Spec Mode Adoption dashboard (#8798) Track Kiro steering rules and spec mode adoption: - User/request adoption rate stats - Weekly adoption rate trend - Steering impact on prompt/response length - Per-user feature adoption table --- .../dashboards/SteeringAdoptionTracker.json | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 grafana/dashboards/SteeringAdoptionTracker.json diff --git a/grafana/dashboards/SteeringAdoptionTracker.json b/grafana/dashboards/SteeringAdoptionTracker.json new file mode 100644 index 00000000000..4a840893827 --- /dev/null +++ b/grafana/dashboards/SteeringAdoptionTracker.json @@ -0,0 +1,212 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "panels": [ + { + "datasource": "mysql", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "blue" }] }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 8, "x": 0, "y": 0 }, + "id": 1, + "options": { + "colorMode": "value", "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(COUNT(DISTINCT CASE WHEN has_steering = 1 THEN user_id END) * 100.0 / NULLIF(COUNT(DISTINCT user_id), 0), 0) AS 'value'\nFROM _tool_q_dev_chat_log WHERE $__timeFilter(timestamp)", + "refId": "A" + } + ], + "title": "Users with Steering", + "type": "stat" + }, + { + "datasource": "mysql", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "purple" }] }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 8, "x": 8, "y": 0 }, + "id": 2, + "options": { + "colorMode": "value", "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(COUNT(DISTINCT CASE WHEN is_spec_mode = 1 THEN user_id END) * 100.0 / NULLIF(COUNT(DISTINCT user_id), 0), 0) AS 'value'\nFROM _tool_q_dev_chat_log WHERE $__timeFilter(timestamp)", + "refId": "A" + } + ], + "title": "Users with Spec Mode", + "type": "stat" + }, + { + "datasource": "mysql", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green" }] }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { "h": 6, "w": 8, "x": 16, "y": 0 }, + "id": 3, + "options": { + "colorMode": "value", "graphMode": "area", + "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT ROUND(SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS 'value'\nFROM _tool_q_dev_chat_log WHERE $__timeFilter(timestamp)", + "refId": "A" + } + ], + "title": "Requests with Steering", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Weekly trend of steering and spec mode adoption rate", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 6 }, + "id": 4, + "options": { + "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_SUB(DATE(timestamp), INTERVAL WEEKDAY(DATE(timestamp)) DAY) AS time,\n SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) / COUNT(*) AS 'Steering Rate',\n SUM(CASE WHEN is_spec_mode = 1 THEN 1 ELSE 0 END) / COUNT(*) AS 'Spec Mode Rate'\nFROM _tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY DATE_SUB(DATE(timestamp), INTERVAL WEEKDAY(DATE(timestamp)) DAY)\nORDER BY time", + "refId": "A" + } + ], + "title": "Weekly Steering & Spec Mode Adoption Rate", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Compare prompt and response quality between steering and non-steering sessions", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "thresholds": { "mode": "absolute", "steps": [{ "color": "green" }] }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 14 }, + "id": 5, + "options": { + "barRadius": 0.1, "barWidth": 0.5, + "orientation": "horizontal", "showValue": "auto", "stacking": "none", + "tooltip": { "mode": "single" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT 'With Steering' AS 'Mode', ROUND(AVG(prompt_length)) AS 'Avg Prompt', ROUND(AVG(response_length)) AS 'Avg Response'\nFROM _tool_q_dev_chat_log WHERE has_steering = 1 AND $__timeFilter(timestamp)\nUNION ALL\nSELECT 'Without Steering', ROUND(AVG(prompt_length)), ROUND(AVG(response_length))\nFROM _tool_q_dev_chat_log WHERE has_steering = 0 AND $__timeFilter(timestamp)", + "refId": "A" + } + ], + "title": "Steering Impact: Prompt & Response Length", + "type": "bargauge" + }, + { + "datasource": "mysql", + "description": "Per-user steering and spec mode usage", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "custom": { "align": "auto", "cellOptions": { "type": "auto" }, "filterable": true }, + "thresholds": { "mode": "absolute", "steps": [{ "color": "green" }] } + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 14 }, + "id": 6, + "options": { "cellHeight": "sm", "showHeader": true }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n COALESCE(MAX(display_name), user_id) AS 'User',\n COUNT(*) AS 'Total Chats',\n SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) AS 'Steering',\n SUM(CASE WHEN is_spec_mode = 1 THEN 1 ELSE 0 END) AS 'Spec Mode',\n ROUND(SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS 'Steering %'\nFROM _tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY user_id\nORDER BY COUNT(*) DESC", + "refId": "A" + } + ], + "title": "Per-User Feature Adoption", + "type": "table" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": ["q_dev", "kiro", "steering", "adoption"], + "templating": { "list": [] }, + "time": { "from": "now-90d", "to": "now" }, + "timepicker": {}, + "timezone": "utc", + "title": "Kiro Steering & Spec Mode Adoption", + "uid": "kiro_steering_adoption", + "version": 1 +} From f1c5fa0eda9b6fd9346feb3471fd8b4dd574743b Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sun, 22 Mar 2026 22:36:56 +0800 Subject: [PATCH 27/38] feat(q-dev): add Developer AI Productivity Hours dashboard (#8797) Analyze when developers are most productive with AI tools: - AI Activity by Hour of Day (chat + completions stacked bar) - Prompt & Response Length by Hour (complexity patterns) - Feature Usage by Hour (steering/spec mode/plain chat) - AI Activity by Day of Week --- .../DeveloperProductivityHours.json | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 grafana/dashboards/DeveloperProductivityHours.json diff --git a/grafana/dashboards/DeveloperProductivityHours.json b/grafana/dashboards/DeveloperProductivityHours.json new file mode 100644 index 00000000000..3201acdc08b --- /dev/null +++ b/grafana/dashboards/DeveloperProductivityHours.json @@ -0,0 +1,162 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "panels": [ + { + "datasource": "mysql", + "description": "Chat and completion events by hour of day", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "bars", "fillOpacity": 80, "lineWidth": 1, + "stacking": { "mode": "normal" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 0 }, + "id": 1, + "options": { + "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT LPAD(CAST(hr AS CHAR), 2, '0') AS 'Hour',\n SUM(chat) AS 'Chat Events', SUM(comp) AS 'Completion Events'\nFROM (\n SELECT HOUR(timestamp) AS hr, COUNT(*) AS chat, 0 AS comp\n FROM _tool_q_dev_chat_log WHERE $__timeFilter(timestamp)\n GROUP BY HOUR(timestamp)\n UNION ALL\n SELECT HOUR(timestamp) AS hr, 0 AS chat, COUNT(*) AS comp\n FROM _tool_q_dev_completion_log WHERE $__timeFilter(timestamp)\n GROUP BY HOUR(timestamp)\n) t GROUP BY hr ORDER BY hr", + "refId": "A" + } + ], + "title": "AI Activity by Hour of Day (UTC)", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Average prompt complexity and response richness by hour", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "showPoints": "auto", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 }, + "id": 2, + "options": { + "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT LPAD(CAST(HOUR(timestamp) AS CHAR), 2, '0') AS 'Hour',\n ROUND(AVG(prompt_length)) AS 'Avg Prompt Length',\n ROUND(AVG(response_length)) AS 'Avg Response Length'\nFROM _tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY HOUR(timestamp)\nORDER BY HOUR(timestamp)", + "refId": "A" + } + ], + "title": "Prompt & Response Length by Hour", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Steering and spec mode usage concentration by hour", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "bars", "fillOpacity": 80, "lineWidth": 1, + "stacking": { "mode": "normal" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 }, + "id": 3, + "options": { + "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT LPAD(CAST(HOUR(timestamp) AS CHAR), 2, '0') AS 'Hour',\n SUM(CASE WHEN has_steering = 1 THEN 1 ELSE 0 END) AS 'Steering',\n SUM(CASE WHEN is_spec_mode = 1 THEN 1 ELSE 0 END) AS 'Spec Mode',\n SUM(CASE WHEN has_steering = 0 AND is_spec_mode = 0 THEN 1 ELSE 0 END) AS 'Plain Chat'\nFROM _tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY HOUR(timestamp)\nORDER BY HOUR(timestamp)", + "refId": "A" + } + ], + "title": "Feature Usage by Hour", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Day-of-week activity pattern", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "bars", "fillOpacity": 80, "lineWidth": 1, + "stacking": { "mode": "normal" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 16 }, + "id": 4, + "options": { + "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n CASE DAYOFWEEK(timestamp)\n WHEN 1 THEN 'Sun' WHEN 2 THEN 'Mon' WHEN 3 THEN 'Tue'\n WHEN 4 THEN 'Wed' WHEN 5 THEN 'Thu' WHEN 6 THEN 'Fri' WHEN 7 THEN 'Sat'\n END AS 'Day',\n SUM(chat) AS 'Chat Events', SUM(comp) AS 'Completions'\nFROM (\n SELECT timestamp, COUNT(*) AS chat, 0 AS comp FROM _tool_q_dev_chat_log WHERE $__timeFilter(timestamp) GROUP BY timestamp\n UNION ALL\n SELECT timestamp, 0, COUNT(*) FROM _tool_q_dev_completion_log WHERE $__timeFilter(timestamp) GROUP BY timestamp\n) t\nGROUP BY DAYOFWEEK(timestamp)\nORDER BY DAYOFWEEK(timestamp)", + "refId": "A" + } + ], + "title": "AI Activity by Day of Week", + "type": "barchart" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": ["q_dev", "kiro", "productivity", "hours"], + "templating": { "list": [] }, + "time": { "from": "now-90d", "to": "now" }, + "timepicker": {}, + "timezone": "utc", + "title": "Developer AI Productivity Hours", + "uid": "kiro_productivity_hours", + "version": 1 +} From 2ab68aec01280a534b8d28d1e73ce4e638160b8d Mon Sep 17 00:00:00 2001 From: Warren Chen Date: Sun, 22 Mar 2026 22:37:08 +0800 Subject: [PATCH 28/38] feat(q-dev): add Language AI Heatmap dashboard (#8796) Analyze AI-assisted coding patterns by programming language: - Language Completion Profile table (requests, avg completions, context sizes, users per language) - Daily Completions by Language (stacked bar) - Active File Types During Chat (donut) - Avg Context Size by Language trend (top 5) --- grafana/dashboards/LanguageAIHeatmap.json | 156 ++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 grafana/dashboards/LanguageAIHeatmap.json diff --git a/grafana/dashboards/LanguageAIHeatmap.json b/grafana/dashboards/LanguageAIHeatmap.json new file mode 100644 index 00000000000..adb3958071e --- /dev/null +++ b/grafana/dashboards/LanguageAIHeatmap.json @@ -0,0 +1,156 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "panels": [ + { + "datasource": "mysql", + "description": "Completion requests, avg context size, and completion rate per language", + "fieldConfig": { + "defaults": { + "color": { "mode": "thresholds" }, + "custom": { "align": "auto", "cellOptions": { "type": "auto" }, "filterable": true }, + "thresholds": { "mode": "absolute", "steps": [{ "color": "green" }] } + }, + "overrides": [] + }, + "gridPos": { "h": 9, "w": 24, "x": 0, "y": 0 }, + "id": 1, + "options": { "cellHeight": "sm", "showHeader": true, "sortBy": [{ "desc": true, "displayName": "Requests" }] }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n CASE WHEN file_extension = '' THEN '(unknown)' ELSE file_extension END AS 'Language',\n COUNT(*) AS 'Requests',\n ROUND(AVG(completions_count), 2) AS 'Avg Completions',\n ROUND(AVG(left_context_length)) AS 'Avg Left Context',\n ROUND(AVG(right_context_length)) AS 'Avg Right Context',\n ROUND(AVG(left_context_length + right_context_length)) AS 'Avg Total Context',\n COUNT(DISTINCT user_id) AS 'Users'\nFROM _tool_q_dev_completion_log\nWHERE $__timeFilter(timestamp)\nGROUP BY file_extension\nORDER BY COUNT(*) DESC", + "refId": "A" + } + ], + "title": "Language Completion Profile", + "type": "table" + }, + { + "datasource": "mysql", + "description": "Daily completion requests by language", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "bars", "fillOpacity": 80, "lineWidth": 1, + "stacking": { "mode": "normal" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 9 }, + "id": 2, + "options": { + "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT DATE(timestamp) AS time,\n CASE WHEN file_extension = '' THEN '(unknown)' ELSE file_extension END AS metric,\n COUNT(*) AS value\nFROM _tool_q_dev_completion_log\nWHERE $__timeFilter(timestamp)\nGROUP BY DATE(timestamp), file_extension\nORDER BY time", + "refId": "A" + } + ], + "title": "Daily Completions by Language", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Which file types are most active during chat sessions", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "mappings": [], + "thresholds": { "mode": "absolute", "steps": [{ "color": "green" }] } + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 0, "y": 17 }, + "id": 3, + "options": { + "displayLabels": ["name", "percent"], + "legend": { "displayMode": "table", "placement": "right", "showLegend": true, "values": ["value", "percent"] }, + "pieType": "donut", + "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": true }, + "tooltip": { "mode": "single" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "table", + "rawQuery": true, + "rawSql": "SELECT\n CASE WHEN active_file_extension = '' OR active_file_extension IS NULL THEN '(no file)' ELSE active_file_extension END AS 'File Type',\n COUNT(*) AS 'Chat Events'\nFROM _tool_q_dev_chat_log\nWHERE $__timeFilter(timestamp)\nGROUP BY active_file_extension\nORDER BY COUNT(*) DESC\nLIMIT 10", + "refId": "A" + } + ], + "title": "Active File Types During Chat", + "type": "piechart" + }, + { + "datasource": "mysql", + "description": "Context size trends for top languages", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "drawStyle": "line", "fillOpacity": 10, "lineInterpolation": "smooth", "lineWidth": 2, + "showPoints": "never", "spanNulls": true, + "stacking": { "mode": "none" }, "thresholdsStyle": { "mode": "off" } + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 12, "x": 12, "y": 17 }, + "id": 4, + "options": { + "legend": { "calcs": ["mean"], "displayMode": "table", "placement": "right", "showLegend": true }, + "tooltip": { "mode": "multi" } + }, + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT DATE(timestamp) AS time,\n file_extension AS metric,\n ROUND(AVG(left_context_length + right_context_length)) AS value\nFROM _tool_q_dev_completion_log\nWHERE $__timeFilter(timestamp)\n AND file_extension IN (SELECT file_extension FROM _tool_q_dev_completion_log GROUP BY file_extension ORDER BY COUNT(*) DESC LIMIT 5)\nGROUP BY DATE(timestamp), file_extension\nORDER BY time", + "refId": "A" + } + ], + "title": "Avg Context Size by Language (Top 5)", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 41, + "tags": ["q_dev", "kiro", "language", "completions"], + "templating": { "list": [] }, + "time": { "from": "now-90d", "to": "now" }, + "timepicker": {}, + "timezone": "utc", + "title": "Kiro Language AI Heatmap", + "uid": "kiro_language_heatmap", + "version": 1 +} From ba7add542f233d020470282dab6c8df24502e87d Mon Sep 17 00:00:00 2001 From: Chris Pavlicek Date: Mon, 23 Mar 2026 14:21:55 +0000 Subject: [PATCH 29/38] Fix/circleci column names (#8799) * fix(circleci): rename created_at to created_date in jobs/workflows Add migration to copy created_at -> created_date and update models/converters. * fix(circleci): update pipeline parsing * test(circleci): add incremental tests for collectors --- .../plugins/circleci/e2e/incremental_test.go | 154 ++++++++++++++++++ .../_raw_circleci_api_jobs_incremental.csv | 73 +++++++++ ...raw_circleci_api_workflows_incremental.csv | 67 ++++++++ .../snapshot_tables/_tool_circleci_jobs.csv | 20 +-- .../_tool_circleci_jobs_incremental.csv | 7 + .../_tool_circleci_pipelines.csv | 22 +-- .../_tool_circleci_workflows_incremental.csv | 7 + .../e2e/snapshot_tables/cicd_pipelines.csv | 20 +-- backend/plugins/circleci/e2e/workflow_test.go | 2 +- backend/plugins/circleci/models/job.go | 2 +- ...60322_rename_created_at_to_created_date.go | 71 ++++++++ .../models/migrationscripts/register.go | 1 + backend/plugins/circleci/models/pipeline.go | 4 +- backend/plugins/circleci/models/workflow.go | 2 +- .../plugins/circleci/tasks/job_converter.go | 4 +- .../circleci/tasks/workflow_converter.go | 6 +- .../circleci/tasks/workflow_extractor.go | 4 +- 17 files changed, 423 insertions(+), 43 deletions(-) create mode 100644 backend/plugins/circleci/e2e/incremental_test.go create mode 100644 backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_jobs_incremental.csv create mode 100644 backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_workflows_incremental.csv create mode 100644 backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_jobs_incremental.csv create mode 100644 backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_workflows_incremental.csv create mode 100644 backend/plugins/circleci/models/migrationscripts/20260322_rename_created_at_to_created_date.go diff --git a/backend/plugins/circleci/e2e/incremental_test.go b/backend/plugins/circleci/e2e/incremental_test.go new file mode 100644 index 00000000000..85de8a7ba33 --- /dev/null +++ b/backend/plugins/circleci/e2e/incremental_test.go @@ -0,0 +1,154 @@ +/* +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 ( + "sort" + "testing" + "time" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/circleci/impl" + "github.com/apache/incubator-devlake/plugins/circleci/models" + "github.com/apache/incubator-devlake/plugins/circleci/tasks" + "github.com/stretchr/testify/assert" +) + +// TestCircleciWorkflowIncremental verifies that the workflow collector's incremental +// logic correctly filters pipelines by created_date. This is a regression test for +// the created_at -> created_date column rename. +func TestCircleciWorkflowIncremental(t *testing.T) { + var circleci impl.Circleci + + dataflowTester := e2ehelper.NewDataFlowTester(t, "circleci", circleci) + taskData := &tasks.CircleciTaskData{ + Options: &tasks.CircleciOptions{ + ConnectionId: 1, + ProjectSlug: "github/coldgust/coldgust.github.io", + }, + RegexEnricher: api.NewRegexEnricher(), + } + + // seed pipelines table via extraction + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_circleci_api_pipelines.csv", "_raw_circleci_api_pipelines") + dataflowTester.FlushTabler(&models.CircleciPipeline{}) + dataflowTester.Subtask(tasks.ExtractPipelinesMeta, taskData) + + // Part 1: verify the SQL query used by BuildInputIterator works with created_date. + // Pipelines #4-10 have created_date > 17:45 — assert the exact IDs returned. + createdAfter := time.Date(2023, 3, 25, 17, 45, 0, 0, time.UTC) + var pipelines []models.CircleciPipeline + assert.Nil(t, dataflowTester.Dal.All(&pipelines, + dal.Where("connection_id = ? AND project_slug = ? AND created_date > ?", + 1, "github/coldgust/coldgust.github.io", createdAfter), + )) + pipelineIds := make([]string, len(pipelines)) + for i, p := range pipelines { + pipelineIds[i] = p.Id + } + sort.Strings(pipelineIds) + assert.Equal(t, []string{ + "23622ee4-e150-4920-9d66-81533fa765a4", // pipeline #5 + "2c45280f-7fb3-4025-b703-a547c4a94916", // pipeline #4 + "70f3eb15-3b94-4f80-b65e-f23f4b74c33a", // pipeline #6 + "7fcc1623-edcc-4a76-ad20-cd81aa83519f", // pipeline #9 + "866e967d-f826-4470-aed6-fc0c92e98703", // pipeline #7 + "afe0cabe-e7ee-4eb7-bf13-bb6170d139f0", // pipeline #8 + "d323f088-02fa-4ed5-9696-fc2f89a27150", // pipeline #10 + }, pipelineIds) + + // Part 2: verify extraction with only the incrementally-collected workflow raw data + // (workflows for pipelines #4-9 only). + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_circleci_api_workflows_incremental.csv", "_raw_circleci_api_workflows") + dataflowTester.FlushTabler(&models.CircleciWorkflow{}) + dataflowTester.Subtask(tasks.ExtractWorkflowsMeta, taskData) + dataflowTester.VerifyTableWithOptions( + models.CircleciWorkflow{}, + e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_circleci_workflows_incremental.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + IgnoreFields: []string{"started_at", "stopped_at"}, + }, + ) +} + +// TestCircleciJobIncremental verifies that the job collector's incremental logic +// correctly filters workflows by created_date. Regression test for the column rename. +func TestCircleciJobIncremental(t *testing.T) { + var circleci impl.Circleci + + dataflowTester := e2ehelper.NewDataFlowTester(t, "circleci", circleci) + taskData := &tasks.CircleciTaskData{ + Options: &tasks.CircleciOptions{ + ConnectionId: 1, + ProjectSlug: "github/coldgust/coldgust.github.io", + }, + RegexEnricher: api.NewRegexEnricher(), + Project: &models.CircleciProject{ + Id: "abcd", + }, + } + + // seed workflows table via extraction (all 10 workflows including b3b77371 with null created_date) + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_circleci_api_workflows.csv", "_raw_circleci_api_workflows") + dataflowTester.FlushTabler(&models.CircleciWorkflow{}) + dataflowTester.Subtask(tasks.ExtractWorkflowsMeta, taskData) + + // Part 1: verify the SQL query used by BuildInputIterator works with created_date. + // Workflows for pipelines #4-9 have created_date > 17:45 — assert the exact IDs returned. + // Workflow b3b77371 (null created_date) is excluded by the > comparison. + createdAfter := time.Date(2023, 3, 25, 17, 45, 0, 0, time.UTC) + var workflows []models.CircleciWorkflow + assert.Nil(t, dataflowTester.Dal.All(&workflows, + dal.Where("connection_id = ? AND project_slug = ? AND created_date > ?", + 1, "github/coldgust/coldgust.github.io", createdAfter), + )) + workflowIds := make([]string, len(workflows)) + for i, w := range workflows { + workflowIds[i] = w.Id + } + sort.Strings(workflowIds) + assert.Equal(t, []string{ + "6731159f-5275-4bfa-ba70-39d343d63814", // pipeline #5 + "7370985a-9de3-4a47-acbc-e6a1fe8e5812", // pipeline #7 + "b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14", // pipeline #6 + "c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943", // pipeline #4 + "fc76deef-bcdd-4856-8e96-a8e2d1c5a85f", // pipeline #8 + "fd0bd4f5-264f-4e3c-a151-06153c018f78", // pipeline #9 + }, workflowIds) + + // Part 2: verify extraction with only the incrementally-collected job raw data + // (jobs for workflows from pipelines #4-9 only). + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_circleci_api_projects.csv", "_raw_circleci_api_projects") + dataflowTester.FlushTabler(&models.CircleciProject{}) + dataflowTester.Subtask(tasks.ExtractProjectsMeta, taskData) + + dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_circleci_api_jobs_incremental.csv", "_raw_circleci_api_jobs") + dataflowTester.FlushTabler(&models.CircleciJob{}) + dataflowTester.Subtask(tasks.ExtractJobsMeta, taskData) + dataflowTester.VerifyTableWithOptions( + models.CircleciJob{}, + e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_circleci_jobs_incremental.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }, + ) +} diff --git a/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_jobs_incremental.csv b/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_jobs_incremental.csv new file mode 100644 index 00000000000..24e3fbdcb6a --- /dev/null +++ b/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_jobs_incremental.csv @@ -0,0 +1,73 @@ +id,params,data,url,input,created_at +20,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""dependencies"" : [ ], + ""job_number"" : 5, + ""id"" : ""ab8c3282-0e74-4a41-834e-152a71280bed"", + ""started_at"" : ""2023-03-25T17:52:20Z"", + ""created_at"" : ""2023-03-25T17:52:20Z"", + ""name"" : ""build"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""type"" : ""build"", + ""stopped_at"" : ""2023-03-25T17:52:23Z"" + }",https://circleci.com/api/v2/workflow/6731159f-5275-4bfa-ba70-39d343d63814/job,"{""id"": ""6731159f-5275-4bfa-ba70-39d343d63814"", ""tag"": """", ""name"": """", ""status"": """", ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""errored_by"": """", ""started_by"": """", ""stopped_at"": null, ""canceled_by"": """", ""pipeline_id"": ""23622ee4-e150-4920-9d66-81533fa765a4"", ""ConnectionId"": 0, ""_raw_data_id"": 0, ""duration_sec"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""pipeline_number"": 0, ""_raw_data_params"": """", ""_raw_data_remark"": """"}",2023-03-28 15:39:58.775 +21,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""dependencies"" : [ ], + ""job_number"" : 7, + ""id"" : ""a00f80bc-f759-4900-97a5-2d121d80bde8"", + ""started_at"" : ""2023-03-25T17:56:27Z"", + ""created_at"" : ""2023-03-25T17:56:27Z"", + ""name"" : ""build"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""type"" : ""build"", + ""stopped_at"" : ""2023-03-25T17:56:43Z"" + }",https://circleci.com/api/v2/workflow/7370985a-9de3-4a47-acbc-e6a1fe8e5812/job,"{""id"": ""7370985a-9de3-4a47-acbc-e6a1fe8e5812"", ""tag"": """", ""name"": """", ""status"": """", ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""errored_by"": """", ""started_by"": """", ""stopped_at"": null, ""canceled_by"": """", ""pipeline_id"": ""866e967d-f826-4470-aed6-fc0c92e98703"", ""ConnectionId"": 0, ""_raw_data_id"": 0, ""duration_sec"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""pipeline_number"": 0, ""_raw_data_params"": """", ""_raw_data_remark"": """"}",2023-03-28 15:39:58.953 +23,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""dependencies"" : [ ], + ""job_number"" : 9, + ""id"" : ""2ff3594e-9da1-4306-aefa-77b72a97971e"", + ""started_at"" : ""2023-03-25T18:13:25Z"", + ""created_at"" : ""2023-03-25T18:13:25Z"", + ""name"" : ""build"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""success"", + ""type"" : ""build"", + ""stopped_at"" : ""2023-03-25T18:13:38Z"" + }",https://circleci.com/api/v2/workflow/fd0bd4f5-264f-4e3c-a151-06153c018f78/job,"{""id"": ""fd0bd4f5-264f-4e3c-a151-06153c018f78"", ""tag"": """", ""name"": """", ""status"": """", ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""errored_by"": """", ""started_by"": """", ""stopped_at"": null, ""canceled_by"": """", ""pipeline_id"": ""7fcc1623-edcc-4a76-ad20-cd81aa83519f"", ""ConnectionId"": 0, ""_raw_data_id"": 0, ""duration_sec"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""pipeline_number"": 0, ""_raw_data_params"": """", ""_raw_data_remark"": """"}",2023-03-28 15:39:59.299 +24,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""dependencies"" : [ ], + ""job_number"" : 6, + ""id"" : ""76c1f2cc-27ea-47aa-8167-48d2633abdba"", + ""started_at"" : ""2023-03-25T17:54:11Z"", + ""created_at"" : ""2023-03-25T17:54:11Z"", + ""name"" : ""build"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""type"" : ""build"", + ""stopped_at"" : ""2023-03-25T17:54:23Z"" + }",https://circleci.com/api/v2/workflow/b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14/job,"{""id"": ""b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14"", ""tag"": """", ""name"": """", ""status"": """", ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""errored_by"": """", ""started_by"": """", ""stopped_at"": null, ""canceled_by"": """", ""pipeline_id"": ""70f3eb15-3b94-4f80-b65e-f23f4b74c33a"", ""ConnectionId"": 0, ""_raw_data_id"": 0, ""duration_sec"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""pipeline_number"": 0, ""_raw_data_params"": """", ""_raw_data_remark"": """"}",2023-03-28 15:39:59.482 +25,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""dependencies"" : [ ], + ""job_number"" : 4, + ""id"" : ""a4af3dd5-a3ae-48e8-b634-e2d63aafbb5b"", + ""started_at"" : ""2023-03-25T17:50:22Z"", + ""created_at"" : ""2023-03-25T17:50:22Z"", + ""name"" : ""build"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""type"" : ""build"", + ""stopped_at"" : ""2023-03-25T17:50:25Z"" + }",https://circleci.com/api/v2/workflow/c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943/job,"{""id"": ""c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943"", ""tag"": """", ""name"": """", ""status"": """", ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""errored_by"": """", ""started_by"": """", ""stopped_at"": null, ""canceled_by"": """", ""pipeline_id"": ""2c45280f-7fb3-4025-b703-a547c4a94916"", ""ConnectionId"": 0, ""_raw_data_id"": 0, ""duration_sec"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""pipeline_number"": 0, ""_raw_data_params"": """", ""_raw_data_remark"": """"}",2023-03-28 15:39:59.663 +27,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""dependencies"" : [ ], + ""job_number"" : 8, + ""id"" : ""004e3e27-17d7-4ccb-9b21-a7f55bcf2b3e"", + ""started_at"" : ""2023-03-25T18:06:15Z"", + ""created_at"" : ""2023-03-25T18:06:15Z"", + ""name"" : ""build"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""type"" : ""build"", + ""stopped_at"" : ""2023-03-25T18:06:28Z"" + }",https://circleci.com/api/v2/workflow/fc76deef-bcdd-4856-8e96-a8e2d1c5a85f/job,"{""id"": ""fc76deef-bcdd-4856-8e96-a8e2d1c5a85f"", ""tag"": """", ""name"": """", ""status"": """", ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""errored_by"": """", ""started_by"": """", ""stopped_at"": null, ""canceled_by"": """", ""pipeline_id"": ""afe0cabe-e7ee-4eb7-bf13-bb6170d139f0"", ""ConnectionId"": 0, ""_raw_data_id"": 0, ""duration_sec"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""pipeline_number"": 0, ""_raw_data_params"": """", ""_raw_data_remark"": """"}",2023-03-28 15:40:00.022 diff --git a/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_workflows_incremental.csv b/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_workflows_incremental.csv new file mode 100644 index 00000000000..2a70cdd511d --- /dev/null +++ b/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_workflows_incremental.csv @@ -0,0 +1,67 @@ +id,params,data,url,input,created_at +19,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""pipeline_id"" : ""23622ee4-e150-4920-9d66-81533fa765a4"", + ""id"" : ""6731159f-5275-4bfa-ba70-39d343d63814"", + ""name"" : ""workflow"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""started_by"" : ""1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7"", + ""pipeline_number"" : 5, + ""created_at"" : ""2023-03-25T17:52:15Z"", + ""stopped_at"" : ""2023-03-25T17:52:23Z"" + }",https://circleci.com/api/v2/pipeline/23622ee4-e150-4920-9d66-81533fa765a4/workflow,"{""id"": ""23622ee4-e150-4920-9d66-81533fa765a4"", ""vcs"": {""tag"": """", ""branch"": """", ""commit"": {""body"": """", ""subject"": """"}, ""revision"": """", ""review_id"": """", ""review_url"": """", ""provider_name"": """", ""origin_repository_url"": """", ""target_repository_url"": """"}, ""state"": """", ""errors"": null, ""number"": 0, ""trigger"": {""type"": """", ""actor"": {""login"": """", ""avatar_url"": """"}, ""received_at"": """"}, ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""updated_at"": null, ""ConnectionId"": 0, ""_raw_data_id"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""_raw_data_params"": """", ""_raw_data_remark"": """", ""trigger_parameters"": null}",2023-03-28 15:39:56.782 +20,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""pipeline_id"" : ""2c45280f-7fb3-4025-b703-a547c4a94916"", + ""id"" : ""c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943"", + ""name"" : ""workflow"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""started_by"" : ""1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7"", + ""pipeline_number"" : 4, + ""created_at"" : ""2023-03-25T17:50:20Z"", + ""stopped_at"" : ""2023-03-25T17:50:25Z"" + }",https://circleci.com/api/v2/pipeline/2c45280f-7fb3-4025-b703-a547c4a94916/workflow,"{""id"": ""2c45280f-7fb3-4025-b703-a547c4a94916"", ""vcs"": {""tag"": """", ""branch"": """", ""commit"": {""body"": """", ""subject"": """"}, ""revision"": """", ""review_id"": """", ""review_url"": """", ""provider_name"": """", ""origin_repository_url"": """", ""target_repository_url"": """"}, ""state"": """", ""errors"": null, ""number"": 0, ""trigger"": {""type"": """", ""actor"": {""login"": """", ""avatar_url"": """"}, ""received_at"": """"}, ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""updated_at"": null, ""ConnectionId"": 0, ""_raw_data_id"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""_raw_data_params"": """", ""_raw_data_remark"": """", ""trigger_parameters"": null}",2023-03-28 15:39:56.849 +22,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""pipeline_id"" : ""7fcc1623-edcc-4a76-ad20-cd81aa83519f"", + ""id"" : ""fd0bd4f5-264f-4e3c-a151-06153c018f78"", + ""name"" : ""workflow"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""success"", + ""started_by"" : ""1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7"", + ""pipeline_number"" : 9, + ""created_at"" : ""2023-03-25T18:13:21Z"", + ""stopped_at"" : ""2023-03-25T18:13:38Z"" + }",https://circleci.com/api/v2/pipeline/7fcc1623-edcc-4a76-ad20-cd81aa83519f/workflow,"{""id"": ""7fcc1623-edcc-4a76-ad20-cd81aa83519f"", ""vcs"": {""tag"": """", ""branch"": """", ""commit"": {""body"": """", ""subject"": """"}, ""revision"": """", ""review_id"": """", ""review_url"": """", ""provider_name"": """", ""origin_repository_url"": """", ""target_repository_url"": """"}, ""state"": """", ""errors"": null, ""number"": 0, ""trigger"": {""type"": """", ""actor"": {""login"": """", ""avatar_url"": """"}, ""received_at"": """"}, ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""updated_at"": null, ""ConnectionId"": 0, ""_raw_data_id"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""_raw_data_params"": """", ""_raw_data_remark"": """", ""trigger_parameters"": null}",2023-03-28 15:39:57.179 +24,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""pipeline_id"" : ""866e967d-f826-4470-aed6-fc0c92e98703"", + ""id"" : ""7370985a-9de3-4a47-acbc-e6a1fe8e5812"", + ""name"" : ""workflow"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""started_by"" : ""1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7"", + ""pipeline_number"" : 7, + ""created_at"" : ""2023-03-25T17:56:24Z"", + ""stopped_at"" : ""2023-03-25T17:56:43Z"" + }",https://circleci.com/api/v2/pipeline/866e967d-f826-4470-aed6-fc0c92e98703/workflow,"{""id"": ""866e967d-f826-4470-aed6-fc0c92e98703"", ""vcs"": {""tag"": """", ""branch"": """", ""commit"": {""body"": """", ""subject"": """"}, ""revision"": """", ""review_id"": """", ""review_url"": """", ""provider_name"": """", ""origin_repository_url"": """", ""target_repository_url"": """"}, ""state"": """", ""errors"": null, ""number"": 0, ""trigger"": {""type"": """", ""actor"": {""login"": """", ""avatar_url"": """"}, ""received_at"": """"}, ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""updated_at"": null, ""ConnectionId"": 0, ""_raw_data_id"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""_raw_data_params"": """", ""_raw_data_remark"": """", ""trigger_parameters"": null}",2023-03-28 15:39:57.524 +26,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""pipeline_id"" : ""70f3eb15-3b94-4f80-b65e-f23f4b74c33a"", + ""id"" : ""b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14"", + ""name"" : ""workflow"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""started_by"" : ""1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7"", + ""pipeline_number"" : 6, + ""created_at"" : ""2023-03-25T17:54:09Z"", + ""stopped_at"" : ""2023-03-25T17:54:23Z"" + }",https://circleci.com/api/v2/pipeline/70f3eb15-3b94-4f80-b65e-f23f4b74c33a/workflow,"{""id"": ""70f3eb15-3b94-4f80-b65e-f23f4b74c33a"", ""vcs"": {""tag"": """", ""branch"": """", ""commit"": {""body"": """", ""subject"": """"}, ""revision"": """", ""review_id"": """", ""review_url"": """", ""provider_name"": """", ""origin_repository_url"": """", ""target_repository_url"": """"}, ""state"": """", ""errors"": null, ""number"": 0, ""trigger"": {""type"": """", ""actor"": {""login"": """", ""avatar_url"": """"}, ""received_at"": """"}, ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""updated_at"": null, ""ConnectionId"": 0, ""_raw_data_id"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""_raw_data_params"": """", ""_raw_data_remark"": """", ""trigger_parameters"": null}",2023-03-28 15:39:58.137 +27,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ + ""pipeline_id"" : ""afe0cabe-e7ee-4eb7-bf13-bb6170d139f0"", + ""id"" : ""fc76deef-bcdd-4856-8e96-a8e2d1c5a85f"", + ""name"" : ""workflow"", + ""project_slug"" : ""gh/coldgust/coldgust.github.io"", + ""status"" : ""failed"", + ""started_by"" : ""1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7"", + ""pipeline_number"" : 8, + ""created_at"" : ""2023-03-25T18:06:13Z"", + ""stopped_at"" : ""2023-03-25T18:06:28Z"" + }",https://circleci.com/api/v2/pipeline/afe0cabe-e7ee-4eb7-bf13-bb6170d139f0/workflow,"{""id"": ""afe0cabe-e7ee-4eb7-bf13-bb6170d139f0"", ""vcs"": {""tag"": """", ""branch"": """", ""commit"": {""body"": """", ""subject"": """"}, ""revision"": """", ""review_id"": """", ""review_url"": """", ""provider_name"": """", ""origin_repository_url"": """", ""target_repository_url"": """"}, ""state"": """", ""errors"": null, ""number"": 0, ""trigger"": {""type"": """", ""actor"": {""login"": """", ""avatar_url"": """"}, ""received_at"": """"}, ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""updated_at"": null, ""ConnectionId"": 0, ""_raw_data_id"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""_raw_data_params"": """", ""_raw_data_remark"": """", ""trigger_parameters"": null}",2023-03-28 15:39:58.245 diff --git a/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_jobs.csv b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_jobs.csv index 82f2b4c45fc..517060bd3e0 100644 --- a/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_jobs.csv +++ b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_jobs.csv @@ -1,10 +1,10 @@ -connection_id,workflow_id,id,project_slug,canceled_by,dependencies,job_number,queued_at,started_at,name,approved_by,status,type,approval_request_id,stopped_at,duration_sec,pipeline_id,duration -1,6731159f-5275-4bfa-ba70-39d343d63814,ab8c3282-0e74-4a41-834e-152a71280bed,github/coldgust/coldgust.github.io,,[],5,,2023-03-25T17:52:20.000+00:00,build,,failed,build,,2023-03-25T17:52:23.000+00:00,3,23622ee4-e150-4920-9d66-81533fa765a4,0 -1,7370985a-9de3-4a47-acbc-e6a1fe8e5812,a00f80bc-f759-4900-97a5-2d121d80bde8,github/coldgust/coldgust.github.io,,[],7,,2023-03-25T17:56:27.000+00:00,build,,failed,build,,2023-03-25T17:56:43.000+00:00,16,866e967d-f826-4470-aed6-fc0c92e98703,0 -1,89054eb2-8e85-4f5c-9a93-66d753a0e970,c46092f9-6f82-4a52-8d8b-bd70d365dfc2,github/coldgust/coldgust.github.io,,[],3,,2023-03-25T17:39:25.000+00:00,say-hello,,success,build,,2023-03-25T17:39:28.000+00:00,3,625ca634-68fe-4515-91f0-7ba8af51dc99,0 -1,8971a56b-5547-4824-94dd-07bb467524c5,7b96e45b-b10e-47a0-95d0-96580b88bdda,github/coldgust/coldgust.github.io,,[],2,,2023-03-25T17:12:20.000+00:00,say-hello,,success,build,,2023-03-25T17:12:23.000+00:00,3,87aad008-1ad5-486a-8174-fdeed846561a,0 -1,8fe60291-68f7-40e2-acec-d99bff4da713,afde48dd-7319-4973-b3c8-e00308ff7667,github/coldgust/coldgust.github.io,,[],1,,2023-03-25T17:12:20.000+00:00,say-hello,,success,build,,2023-03-25T17:12:22.000+00:00,2,afef32b3-5ffe-48d2-8d9e-46dcedd82554,0 -1,b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14,76c1f2cc-27ea-47aa-8167-48d2633abdba,github/coldgust/coldgust.github.io,,[],6,,2023-03-25T17:54:11.000+00:00,build,,failed,build,,2023-03-25T17:54:23.000+00:00,12,70f3eb15-3b94-4f80-b65e-f23f4b74c33a,0 -1,c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943,a4af3dd5-a3ae-48e8-b634-e2d63aafbb5b,github/coldgust/coldgust.github.io,,[],4,,2023-03-25T17:50:22.000+00:00,build,,failed,build,,2023-03-25T17:50:25.000+00:00,3,2c45280f-7fb3-4025-b703-a547c4a94916,0 -1,fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,004e3e27-17d7-4ccb-9b21-a7f55bcf2b3e,github/coldgust/coldgust.github.io,,[],8,,2023-03-25T18:06:15.000+00:00,build,,failed,build,,2023-03-25T18:06:28.000+00:00,13,afe0cabe-e7ee-4eb7-bf13-bb6170d139f0,0 -1,fd0bd4f5-264f-4e3c-a151-06153c018f78,2ff3594e-9da1-4306-aefa-77b72a97971e,github/coldgust/coldgust.github.io,,[],9,,2023-03-25T18:13:25.000+00:00,build,,success,build,,2023-03-25T18:13:38.000+00:00,13,7fcc1623-edcc-4a76-ad20-cd81aa83519f,0 +connection_id,workflow_id,id,project_slug,canceled_by,dependencies,job_number,created_date,queued_at,started_at,name,approved_by,status,type,approval_request_id,stopped_at,duration_sec,pipeline_id,duration +1,6731159f-5275-4bfa-ba70-39d343d63814,ab8c3282-0e74-4a41-834e-152a71280bed,github/coldgust/coldgust.github.io,,[],5,2023-03-25T17:52:20.000+00:00,,2023-03-25T17:52:20.000+00:00,build,,failed,build,,2023-03-25T17:52:23.000+00:00,3,23622ee4-e150-4920-9d66-81533fa765a4,0 +1,7370985a-9de3-4a47-acbc-e6a1fe8e5812,a00f80bc-f759-4900-97a5-2d121d80bde8,github/coldgust/coldgust.github.io,,[],7,2023-03-25T17:56:27.000+00:00,,2023-03-25T17:56:27.000+00:00,build,,failed,build,,2023-03-25T17:56:43.000+00:00,16,866e967d-f826-4470-aed6-fc0c92e98703,0 +1,89054eb2-8e85-4f5c-9a93-66d753a0e970,c46092f9-6f82-4a52-8d8b-bd70d365dfc2,github/coldgust/coldgust.github.io,,[],3,2023-03-25T17:39:25.000+00:00,,2023-03-25T17:39:25.000+00:00,say-hello,,success,build,,2023-03-25T17:39:28.000+00:00,3,625ca634-68fe-4515-91f0-7ba8af51dc99,0 +1,8971a56b-5547-4824-94dd-07bb467524c5,7b96e45b-b10e-47a0-95d0-96580b88bdda,github/coldgust/coldgust.github.io,,[],2,2023-03-25T17:12:20.000+00:00,,2023-03-25T17:12:20.000+00:00,say-hello,,success,build,,2023-03-25T17:12:23.000+00:00,3,87aad008-1ad5-486a-8174-fdeed846561a,0 +1,8fe60291-68f7-40e2-acec-d99bff4da713,afde48dd-7319-4973-b3c8-e00308ff7667,github/coldgust/coldgust.github.io,,[],1,2023-03-25T17:12:20.000+00:00,,2023-03-25T17:12:20.000+00:00,say-hello,,success,build,,2023-03-25T17:12:22.000+00:00,2,afef32b3-5ffe-48d2-8d9e-46dcedd82554,0 +1,b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14,76c1f2cc-27ea-47aa-8167-48d2633abdba,github/coldgust/coldgust.github.io,,[],6,2023-03-25T17:54:11.000+00:00,,2023-03-25T17:54:11.000+00:00,build,,failed,build,,2023-03-25T17:54:23.000+00:00,12,70f3eb15-3b94-4f80-b65e-f23f4b74c33a,0 +1,c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943,a4af3dd5-a3ae-48e8-b634-e2d63aafbb5b,github/coldgust/coldgust.github.io,,[],4,2023-03-25T17:50:22.000+00:00,,2023-03-25T17:50:22.000+00:00,build,,failed,build,,2023-03-25T17:50:25.000+00:00,3,2c45280f-7fb3-4025-b703-a547c4a94916,0 +1,fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,004e3e27-17d7-4ccb-9b21-a7f55bcf2b3e,github/coldgust/coldgust.github.io,,[],8,2023-03-25T18:06:15.000+00:00,,2023-03-25T18:06:15.000+00:00,build,,failed,build,,2023-03-25T18:06:28.000+00:00,13,afe0cabe-e7ee-4eb7-bf13-bb6170d139f0,0 +1,fd0bd4f5-264f-4e3c-a151-06153c018f78,2ff3594e-9da1-4306-aefa-77b72a97971e,github/coldgust/coldgust.github.io,,[],9,2023-03-25T18:13:25.000+00:00,,2023-03-25T18:13:25.000+00:00,build,,success,build,,2023-03-25T18:13:38.000+00:00,13,7fcc1623-edcc-4a76-ad20-cd81aa83519f,0 diff --git a/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_jobs_incremental.csv b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_jobs_incremental.csv new file mode 100644 index 00000000000..ea9a23a4456 --- /dev/null +++ b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_jobs_incremental.csv @@ -0,0 +1,7 @@ +connection_id,workflow_id,id,project_slug,canceled_by,dependencies,job_number,created_date,queued_at,started_at,name,approved_by,status,type,approval_request_id,stopped_at,duration_sec,pipeline_id,duration +1,6731159f-5275-4bfa-ba70-39d343d63814,ab8c3282-0e74-4a41-834e-152a71280bed,github/coldgust/coldgust.github.io,,[],5,2023-03-25T17:52:20.000+00:00,,2023-03-25T17:52:20.000+00:00,build,,failed,build,,2023-03-25T17:52:23.000+00:00,3,23622ee4-e150-4920-9d66-81533fa765a4,0 +1,7370985a-9de3-4a47-acbc-e6a1fe8e5812,a00f80bc-f759-4900-97a5-2d121d80bde8,github/coldgust/coldgust.github.io,,[],7,2023-03-25T17:56:27.000+00:00,,2023-03-25T17:56:27.000+00:00,build,,failed,build,,2023-03-25T17:56:43.000+00:00,16,866e967d-f826-4470-aed6-fc0c92e98703,0 +1,b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14,76c1f2cc-27ea-47aa-8167-48d2633abdba,github/coldgust/coldgust.github.io,,[],6,2023-03-25T17:54:11.000+00:00,,2023-03-25T17:54:11.000+00:00,build,,failed,build,,2023-03-25T17:54:23.000+00:00,12,70f3eb15-3b94-4f80-b65e-f23f4b74c33a,0 +1,c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943,a4af3dd5-a3ae-48e8-b634-e2d63aafbb5b,github/coldgust/coldgust.github.io,,[],4,2023-03-25T17:50:22.000+00:00,,2023-03-25T17:50:22.000+00:00,build,,failed,build,,2023-03-25T17:50:25.000+00:00,3,2c45280f-7fb3-4025-b703-a547c4a94916,0 +1,fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,004e3e27-17d7-4ccb-9b21-a7f55bcf2b3e,github/coldgust/coldgust.github.io,,[],8,2023-03-25T18:06:15.000+00:00,,2023-03-25T18:06:15.000+00:00,build,,failed,build,,2023-03-25T18:06:28.000+00:00,13,afe0cabe-e7ee-4eb7-bf13-bb6170d139f0,0 +1,fd0bd4f5-264f-4e3c-a151-06153c018f78,2ff3594e-9da1-4306-aefa-77b72a97971e,github/coldgust/coldgust.github.io,,[],9,2023-03-25T18:13:25.000+00:00,,2023-03-25T18:13:25.000+00:00,build,,success,build,,2023-03-25T18:13:38.000+00:00,13,7fcc1623-edcc-4a76-ad20-cd81aa83519f,0 diff --git a/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_pipelines.csv b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_pipelines.csv index dd01015be55..3d55ea884ea 100644 --- a/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_pipelines.csv +++ b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_pipelines.csv @@ -1,11 +1,11 @@ -connection_id,id,project_slug,errors,updated_at,number,trigger_parameters,state,created_at,trigger,vcs,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark -1,23622ee4-e150-4920-9d66-81533fa765a4,github/coldgust/coldgust.github.io,[],2023-03-25 17:52:15.651,5,,created,2023-03-25 17:52:15.651,"{""type"":""webhook"",""received_at"":""2023-03-25T17:52:15.446Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""d65e36c3316c6350c0eeb2dcaa6411a49d2aa29d"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,26,"" -1,2c45280f-7fb3-4025-b703-a547c4a94916,github/coldgust/coldgust.github.io,[],2023-03-25 17:50:20.316,4,,created,2023-03-25 17:50:20.316,"{""type"":""webhook"",""received_at"":""2023-03-25T17:50:20.150Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""5d69b9233ed0579b0726caa9d36564cf90a7c63f"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,27,"" -1,625ca634-68fe-4515-91f0-7ba8af51dc99,github/coldgust/coldgust.github.io,[],2023-03-25 17:39:23.233,3,,created,2023-03-25 17:39:23.233,"{""type"":""webhook"",""received_at"":""2023-03-25T17:39:22.921Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""circleci-project-setup"",""review_id"":"""",""review_url"":"""",""revision"":""578575831946b53b763ef2807580320f8d8ff12d"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""Add .circleci/config.yml"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,28,"" -1,70f3eb15-3b94-4f80-b65e-f23f4b74c33a,github/coldgust/coldgust.github.io,[],2023-03-25 17:54:08.987,6,,created,2023-03-25 17:54:08.987,"{""type"":""webhook"",""received_at"":""2023-03-25T17:54:08.742Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""fd096b2dbc1ae2ea4c37e7af5101b123e7f60223"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,25,"" -1,7fcc1623-edcc-4a76-ad20-cd81aa83519f,github/coldgust/coldgust.github.io,[],2023-03-25 18:13:21.590,9,,created,2023-03-25 18:13:21.590,"{""type"":""webhook"",""received_at"":""2023-03-25T18:13:21.404Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""49874a6ac988e2b3434501d4a4554c54583e6820"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,22,"" -1,866e967d-f826-4470-aed6-fc0c92e98703,github/coldgust/coldgust.github.io,[],2023-03-25 17:56:24.409,7,,created,2023-03-25 17:56:24.409,"{""type"":""webhook"",""received_at"":""2023-03-25T17:56:24.245Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""ad3aab6479048a72b6aade91b36fdeb7125a16a6"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,24,"" -1,87aad008-1ad5-486a-8174-fdeed846561a,github/coldgust/coldgust.github.io,[],2023-03-25 17:12:18.747,2,,created,2023-03-25 17:12:18.747,"{""type"":""webhook"",""received_at"":""2023-03-25T17:12:18.624Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""circleci-project-setup"",""review_id"":"""",""review_url"":"""",""revision"":""9fcceda0e9749bc63e6397b23531fb6bf83634df"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""Add .circleci/config.yml"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,29,"" -1,afe0cabe-e7ee-4eb7-bf13-bb6170d139f0,github/coldgust/coldgust.github.io,[],2023-03-25 18:06:13.404,8,,created,2023-03-25 18:06:13.404,"{""type"":""webhook"",""received_at"":""2023-03-25T18:06:13.246Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""7fb6961080f03defe9b7abb35a111a560e6ab1cc"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,23,"" -1,afef32b3-5ffe-48d2-8d9e-46dcedd82554,github/coldgust/coldgust.github.io,[],2023-03-25 17:12:18.398,1,,created,2023-03-25 17:12:18.398,"{""type"":""api"",""received_at"":""2023-03-25T17:12:16.438Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""circleci-project-setup"",""review_id"":"""",""review_url"":"""",""revision"":""9fcceda0e9749bc63e6397b23531fb6bf83634df"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":"""",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,30,"" -1,d323f088-02fa-4ed5-9696-fc2f89a27150,github/coldgust/coldgust.github.io,"[{""type"":""config-fetch"",""message"":""Failed to fetch config.yml file.""}]",2023-03-25 18:13:43.446,10,"{""circleci"":{""org_name"":""coldgust"",""project_name"":""coldgust.github.io"",""provider_name"":""github""},""git"":{""checkout_sha"":""6ba0cdaf7e7791c5bc5aa89a13b9cd184f8ad296""}}",errored,2023-03-25 18:13:43.446,"{""type"":""Decoupled Ingestion System"",""received_at"":""1970-01-01T00:00:00.000Z"",""actor"":{""login"":"""",""avatar_url"":""""}}","{""provider_name"":"""",""target_repository_url"":"""",""branch"":"""",""review_id"":"""",""review_url"":"""",""revision"":"""",""tag"":"""",""origin_repository_url"":"""",""commit"":{""subject"":"""",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,21,"" +connection_id,id,project_slug,errors,updated_date,number,trigger_parameters,state,created_date,trigger,vcs,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark +1,23622ee4-e150-4920-9d66-81533fa765a4,github/coldgust/coldgust.github.io,[],2023-03-25T17:52:15.651+00:00,5,,created,2023-03-25T17:52:15.651+00:00,"{""type"":""webhook"",""received_at"":""2023-03-25T17:52:15.446Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""d65e36c3316c6350c0eeb2dcaa6411a49d2aa29d"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,26,"" +1,2c45280f-7fb3-4025-b703-a547c4a94916,github/coldgust/coldgust.github.io,[],2023-03-25T17:50:20.316+00:00,4,,created,2023-03-25T17:50:20.316+00:00,"{""type"":""webhook"",""received_at"":""2023-03-25T17:50:20.150Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""5d69b9233ed0579b0726caa9d36564cf90a7c63f"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,27,"" +1,625ca634-68fe-4515-91f0-7ba8af51dc99,github/coldgust/coldgust.github.io,[],2023-03-25T17:39:23.233+00:00,3,,created,2023-03-25T17:39:23.233+00:00,"{""type"":""webhook"",""received_at"":""2023-03-25T17:39:22.921Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""circleci-project-setup"",""review_id"":"""",""review_url"":"""",""revision"":""578575831946b53b763ef2807580320f8d8ff12d"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""Add .circleci/config.yml"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,28,"" +1,70f3eb15-3b94-4f80-b65e-f23f4b74c33a,github/coldgust/coldgust.github.io,[],2023-03-25T17:54:08.987+00:00,6,,created,2023-03-25T17:54:08.987+00:00,"{""type"":""webhook"",""received_at"":""2023-03-25T17:54:08.742Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""fd096b2dbc1ae2ea4c37e7af5101b123e7f60223"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,25,"" +1,7fcc1623-edcc-4a76-ad20-cd81aa83519f,github/coldgust/coldgust.github.io,[],2023-03-25T18:13:21.590+00:00,9,,created,2023-03-25T18:13:21.590+00:00,"{""type"":""webhook"",""received_at"":""2023-03-25T18:13:21.404Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""49874a6ac988e2b3434501d4a4554c54583e6820"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,22,"" +1,866e967d-f826-4470-aed6-fc0c92e98703,github/coldgust/coldgust.github.io,[],2023-03-25T17:56:24.409+00:00,7,,created,2023-03-25T17:56:24.409+00:00,"{""type"":""webhook"",""received_at"":""2023-03-25T17:56:24.245Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""ad3aab6479048a72b6aade91b36fdeb7125a16a6"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,24,"" +1,87aad008-1ad5-486a-8174-fdeed846561a,github/coldgust/coldgust.github.io,[],2023-03-25T17:12:18.747+00:00,2,,created,2023-03-25T17:12:18.747+00:00,"{""type"":""webhook"",""received_at"":""2023-03-25T17:12:18.624Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""circleci-project-setup"",""review_id"":"""",""review_url"":"""",""revision"":""9fcceda0e9749bc63e6397b23531fb6bf83634df"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""Add .circleci/config.yml"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,29,"" +1,afe0cabe-e7ee-4eb7-bf13-bb6170d139f0,github/coldgust/coldgust.github.io,[],2023-03-25T18:06:13.404+00:00,8,,created,2023-03-25T18:06:13.404+00:00,"{""type"":""webhook"",""received_at"":""2023-03-25T18:06:13.246Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""master"",""review_id"":"""",""review_url"":"""",""revision"":""7fb6961080f03defe9b7abb35a111a560e6ab1cc"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":""add circle"",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,23,"" +1,afef32b3-5ffe-48d2-8d9e-46dcedd82554,github/coldgust/coldgust.github.io,[],2023-03-25T17:12:18.398+00:00,1,,created,2023-03-25T17:12:18.398+00:00,"{""type"":""api"",""received_at"":""2023-03-25T17:12:16.438Z"",""actor"":{""login"":""coldgust"",""avatar_url"":""https://avatars.githubusercontent.com/u/115207009?v=4""}}","{""provider_name"":""GitHub"",""target_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""branch"":""circleci-project-setup"",""review_id"":"""",""review_url"":"""",""revision"":""9fcceda0e9749bc63e6397b23531fb6bf83634df"",""tag"":"""",""origin_repository_url"":""https://github.com/coldgust/coldgust.github.io"",""commit"":{""subject"":"""",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,30,"" +1,d323f088-02fa-4ed5-9696-fc2f89a27150,github/coldgust/coldgust.github.io,"[{""type"":""config-fetch"",""message"":""Failed to fetch config.yml file.""}]",2023-03-25T18:13:43.446+00:00,10,"{""circleci"":{""org_name"":""coldgust"",""project_name"":""coldgust.github.io"",""provider_name"":""github""},""git"":{""checkout_sha"":""6ba0cdaf7e7791c5bc5aa89a13b9cd184f8ad296""}}",errored,2023-03-25T18:13:43.446+00:00,"{""type"":""Decoupled Ingestion System"",""received_at"":""1970-01-01T00:00:00.000Z"",""actor"":{""login"":"""",""avatar_url"":""""}}","{""provider_name"":"""",""target_repository_url"":"""",""branch"":"""",""review_id"":"""",""review_url"":"""",""revision"":"""",""tag"":"""",""origin_repository_url"":"""",""commit"":{""subject"":"""",""body"":""""}}","{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}",_raw_circleci_api_pipelines,21,"" diff --git a/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_workflows_incremental.csv b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_workflows_incremental.csv new file mode 100644 index 00000000000..529e847441b --- /dev/null +++ b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_workflows_incremental.csv @@ -0,0 +1,7 @@ +connection_id,id,project_slug,pipeline_id,canceled_by,name,errored_by,tag,status,started_by,pipeline_number,created_date,stopped_date,duration_sec +1,6731159f-5275-4bfa-ba70-39d343d63814,github/coldgust/coldgust.github.io,23622ee4-e150-4920-9d66-81533fa765a4,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,5,2023-03-25T17:52:15.000+00:00,2023-03-25T17:52:23.000+00:00,8 +1,7370985a-9de3-4a47-acbc-e6a1fe8e5812,github/coldgust/coldgust.github.io,866e967d-f826-4470-aed6-fc0c92e98703,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,7,2023-03-25T17:56:24.000+00:00,2023-03-25T17:56:43.000+00:00,19 +1,b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14,github/coldgust/coldgust.github.io,70f3eb15-3b94-4f80-b65e-f23f4b74c33a,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,6,2023-03-25T17:54:09.000+00:00,2023-03-25T17:54:23.000+00:00,14 +1,c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943,github/coldgust/coldgust.github.io,2c45280f-7fb3-4025-b703-a547c4a94916,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,4,2023-03-25T17:50:20.000+00:00,2023-03-25T17:50:25.000+00:00,5 +1,fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,github/coldgust/coldgust.github.io,afe0cabe-e7ee-4eb7-bf13-bb6170d139f0,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,8,2023-03-25T18:06:13.000+00:00,2023-03-25T18:06:28.000+00:00,15 +1,fd0bd4f5-264f-4e3c-a151-06153c018f78,github/coldgust/coldgust.github.io,7fcc1623-edcc-4a76-ad20-cd81aa83519f,,workflow,,,success,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,9,2023-03-25T18:13:21.000+00:00,2023-03-25T18:13:38.000+00:00,17 diff --git a/backend/plugins/circleci/e2e/snapshot_tables/cicd_pipelines.csv b/backend/plugins/circleci/e2e/snapshot_tables/cicd_pipelines.csv index 45f61d9cea6..54a7ede5d59 100644 --- a/backend/plugins/circleci/e2e/snapshot_tables/cicd_pipelines.csv +++ b/backend/plugins/circleci/e2e/snapshot_tables/cicd_pipelines.csv @@ -1,10 +1,10 @@ -id,name,display_title,url,result,status,original_status,original_result,type,duration_sec,queued_duration_sec,environment,queued_date,started_date,cicd_scope_id -circleci:CircleciWorkflow:1:6731159f-5275-4bfa-ba70-39d343d63814,workflow,workflow#5,,FAILURE,DONE,failed,,,8,,PRODUCTION,,2023-03-25T17:52:15.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:7370985a-9de3-4a47-acbc-e6a1fe8e5812,workflow,workflow#7,,FAILURE,DONE,failed,,,19,,PRODUCTION,,2023-03-25T17:56:24.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:89054eb2-8e85-4f5c-9a93-66d753a0e970,say-hello-workflow,say-hello-workflow#3,,SUCCESS,DONE,success,,,5,,PRODUCTION,,2023-03-25T17:39:23.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:8971a56b-5547-4824-94dd-07bb467524c5,say-hello-workflow,say-hello-workflow#2,,SUCCESS,DONE,success,,,5,,PRODUCTION,,2023-03-25T17:12:18.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:8fe60291-68f7-40e2-acec-d99bff4da713,say-hello-workflow,say-hello-workflow#1,,SUCCESS,DONE,success,,,4,,PRODUCTION,,2023-03-25T17:12:18.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14,workflow,workflow#6,,FAILURE,DONE,failed,,,14,,PRODUCTION,,2023-03-25T17:54:09.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943,workflow,workflow#4,,FAILURE,DONE,failed,,,5,,PRODUCTION,,2023-03-25T17:50:20.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,workflow,workflow#8,,FAILURE,DONE,failed,,,15,,PRODUCTION,,2023-03-25T18:06:13.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:fd0bd4f5-264f-4e3c-a151-06153c018f78,workflow,workflow#9,,SUCCESS,DONE,success,,,17,,PRODUCTION,,2023-03-25T18:13:21.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +id,name,display_title,url,result,status,original_status,original_result,type,duration_sec,queued_duration_sec,environment,queued_date,started_date,created_date,cicd_scope_id +circleci:CircleciWorkflow:1:6731159f-5275-4bfa-ba70-39d343d63814,workflow,workflow#5,,FAILURE,DONE,failed,,,8,,PRODUCTION,,2023-03-25T17:52:15.000+00:00,2023-03-25T17:52:15.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:7370985a-9de3-4a47-acbc-e6a1fe8e5812,workflow,workflow#7,,FAILURE,DONE,failed,,,19,,PRODUCTION,,2023-03-25T17:56:24.000+00:00,2023-03-25T17:56:24.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:89054eb2-8e85-4f5c-9a93-66d753a0e970,say-hello-workflow,say-hello-workflow#3,,SUCCESS,DONE,success,,,5,,PRODUCTION,,2023-03-25T17:39:23.000+00:00,2023-03-25T17:39:23.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:8971a56b-5547-4824-94dd-07bb467524c5,say-hello-workflow,say-hello-workflow#2,,SUCCESS,DONE,success,,,5,,PRODUCTION,,2023-03-25T17:12:18.000+00:00,2023-03-25T17:12:18.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:8fe60291-68f7-40e2-acec-d99bff4da713,say-hello-workflow,say-hello-workflow#1,,SUCCESS,DONE,success,,,4,,PRODUCTION,,2023-03-25T17:12:18.000+00:00,2023-03-25T17:12:18.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14,workflow,workflow#6,,FAILURE,DONE,failed,,,14,,PRODUCTION,,2023-03-25T17:54:09.000+00:00,2023-03-25T17:54:09.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943,workflow,workflow#4,,FAILURE,DONE,failed,,,5,,PRODUCTION,,2023-03-25T17:50:20.000+00:00,2023-03-25T17:50:20.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,workflow,workflow#8,,FAILURE,DONE,failed,,,15,,PRODUCTION,,2023-03-25T18:06:13.000+00:00,2023-03-25T18:06:13.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:fd0bd4f5-264f-4e3c-a151-06153c018f78,workflow,workflow#9,,SUCCESS,DONE,success,,,17,,PRODUCTION,,2023-03-25T18:13:21.000+00:00,2023-03-25T18:13:21.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io diff --git a/backend/plugins/circleci/e2e/workflow_test.go b/backend/plugins/circleci/e2e/workflow_test.go index cc542fdb27f..ba5194cea68 100644 --- a/backend/plugins/circleci/e2e/workflow_test.go +++ b/backend/plugins/circleci/e2e/workflow_test.go @@ -72,7 +72,7 @@ func TestCircleciWorkflow(t *testing.T) { devops.CICDPipeline{}, e2ehelper.TableOptions{ CSVRelPath: "./snapshot_tables/cicd_pipelines.csv", - IgnoreFields: []string{"finished_date", "created_date", "is_child"}, + IgnoreFields: []string{"finished_date", "is_child"}, IgnoreTypes: []interface{}{domainlayer.DomainEntity{}}, }, ) diff --git a/backend/plugins/circleci/models/job.go b/backend/plugins/circleci/models/job.go index bafaf5b9ebb..c8a3bea31cb 100644 --- a/backend/plugins/circleci/models/job.go +++ b/backend/plugins/circleci/models/job.go @@ -29,7 +29,7 @@ type CircleciJob struct { CanceledBy string `gorm:"type:varchar(100)" json:"canceled_by"` Dependencies []string `gorm:"serializer:json;type:text" json:"dependencies"` JobNumber int64 `json:"job_number"` - CreatedAt *common.Iso8601Time `json:"created_at"` + CreatedDate *common.Iso8601Time `json:"created_at"` QueuedAt *common.Iso8601Time `json:"queued_at"` StartedAt *common.Iso8601Time `json:"started_at"` Name string `gorm:"type:varchar(255)" json:"name"` diff --git a/backend/plugins/circleci/models/migrationscripts/20260322_rename_created_at_to_created_date.go b/backend/plugins/circleci/models/migrationscripts/20260322_rename_created_at_to_created_date.go new file mode 100644 index 00000000000..497c0d3b5a6 --- /dev/null +++ b/backend/plugins/circleci/models/migrationscripts/20260322_rename_created_at_to_created_date.go @@ -0,0 +1,71 @@ +/* +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 migrationscripts + +import ( + "time" + + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" +) + +type circleciWorkflow20260322 struct { + CreatedDate *time.Time +} + +func (circleciWorkflow20260322) TableName() string { + return "_tool_circleci_workflows" +} + +type circleciJob20260322 struct { + CreatedDate *time.Time +} + +func (circleciJob20260322) TableName() string { + return "_tool_circleci_jobs" +} + +type renameCreatedAtToCreatedDate20260322 struct{} + +func (*renameCreatedAtToCreatedDate20260322) Up(basicRes context.BasicRes) errors.Error { + db := basicRes.GetDal() + + if err := db.AutoMigrate(&circleciWorkflow20260322{}); err != nil { + return err + } + if err := db.Exec("UPDATE _tool_circleci_workflows SET created_date = created_at WHERE created_date IS NULL"); err != nil { + return err + } + + if err := db.AutoMigrate(&circleciJob20260322{}); err != nil { + return err + } + if err := db.Exec("UPDATE _tool_circleci_jobs SET created_date = created_at WHERE created_date IS NULL"); err != nil { + return err + } + + return nil +} + +func (*renameCreatedAtToCreatedDate20260322) Version() uint64 { + return 20260322000001 +} + +func (*renameCreatedAtToCreatedDate20260322) Name() string { + return "circleci rename created_at to created_date in workflows and jobs" +} diff --git a/backend/plugins/circleci/models/migrationscripts/register.go b/backend/plugins/circleci/models/migrationscripts/register.go index 5a23f27cc85..af8472a3cd7 100644 --- a/backend/plugins/circleci/models/migrationscripts/register.go +++ b/backend/plugins/circleci/models/migrationscripts/register.go @@ -24,5 +24,6 @@ func All() []plugin.MigrationScript { return []plugin.MigrationScript{ new(addInitTables), new(addFieldsToCircleciJob20231129), + new(renameCreatedAtToCreatedDate20260322), } } diff --git a/backend/plugins/circleci/models/pipeline.go b/backend/plugins/circleci/models/pipeline.go index a18cded109d..a775ac4b2f4 100644 --- a/backend/plugins/circleci/models/pipeline.go +++ b/backend/plugins/circleci/models/pipeline.go @@ -49,8 +49,8 @@ type CircleciPipeline struct { ConnectionId uint64 `gorm:"primaryKey;type:BIGINT" json:"connectionId" mapstructure:"connectionId"` Id string `gorm:"primaryKey;type:varchar(100)" json:"id" mapstructure:"id"` ProjectSlug string `gorm:"type:varchar(255)" json:"projectSlug" mapstructure:"projectSlug"` - UpdatedDate *common.Iso8601Time `json:"updatedDate" mapstructure:"updatedDate"` - CreatedDate *common.Iso8601Time `json:"createdDate" mapstructure:"createdDate"` + UpdatedDate *common.Iso8601Time `json:"updated_at"` + CreatedDate *common.Iso8601Time `json:"created_at"` Number int64 `json:"number" mapstructure:"number"` // pipeline number within the project? TriggerParameters any `gorm:"serializer:json" json:"trigger_parameters" mapstructure:"triggerParameters"` State string `gorm:"type:varchar(100)" json:"state" mapstructure:"state"` diff --git a/backend/plugins/circleci/models/workflow.go b/backend/plugins/circleci/models/workflow.go index f4e5e9f7111..0b1a330284e 100644 --- a/backend/plugins/circleci/models/workflow.go +++ b/backend/plugins/circleci/models/workflow.go @@ -33,7 +33,7 @@ type CircleciWorkflow struct { Status string `gorm:"type:varchar(100)" json:"status"` StartedBy string `gorm:"type:varchar(100)" json:"started_by"` PipelineNumber int64 `json:"pipeline_number"` - CreatedAt *common.Iso8601Time `json:"created_at"` + CreatedDate *common.Iso8601Time `json:"created_at"` StoppedAt *common.Iso8601Time `json:"stopped_at"` DurationSec float64 `json:"duration_sec"` diff --git a/backend/plugins/circleci/tasks/job_converter.go b/backend/plugins/circleci/tasks/job_converter.go index 2cb8de1207c..5a085609d9f 100644 --- a/backend/plugins/circleci/tasks/job_converter.go +++ b/backend/plugins/circleci/tasks/job_converter.go @@ -58,8 +58,8 @@ func ConvertJobs(taskCtx plugin.SubTaskContext) errors.Error { Convert: func(inputRow interface{}) ([]interface{}, errors.Error) { userTool := inputRow.(*models.CircleciJob) createdAt := time.Now() - if userTool.CreatedAt != nil { - createdAt = userTool.CreatedAt.ToTime() + if userTool.CreatedDate != nil { + createdAt = userTool.CreatedDate.ToTime() } task := &devops.CICDTask{ DomainEntity: domainlayer.DomainEntity{ diff --git a/backend/plugins/circleci/tasks/workflow_converter.go b/backend/plugins/circleci/tasks/workflow_converter.go index a023accc772..bf6b029e3e5 100644 --- a/backend/plugins/circleci/tasks/workflow_converter.go +++ b/backend/plugins/circleci/tasks/workflow_converter.go @@ -61,11 +61,11 @@ func ConvertWorkflows(taskCtx plugin.SubTaskContext) errors.Error { Convert: func(inputRow interface{}) ([]interface{}, errors.Error) { userTool := inputRow.(*models.CircleciWorkflow) // Skip if CreatedAt is null or empty string - still enters into the `_tool_circleci_workflows` table with null values - if userTool.CreatedAt.ToNullableTime() == nil { - logger.Info("CreatedAt is null or empty string in the CircleCI API response for %s", userTool.PipelineId) + if userTool.CreatedDate.ToNullableTime() == nil { + logger.Info("CreatedDate is null or empty string in the CircleCI API response for %s", userTool.PipelineId) return []interface{}{}, nil } - createdAt := userTool.CreatedAt.ToTime() + createdAt := userTool.CreatedDate.ToTime() pipeline := &devops.CICDPipeline{ DomainEntity: domainlayer.DomainEntity{ Id: getWorkflowIdGen().Generate(data.Options.ConnectionId, userTool.Id), diff --git a/backend/plugins/circleci/tasks/workflow_extractor.go b/backend/plugins/circleci/tasks/workflow_extractor.go index ba0639bc877..165c6d635d0 100644 --- a/backend/plugins/circleci/tasks/workflow_extractor.go +++ b/backend/plugins/circleci/tasks/workflow_extractor.go @@ -48,8 +48,8 @@ func ExtractWorkflows(taskCtx plugin.SubTaskContext) errors.Error { toolL := userRes toolL.ConnectionId = data.Options.ConnectionId toolL.ProjectSlug = data.Options.ProjectSlug - if userRes.CreatedAt != nil && userRes.StoppedAt != nil { - startTime := userRes.CreatedAt.ToTime() + if userRes.CreatedDate != nil && userRes.StoppedAt != nil { + startTime := userRes.CreatedDate.ToTime() endTime := userRes.StoppedAt.ToTime() toolL.DurationSec = float64(endTime.Sub(startTime).Milliseconds() / 1e3) } From 70ef0835c09cc08f1a5fbe8397d85e4a57abcb79 Mon Sep 17 00:00:00 2001 From: AvivGuiser Date: Mon, 23 Mar 2026 16:30:30 +0200 Subject: [PATCH 30/38] fix(jenkins): scope multi-branch build collection to current project (#8430) (#8781) The branch jobs query in collectMultiBranchJobApiBuilds selected all WorkflowJob entries across all multi-branch pipelines for a connection, causing builds to be duplicated and misattributed. Filter by _raw_data_params to collect only the current project's branch jobs. Co-authored-by: Claude Opus 4.6 (1M context) --- backend/plugins/jenkins/tasks/build_collector.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/plugins/jenkins/tasks/build_collector.go b/backend/plugins/jenkins/tasks/build_collector.go index 0d792c61454..a1ae7498754 100644 --- a/backend/plugins/jenkins/tasks/build_collector.go +++ b/backend/plugins/jenkins/tasks/build_collector.go @@ -146,12 +146,17 @@ func collectMultiBranchJobApiBuilds(taskCtx plugin.SubTaskContext) errors.Error logger := taskCtx.GetLogger() // Jobs added through the multi-branch workflow have _raw_data_table set to "jenkins_api_jobs". - // This check works, but it's not very robust. It would be better to use a more explicit check like a "source" column. + // Filter by _raw_data_params to scope to only this multi-branch project's branch jobs, + // preventing cross-project data mixing when multiple multi-branch pipelines exist. + jobParams := plugin.MarshalScopeParams(JenkinsApiParams{ + ConnectionId: data.Options.ConnectionId, + FullName: data.Options.JobFullName, + }) clauses := []dal.Clause{ dal.Select("j.full_name,j.name,j.path,j.class,j.url"), dal.From("_tool_jenkins_jobs as j"), - dal.Where(`j.connection_id = ? and j.class = ? and j._raw_data_table = ?`, - data.Options.ConnectionId, WORKFLOW_JOB, fmt.Sprintf("_raw_%s", RAW_JOB_TABLE)), + dal.Where(`j.connection_id = ? and j.class = ? and j._raw_data_table = ? and j._raw_data_params = ?`, + data.Options.ConnectionId, WORKFLOW_JOB, fmt.Sprintf("_raw_%s", RAW_JOB_TABLE), jobParams), } cursor, err := db.Cursor(clauses...) if err != nil { From 5011727b986e39b743c4934609a346dfe58e296c Mon Sep 17 00:00:00 2001 From: Shayne Clausson Date: Mon, 23 Mar 2026 15:36:55 +0100 Subject: [PATCH 31/38] fix: Make gh-copilot plugin database agnostic (#8779) Co-authored-by: Eldrick Wega --- .../gh-copilot/models/migrationscripts/20250100_initialize.go | 4 ++-- .../migrationscripts/20260116_add_name_fields_to_scopes.go | 4 ++-- .../models/migrationscripts/20260121_add_scope_configs.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/plugins/gh-copilot/models/migrationscripts/20250100_initialize.go b/backend/plugins/gh-copilot/models/migrationscripts/20250100_initialize.go index 23b4f67b48d..53dee4fbcb2 100644 --- a/backend/plugins/gh-copilot/models/migrationscripts/20250100_initialize.go +++ b/backend/plugins/gh-copilot/models/migrationscripts/20250100_initialize.go @@ -65,9 +65,9 @@ type ghCopilotScope20250100 struct { ScopeConfigId uint64 `json:"scopeConfigId,omitempty"` Id string `json:"id" gorm:"primaryKey;type:varchar(255)"` Organization string `json:"organization" gorm:"type:varchar(255)"` - ImplementationDate *time.Time `json:"implementationDate" gorm:"type:datetime"` + ImplementationDate *time.Time `json:"implementationDate"` BaselinePeriodDays int `json:"baselinePeriodDays" gorm:"default:90"` - SeatsLastSyncedAt *time.Time `json:"seatsLastSyncedAt" gorm:"type:datetime"` + SeatsLastSyncedAt *time.Time `json:"seatsLastSyncedAt"` } func (ghCopilotScope20250100) TableName() string { diff --git a/backend/plugins/gh-copilot/models/migrationscripts/20260116_add_name_fields_to_scopes.go b/backend/plugins/gh-copilot/models/migrationscripts/20260116_add_name_fields_to_scopes.go index a1e7c8c99ee..69df2c0b620 100644 --- a/backend/plugins/gh-copilot/models/migrationscripts/20260116_add_name_fields_to_scopes.go +++ b/backend/plugins/gh-copilot/models/migrationscripts/20260116_add_name_fields_to_scopes.go @@ -38,9 +38,9 @@ type ghCopilotScope20260116 struct { Organization string `json:"organization" gorm:"type:varchar(255)"` Name string `json:"name" gorm:"type:varchar(255)"` FullName string `json:"fullName" gorm:"type:varchar(255)"` - ImplementationDate *time.Time `json:"implementationDate" gorm:"type:datetime"` + ImplementationDate *time.Time `json:"implementationDate"` BaselinePeriodDays int `json:"baselinePeriodDays" gorm:"default:90"` - SeatsLastSyncedAt *time.Time `json:"seatsLastSyncedAt" gorm:"type:datetime"` + SeatsLastSyncedAt *time.Time `json:"seatsLastSyncedAt"` } func (ghCopilotScope20260116) TableName() string { diff --git a/backend/plugins/gh-copilot/models/migrationscripts/20260121_add_scope_configs.go b/backend/plugins/gh-copilot/models/migrationscripts/20260121_add_scope_configs.go index eb53b0a0640..4bd77391f1a 100644 --- a/backend/plugins/gh-copilot/models/migrationscripts/20260121_add_scope_configs.go +++ b/backend/plugins/gh-copilot/models/migrationscripts/20260121_add_scope_configs.go @@ -33,7 +33,7 @@ type scopeConfig20260121 struct { Entities []string `gorm:"type:json;serializer:json" json:"entities" mapstructure:"entities"` ConnectionId uint64 `json:"connectionId" gorm:"index" validate:"required" mapstructure:"connectionId,omitempty"` Name string `mapstructure:"name" json:"name" gorm:"type:varchar(255);uniqueIndex" validate:"required"` - ImplementationDate *time.Time `json:"implementationDate" mapstructure:"implementationDate" gorm:"type:datetime"` + ImplementationDate *time.Time `json:"implementationDate" mapstructure:"implementationDate"` BaselinePeriodDays int `json:"baselinePeriodDays" mapstructure:"baselinePeriodDays" gorm:"default:90"` } From af806ee09ca73ae7bdf833a4bc25cb6843d8659b Mon Sep 17 00:00:00 2001 From: Joshua Smith Date: Mon, 23 Mar 2026 08:40:58 -0600 Subject: [PATCH 32/38] fix(sonarqube): increase cq_issues and cq_file_metrics project_key length to 500 (#8783) Fixes #8331 --- .../codequality/cq_file_metrics.go | 2 +- .../domainlayer/codequality/cq_issues.go | 2 +- ...7_increase_cq_issues_project_key_length.go | 44 +++++++++++++++++++ .../core/models/migrationscripts/register.go | 1 + 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 backend/core/models/migrationscripts/20260317_increase_cq_issues_project_key_length.go diff --git a/backend/core/models/domainlayer/codequality/cq_file_metrics.go b/backend/core/models/domainlayer/codequality/cq_file_metrics.go index abc03b85f6f..dc069230e20 100644 --- a/backend/core/models/domainlayer/codequality/cq_file_metrics.go +++ b/backend/core/models/domainlayer/codequality/cq_file_metrics.go @@ -23,7 +23,7 @@ import ( type CqFileMetrics struct { domainlayer.DomainEntity - ProjectKey string `gorm:"index;type:varchar(255)"` //domain project key + ProjectKey string `gorm:"index;type:varchar(500)"` //domain project key FileName string `gorm:"type:varchar(2000)"` FilePath string FileLanguage string `gorm:"type:varchar(20)"` diff --git a/backend/core/models/domainlayer/codequality/cq_issues.go b/backend/core/models/domainlayer/codequality/cq_issues.go index 1e9ea7134a7..4441eb1d7c0 100644 --- a/backend/core/models/domainlayer/codequality/cq_issues.go +++ b/backend/core/models/domainlayer/codequality/cq_issues.go @@ -27,7 +27,7 @@ type CqIssue struct { Rule string `gorm:"type:varchar(255)"` Severity string `gorm:"type:varchar(100)"` Component string - ProjectKey string `gorm:"index;type:varchar(100)"` //domain project key + ProjectKey string `gorm:"index;type:varchar(500)"` //domain project key Line int Status string `gorm:"type:varchar(20)"` Message string diff --git a/backend/core/models/migrationscripts/20260317_increase_cq_issues_project_key_length.go b/backend/core/models/migrationscripts/20260317_increase_cq_issues_project_key_length.go new file mode 100644 index 00000000000..223a2b6a345 --- /dev/null +++ b/backend/core/models/migrationscripts/20260317_increase_cq_issues_project_key_length.go @@ -0,0 +1,44 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" +) + +var _ plugin.MigrationScript = (*increaseCqIssuesProjectKeyLength)(nil) + +type increaseCqIssuesProjectKeyLength struct{} + +func (script *increaseCqIssuesProjectKeyLength) Up(basicRes context.BasicRes) errors.Error { + db := basicRes.GetDal() + if err := db.ModifyColumnType("cq_issues", "project_key", "varchar(500)"); err != nil { + return err + } + return db.ModifyColumnType("cq_file_metrics", "project_key", "varchar(500)") +} + +func (*increaseCqIssuesProjectKeyLength) Version() uint64 { + return 20260317000000 +} + +func (*increaseCqIssuesProjectKeyLength) Name() string { + return "increase cq_issues and cq_file_metrics project_key length to 500" +} diff --git a/backend/core/models/migrationscripts/register.go b/backend/core/models/migrationscripts/register.go index 9372d8fbd02..9abb4f0aeae 100644 --- a/backend/core/models/migrationscripts/register.go +++ b/backend/core/models/migrationscripts/register.go @@ -143,5 +143,6 @@ func All() []plugin.MigrationScript { new(addPipelinePriority), new(fixNullPriority), new(modifyCicdDeploymentsToText), + new(increaseCqIssuesProjectKeyLength), } } From fdf587ca2f519f7060f977489ebc9c69fab03861 Mon Sep 17 00:00:00 2001 From: irfanuddinahmad <34648393+irfanuddinahmad@users.noreply.github.com> Date: Mon, 23 Mar 2026 19:41:37 +0500 Subject: [PATCH 33/38] feat: added taiga plugin (#8755) * feat: added taiga plugin * fix: fixed tests * feat(gh-copilot): add support for organization daily user metrics (#8747) * feat(circleci): add server version requirement and endpoint help text (#8757) Update CircleCI connection form to indicate Server v4.x+ requirement and provide guidance for server endpoint configuration. Signed-off-by: Joshua Smith * fix: fixed test files --------- Signed-off-by: Joshua Smith Co-authored-by: Reece Ward <47779818+ReeceXW@users.noreply.github.com> Co-authored-by: Joshua Smith --- backend/plugins/table_info_test.go | 2 + backend/plugins/taiga/api/blueprint_v200.go | 137 + backend/plugins/taiga/api/connection_api.go | 225 ++ backend/plugins/taiga/api/init.go | 53 + backend/plugins/taiga/api/remote_api.go | 132 + backend/plugins/taiga/api/scope_api.go | 52 + backend/plugins/taiga/api/scope_config_api.go | 47 + backend/plugins/taiga/e2e/epic_test.go | 74 + backend/plugins/taiga/e2e/issue_test.go | 77 + backend/plugins/taiga/e2e/project_test.go | 69 + .../e2e/raw_tables/_raw_taiga_api_epics.csv | 3 + .../e2e/raw_tables/_raw_taiga_api_issues.csv | 3 + .../raw_tables/_raw_taiga_api_projects.csv | 2 + .../e2e/raw_tables/_raw_taiga_api_tasks.csv | 3 + .../_raw_taiga_api_user_stories.csv | 3 + .../e2e/snapshot_tables/_tool_taiga_epics.csv | 3 + .../snapshot_tables/_tool_taiga_issues.csv | 3 + .../snapshot_tables/_tool_taiga_projects.csv | 2 + .../e2e/snapshot_tables/_tool_taiga_tasks.csv | 3 + .../_tool_taiga_user_stories.csv | 3 + .../board_issues_from_epics.csv | 3 + .../board_issues_from_issues.csv | 3 + .../board_issues_from_tasks.csv | 3 + .../board_issues_from_user_stories.csv | 3 + .../taiga/e2e/snapshot_tables/boards.csv | 2 + .../e2e/snapshot_tables/issues_from_epics.csv | 3 + .../snapshot_tables/issues_from_issues.csv | 3 + .../e2e/snapshot_tables/issues_from_tasks.csv | 3 + .../issues_from_user_stories.csv | 3 + backend/plugins/taiga/e2e/task_test.go | 74 + backend/plugins/taiga/e2e/user_story_test.go | 74 + backend/plugins/taiga/impl/impl.go | 251 ++ backend/plugins/taiga/models/connection.go | 143 + backend/plugins/taiga/models/epic.go | 45 + backend/plugins/taiga/models/issue.go | 49 + .../20250220_add_init_tables.go | 132 + .../20260306_add_task_issue_epic_tables.go | 128 + .../taiga/models/migrationscripts/register.go | 30 + backend/plugins/taiga/models/project.go | 63 + backend/plugins/taiga/models/scope_config.go | 53 + backend/plugins/taiga/models/task.go | 49 + backend/plugins/taiga/models/user_story.go | 53 + backend/plugins/taiga/taiga.go | 45 + backend/plugins/taiga/tasks/api_client.go | 49 + backend/plugins/taiga/tasks/epic_collector.go | 79 + backend/plugins/taiga/tasks/epic_convertor.go | 106 + backend/plugins/taiga/tasks/epic_extractor.go | 106 + .../plugins/taiga/tasks/issue_collector.go | 79 + .../plugins/taiga/tasks/issue_convertor.go | 132 + .../plugins/taiga/tasks/issue_extractor.go | 136 + .../plugins/taiga/tasks/project_collector.go | 76 + .../plugins/taiga/tasks/project_convertor.go | 88 + .../plugins/taiga/tasks/project_extractor.go | 84 + backend/plugins/taiga/tasks/task_collector.go | 79 + backend/plugins/taiga/tasks/task_convertor.go | 107 + backend/plugins/taiga/tasks/task_data.go | 54 + backend/plugins/taiga/tasks/task_extractor.go | 122 + .../taiga/tasks/user_story_collector.go | 80 + .../taiga/tasks/user_story_convertor.go | 129 + .../taiga/tasks/user_story_extractor.go | 135 + grafana/dashboards/Taiga.json | 2316 +++++++++++++++++ 61 files changed, 6068 insertions(+) create mode 100644 backend/plugins/taiga/api/blueprint_v200.go create mode 100644 backend/plugins/taiga/api/connection_api.go create mode 100644 backend/plugins/taiga/api/init.go create mode 100644 backend/plugins/taiga/api/remote_api.go create mode 100644 backend/plugins/taiga/api/scope_api.go create mode 100644 backend/plugins/taiga/api/scope_config_api.go create mode 100644 backend/plugins/taiga/e2e/epic_test.go create mode 100644 backend/plugins/taiga/e2e/issue_test.go create mode 100644 backend/plugins/taiga/e2e/project_test.go create mode 100644 backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_epics.csv create mode 100644 backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_issues.csv create mode 100644 backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_projects.csv create mode 100644 backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_tasks.csv create mode 100644 backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_user_stories.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_epics.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_issues.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_projects.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_tasks.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_user_stories.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_epics.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_issues.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_tasks.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_user_stories.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/boards.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/issues_from_epics.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/issues_from_issues.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/issues_from_tasks.csv create mode 100644 backend/plugins/taiga/e2e/snapshot_tables/issues_from_user_stories.csv create mode 100644 backend/plugins/taiga/e2e/task_test.go create mode 100644 backend/plugins/taiga/e2e/user_story_test.go create mode 100644 backend/plugins/taiga/impl/impl.go create mode 100644 backend/plugins/taiga/models/connection.go create mode 100644 backend/plugins/taiga/models/epic.go create mode 100644 backend/plugins/taiga/models/issue.go create mode 100644 backend/plugins/taiga/models/migrationscripts/20250220_add_init_tables.go create mode 100644 backend/plugins/taiga/models/migrationscripts/20260306_add_task_issue_epic_tables.go create mode 100644 backend/plugins/taiga/models/migrationscripts/register.go create mode 100644 backend/plugins/taiga/models/project.go create mode 100644 backend/plugins/taiga/models/scope_config.go create mode 100644 backend/plugins/taiga/models/task.go create mode 100644 backend/plugins/taiga/models/user_story.go create mode 100644 backend/plugins/taiga/taiga.go create mode 100644 backend/plugins/taiga/tasks/api_client.go create mode 100644 backend/plugins/taiga/tasks/epic_collector.go create mode 100644 backend/plugins/taiga/tasks/epic_convertor.go create mode 100644 backend/plugins/taiga/tasks/epic_extractor.go create mode 100644 backend/plugins/taiga/tasks/issue_collector.go create mode 100644 backend/plugins/taiga/tasks/issue_convertor.go create mode 100644 backend/plugins/taiga/tasks/issue_extractor.go create mode 100644 backend/plugins/taiga/tasks/project_collector.go create mode 100644 backend/plugins/taiga/tasks/project_convertor.go create mode 100644 backend/plugins/taiga/tasks/project_extractor.go create mode 100644 backend/plugins/taiga/tasks/task_collector.go create mode 100644 backend/plugins/taiga/tasks/task_convertor.go create mode 100644 backend/plugins/taiga/tasks/task_data.go create mode 100644 backend/plugins/taiga/tasks/task_extractor.go create mode 100644 backend/plugins/taiga/tasks/user_story_collector.go create mode 100644 backend/plugins/taiga/tasks/user_story_convertor.go create mode 100644 backend/plugins/taiga/tasks/user_story_extractor.go create mode 100644 grafana/dashboards/Taiga.json diff --git a/backend/plugins/table_info_test.go b/backend/plugins/table_info_test.go index 929c069b86b..5f81f319aea 100644 --- a/backend/plugins/table_info_test.go +++ b/backend/plugins/table_info_test.go @@ -52,6 +52,7 @@ import ( slack "github.com/apache/incubator-devlake/plugins/slack/impl" sonarqube "github.com/apache/incubator-devlake/plugins/sonarqube/impl" starrocks "github.com/apache/incubator-devlake/plugins/starrocks/impl" + taiga "github.com/apache/incubator-devlake/plugins/taiga/impl" tapd "github.com/apache/incubator-devlake/plugins/tapd/impl" teambition "github.com/apache/incubator-devlake/plugins/teambition/impl" testmo "github.com/apache/incubator-devlake/plugins/testmo/impl" @@ -90,6 +91,7 @@ func Test_GetPluginTablesInfo(t *testing.T) { checker.FeedIn("slack/models", slack.Slack{}.GetTablesInfo) checker.FeedIn("sonarqube/models", sonarqube.Sonarqube{}.GetTablesInfo) checker.FeedIn("starrocks", starrocks.StarRocks{}.GetTablesInfo) + checker.FeedIn("taiga/models", taiga.Taiga{}.GetTablesInfo) checker.FeedIn("tapd/models", tapd.Tapd{}.GetTablesInfo) checker.FeedIn("teambition/models", teambition.Teambition{}.GetTablesInfo) checker.FeedIn("testmo/models", testmo.Testmo{}.GetTablesInfo) diff --git a/backend/plugins/taiga/api/blueprint_v200.go b/backend/plugins/taiga/api/blueprint_v200.go new file mode 100644 index 00000000000..3eabf1acbd5 --- /dev/null +++ b/backend/plugins/taiga/api/blueprint_v200.go @@ -0,0 +1,137 @@ +/* +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 api + +import ( + "context" + + "github.com/apache/incubator-devlake/core/errors" + coreModels "github.com/apache/incubator-devlake/core/models" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/helpers/srvhelper" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +type TaigaTaskOptions struct { + ConnectionId uint64 `json:"connectionId"` + ProjectId uint64 `json:"projectId"` +} + +func MakeDataSourcePipelinePlanV200( + subtaskMetas []plugin.SubTaskMeta, + connectionId uint64, + bpScopes []*coreModels.BlueprintScope, +) (coreModels.PipelinePlan, []plugin.Scope, errors.Error) { + // load connection, scope and scopeConfig from the db + connection, err := dsHelper.ConnSrv.FindByPk(connectionId) + if err != nil { + return nil, nil, err + } + scopeDetails, err := dsHelper.ScopeSrv.MapScopeDetails(connectionId, bpScopes) + if err != nil { + return nil, nil, err + } + + // needed for the connection to populate its access tokens + _, err = helper.NewApiClientFromConnection(context.TODO(), basicRes, connection) + if err != nil { + return nil, nil, err + } + + plan, err := makeDataSourcePipelinePlanV200(subtaskMetas, scopeDetails, connection) + if err != nil { + return nil, nil, err + } + scopes, err := makeScopesV200(scopeDetails, connection) + if err != nil { + return nil, nil, err + } + + return plan, scopes, nil +} + +func makeDataSourcePipelinePlanV200( + subtaskMetas []plugin.SubTaskMeta, + scopeDetails []*srvhelper.ScopeDetail[models.TaigaProject, models.TaigaScopeConfig], + connection *models.TaigaConnection, +) (coreModels.PipelinePlan, errors.Error) { + plan := make(coreModels.PipelinePlan, len(scopeDetails)) + for i, scopeDetail := range scopeDetails { + stage := plan[i] + if stage == nil { + stage = coreModels.PipelineStage{} + } + + scope, scopeConfig := scopeDetail.Scope, scopeDetail.ScopeConfig + // construct task options for Taiga + task, err := helper.MakePipelinePlanTask( + "taiga", + subtaskMetas, + scopeConfig.Entities, + TaigaTaskOptions{ + ConnectionId: scope.ConnectionId, + ProjectId: uint64(scope.ProjectId), + }, + ) + if err != nil { + return nil, err + } + + stage = append(stage, task) + plan[i] = stage + } + + return plan, nil +} + +func makeScopesV200( + scopeDetails []*srvhelper.ScopeDetail[models.TaigaProject, models.TaigaScopeConfig], + connection *models.TaigaConnection, +) ([]plugin.Scope, errors.Error) { + scopes := make([]plugin.Scope, 0, len(scopeDetails)) + idGen := didgen.NewDomainIdGenerator(&models.TaigaProject{}) + + for _, scopeDetail := range scopeDetails { + project := scopeDetail.Scope + + // add board to scopes + entities := scopeDetail.ScopeConfig.Entities + hasTicket := false + for _, entity := range entities { + if entity == plugin.DOMAIN_TYPE_TICKET { + hasTicket = true + break + } + } + if hasTicket { + domainBoard := &ticket.Board{ + DomainEntity: domainlayer.DomainEntity{ + Id: idGen.Generate(connection.ID, project.ProjectId), + }, + Name: project.Name, + } + scopes = append(scopes, domainBoard) + } + } + + return scopes, nil +} diff --git a/backend/plugins/taiga/api/connection_api.go b/backend/plugins/taiga/api/connection_api.go new file mode 100644 index 00000000000..88021be3a99 --- /dev/null +++ b/backend/plugins/taiga/api/connection_api.go @@ -0,0 +1,225 @@ +/* +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 api + +import ( + "context" + "fmt" + "net/http" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" + "github.com/apache/incubator-devlake/server/api/shared" +) + +// TaigaTestConnResponse is the response struct for testing a connection +type TaigaTestConnResponse struct { + shared.ApiBody + Connection *models.TaigaConnection +} + +// testConnection tests the Taiga connection +func testConnection(ctx context.Context, connection models.TaigaConnection) (*TaigaTestConnResponse, errors.Error) { + // If username and password are provided, authenticate to get a token + if connection.Username != "" && connection.Password != "" && connection.Token == "" { + // Create a temporary connection without token for authentication + tempConnection := connection + tempConnection.Token = "" + + // Create a temporary API client to call the auth endpoint + tempApiClient, err := api.NewApiClientFromConnection(ctx, basicRes, &tempConnection) + if err != nil { + return nil, errors.Default.Wrap(err, "error creating API client") + } + + // Prepare auth request body + authBody := map[string]interface{}{ + "type": "normal", + "username": connection.Username, + "password": connection.Password, + } + + // Authenticate to get token + authResponse := struct { + AuthToken string `json:"auth_token"` + }{} + + res, err := tempApiClient.Post("auth", nil, authBody, nil) + if err != nil { + return nil, errors.Default.Wrap(err, "error authenticating with Taiga") + } + + if res.StatusCode == http.StatusUnauthorized || res.StatusCode == http.StatusBadRequest { + return nil, errors.HttpStatus(http.StatusBadRequest).New("authentication failed - please check your username and password") + } + + if res.StatusCode != http.StatusOK { + return nil, errors.HttpStatus(res.StatusCode).New(fmt.Sprintf("unexpected status code during auth: %d", res.StatusCode)) + } + + // Parse the auth response + err = api.UnmarshalResponse(res, &authResponse) + if err != nil { + return nil, errors.Default.Wrap(err, "error parsing authentication response") + } + + // Set the token for validation + connection.Token = authResponse.AuthToken + } + + // validate - but make Token optional if we have username/password + if vld != nil { + if connection.Token == "" && (connection.Username == "" || connection.Password == "") { + return nil, errors.Default.New("either token or username/password must be provided") + } + } + + apiClient, err := api.NewApiClientFromConnection(ctx, basicRes, &connection) + if err != nil { + return nil, err + } + + // test connection by making a request to the user endpoint + res, err := apiClient.Get("users/me", nil, nil) + if err != nil { + return nil, errors.Default.Wrap(err, "error testing connection") + } + + if res.StatusCode == http.StatusUnauthorized || res.StatusCode == http.StatusForbidden { + return nil, errors.HttpStatus(http.StatusBadRequest).New("authentication error when testing connection - please check your credentials") + } + + if res.StatusCode != http.StatusOK { + return nil, errors.HttpStatus(res.StatusCode).New(fmt.Sprintf("unexpected status code: %d", res.StatusCode)) + } + + connection = connection.Sanitize() + body := TaigaTestConnResponse{} + body.Success = true + body.Message = "success" + body.Connection = &connection + + return &body, nil +} + +// TestConnection tests the Taiga connection +// @Summary test taiga connection +// @Description Test Taiga Connection +// @Tags plugins/taiga +// @Param body body models.TaigaConnection true "json body" +// @Success 200 {object} TaigaTestConnResponse "Success" +// @Failure 400 {string} errcode.Error "Bad Request" +// @Failure 500 {string} errcode.Error "Internal Error" +// @Router /plugins/taiga/test [POST] +func TestConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + // decode + var connection models.TaigaConnection + err := api.DecodeMapStruct(input.Body, &connection, false) + if err != nil { + return nil, err + } + // test connection + result, err := testConnection(context.TODO(), connection) + if err != nil { + return nil, plugin.WrapTestConnectionErrResp(basicRes, err) + } + return &plugin.ApiResourceOutput{Body: result, Status: http.StatusOK}, nil +} + +// TestExistingConnection tests an existing Taiga connection +// @Summary test existing taiga connection +// @Description Test Existing Taiga Connection +// @Tags plugins/taiga +// @Success 200 {object} TaigaTestConnResponse "Success" +// @Failure 400 {string} errcode.Error "Bad Request" +// @Failure 500 {string} errcode.Error "Internal Error" +// @Router /plugins/taiga/connections/:connectionId/test [POST] +func TestExistingConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + connection, err := dsHelper.ConnApi.GetMergedConnection(input) + if err != nil { + return nil, errors.BadInput.Wrap(err, "find connection from db") + } + // test connection + result, err := testConnection(context.TODO(), *connection) + if err != nil { + return nil, plugin.WrapTestConnectionErrResp(basicRes, err) + } + return &plugin.ApiResourceOutput{Body: result, Status: http.StatusOK}, nil +} + +// PostConnections creates a new Taiga connection +// @Summary create taiga connection +// @Description Create Taiga Connection +// @Tags plugins/taiga +// @Success 200 {object} models.TaigaConnection +// @Failure 400 +// @Failure 500 +// @Router /plugins/taiga/connections [POST] +func PostConnections(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.Post(input) +} + +// ListConnections lists all Taiga connections +// @Summary list taiga connections +// @Description List Taiga Connections +// @Tags plugins/taiga +// @Success 200 {object} []models.TaigaConnection +// @Failure 400 +// @Failure 500 +// @Router /plugins/taiga/connections [GET] +func ListConnections(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.GetAll(input) +} + +// GetConnection gets a Taiga connection by ID +// @Summary get taiga connection +// @Description Get Taiga Connection +// @Tags plugins/taiga +// @Success 200 {object} models.TaigaConnection +// @Failure 400 +// @Failure 500 +// @Router /plugins/taiga/connections/:connectionId [GET] +func GetConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.GetDetail(input) +} + +// PatchConnection updates a Taiga connection +// @Summary patch taiga connection +// @Description Patch Taiga Connection +// @Tags plugins/taiga +// @Success 200 {object} models.TaigaConnection +// @Failure 400 +// @Failure 500 +// @Router /plugins/taiga/connections/:connectionId [PATCH] +func PatchConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.Patch(input) +} + +// DeleteConnection deletes a Taiga connection +// @Summary delete taiga connection +// @Description Delete Taiga Connection +// @Tags plugins/taiga +// @Success 200 +// @Failure 400 +// @Failure 500 +// @Router /plugins/taiga/connections/:connectionId [DELETE] +func DeleteConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ConnApi.Delete(input) +} diff --git a/backend/plugins/taiga/api/init.go b/backend/plugins/taiga/api/init.go new file mode 100644 index 00000000000..82b332456ac --- /dev/null +++ b/backend/plugins/taiga/api/init.go @@ -0,0 +1,53 @@ +/* +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 api + +import ( + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" + "github.com/go-playground/validator/v10" +) + +var vld *validator.Validate +var basicRes context.BasicRes +var dsHelper *api.DsHelper[models.TaigaConnection, models.TaigaProject, models.TaigaScopeConfig] +var raProxy *api.DsRemoteApiProxyHelper[models.TaigaConnection] +var raScopeList *api.DsRemoteApiScopeListHelper[models.TaigaConnection, models.TaigaProject, TaigaRemotePagination] + +func Init(br context.BasicRes, p plugin.PluginMeta) { + basicRes = br + vld = validator.New() + dsHelper = api.NewDataSourceHelper[ + models.TaigaConnection, + models.TaigaProject, + models.TaigaScopeConfig, + ]( + br, + p.Name(), + []string{"name"}, + func(c models.TaigaConnection) models.TaigaConnection { + return c.Sanitize() + }, + nil, + nil, + ) + raProxy = api.NewDsRemoteApiProxyHelper[models.TaigaConnection](dsHelper.ConnApi.ModelApiHelper) + raScopeList = api.NewDsRemoteApiScopeListHelper[models.TaigaConnection, models.TaigaProject, TaigaRemotePagination](raProxy, listTaigaRemoteScopes) +} diff --git a/backend/plugins/taiga/api/remote_api.go b/backend/plugins/taiga/api/remote_api.go new file mode 100644 index 00000000000..a0cc0b02a90 --- /dev/null +++ b/backend/plugins/taiga/api/remote_api.go @@ -0,0 +1,132 @@ +/* +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 api + +import ( + "fmt" + "net/url" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + dsmodels "github.com/apache/incubator-devlake/helpers/pluginhelper/api/models" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +type TaigaRemotePagination struct { + Page int `json:"page"` + PageSize int `json:"pageSize"` +} + +type TaigaApiProject struct { + Id uint64 `json:"id"` + Name string `json:"name"` + Slug string `json:"slug"` + Description string `json:"description"` +} + +func queryTaigaProjects( + apiClient plugin.ApiClient, + keyword string, + page TaigaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.TaigaProject], + nextPage *TaigaRemotePagination, + err errors.Error, +) { + if page.PageSize == 0 { + page.PageSize = 100 + } + if page.Page == 0 { + page.Page = 1 + } + + query := url.Values{ + "page": {fmt.Sprintf("%d", page.Page)}, + "page_size": {fmt.Sprintf("%d", page.PageSize)}, + } + if keyword != "" { + query.Set("search", keyword) + } + + res, err := apiClient.Get("projects", query, nil) + if err != nil { + return + } + + var projects []TaigaApiProject + err = api.UnmarshalResponse(res, &projects) + if err != nil { + return + } + + for _, project := range projects { + children = append(children, dsmodels.DsRemoteApiScopeListEntry[models.TaigaProject]{ + Type: api.RAS_ENTRY_TYPE_SCOPE, + Id: fmt.Sprintf("%d", project.Id), + ParentId: nil, + Name: project.Name, + FullName: project.Name, + Data: &models.TaigaProject{ + ProjectId: project.Id, + Name: project.Name, + Slug: project.Slug, + Description: project.Description, + }, + }) + } + + // Check if there are more pages + if len(projects) == page.PageSize { + nextPage = &TaigaRemotePagination{ + Page: page.Page + 1, + PageSize: page.PageSize, + } + } + + return +} + +func listTaigaRemoteScopes( + _ *models.TaigaConnection, + apiClient plugin.ApiClient, + groupId string, + page TaigaRemotePagination, +) ( + children []dsmodels.DsRemoteApiScopeListEntry[models.TaigaProject], + nextPage *TaigaRemotePagination, + err errors.Error, +) { + return queryTaigaProjects(apiClient, "", page) +} + +// RemoteScopes list all available scopes on the remote server +// @Summary list all available scopes on the remote server +// @Description list all available scopes on the remote server +// @Accept application/json +// @Param connectionId path int false "connection ID" +// @Param groupId query string false "group ID" +// @Param pageToken query string false "page Token" +// @Failure 400 {object} shared.ApiBody "Bad Request" +// @Failure 500 {object} shared.ApiBody "Internal Error" +// @Success 200 {object} dsmodels.DsRemoteApiScopeList[models.TaigaProject] +// @Tags plugins/taiga +// @Router /plugins/taiga/connections/{connectionId}/remote-scopes [GET] +func RemoteScopes(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return raScopeList.Get(input) +} diff --git a/backend/plugins/taiga/api/scope_api.go b/backend/plugins/taiga/api/scope_api.go new file mode 100644 index 00000000000..3b8c128894d --- /dev/null +++ b/backend/plugins/taiga/api/scope_api.go @@ -0,0 +1,52 @@ +/* +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 api + +import ( + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +type PutScopesReqBody api.PutScopesReqBody[models.TaigaProject] +type ScopeDetail api.ScopeDetail[models.TaigaProject, models.TaigaScopeConfig] + +func PutScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.PutMultiple(input) +} + +func UpdateScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.Patch(input) +} + +func GetScopeList(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.GetPage(input) +} + +func GetScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.GetScopeDetail(input) +} + +func DeleteScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.Delete(input) +} + +func GetScopeLatestSyncState(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeApi.GetScopeLatestSyncState(input) +} diff --git a/backend/plugins/taiga/api/scope_config_api.go b/backend/plugins/taiga/api/scope_config_api.go new file mode 100644 index 00000000000..f162da31c07 --- /dev/null +++ b/backend/plugins/taiga/api/scope_config_api.go @@ -0,0 +1,47 @@ +/* +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 api + +import ( + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" +) + +func CreateScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.Post(input) +} + +func UpdateScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.Patch(input) +} + +func GetScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.GetDetail(input) +} + +func GetScopeConfigList(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.GetAll(input) +} + +func DeleteScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.Delete(input) +} + +func GetProjectsByScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + return dsHelper.ScopeConfigApi.GetProjectsByScopeConfig(input) +} diff --git a/backend/plugins/taiga/e2e/epic_test.go b/backend/plugins/taiga/e2e/epic_test.go new file mode 100644 index 00000000000..47ac0c5d962 --- /dev/null +++ b/backend/plugins/taiga/e2e/epic_test.go @@ -0,0 +1,74 @@ +/* +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 ( + "testing" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/plugins/taiga/impl" + "github.com/apache/incubator-devlake/plugins/taiga/models" + "github.com/apache/incubator-devlake/plugins/taiga/tasks" +) + +// TestTaigaEpicDataFlow verifies the full extract → convert pipeline for +// Taiga epics: raw API JSON → _tool_taiga_epics → ticket.Issue (type EPIC). +// +// To regenerate snapshot CSVs from actual output, temporarily replace +// VerifyTableWithOptions with CreateSnapshot for each table. +func TestTaigaEpicDataFlow(t *testing.T) { + var taiga impl.Taiga + dataflowTester := e2ehelper.NewDataFlowTester(t, "taiga", taiga) + + taskData := &tasks.TaigaTaskData{ + Options: &tasks.TaigaOptions{ + ConnectionId: 1, + ProjectId: 1, + }, + } + + // ── Extraction: raw JSON → _tool_taiga_epics ───────────────────────────── + dataflowTester.ImportCsvIntoRawTable( + "./raw_tables/_raw_taiga_api_epics.csv", + "_raw_taiga_api_epics", + ) + + dataflowTester.FlushTabler(&models.TaigaEpic{}) + dataflowTester.Subtask(tasks.ExtractEpicsMeta, taskData) + // Verify all tool-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(models.TaigaEpic{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_taiga_epics.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + + // ── Conversion: _tool_taiga_epics → ticket.Issue / ticket.BoardIssue ───── + dataflowTester.FlushTabler(&ticket.Issue{}) + dataflowTester.FlushTabler(&ticket.BoardIssue{}) + dataflowTester.Subtask(tasks.ConvertEpicsMeta, taskData) + // Verify all domain-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(ticket.Issue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/issues_from_epics.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + dataflowTester.VerifyTableWithOptions(ticket.BoardIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/board_issues_from_epics.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) +} diff --git a/backend/plugins/taiga/e2e/issue_test.go b/backend/plugins/taiga/e2e/issue_test.go new file mode 100644 index 00000000000..7ab3c9c85a9 --- /dev/null +++ b/backend/plugins/taiga/e2e/issue_test.go @@ -0,0 +1,77 @@ +/* +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 ( + "testing" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/plugins/taiga/impl" + "github.com/apache/incubator-devlake/plugins/taiga/models" + "github.com/apache/incubator-devlake/plugins/taiga/tasks" +) + +// TestTaigaIssueDataFlow verifies the full extract → convert pipeline for +// Taiga issues (bugs/enhancements/questions): raw API JSON → +// _tool_taiga_issues → ticket.Issue with correct DevLake type mapping. +// Specifically checks that "Bug" → BUG, "Enhancement" → REQUIREMENT. +// +// To regenerate snapshot CSVs from actual output, temporarily replace +// VerifyTableWithOptions with CreateSnapshot for each table. +func TestTaigaIssueDataFlow(t *testing.T) { + var taiga impl.Taiga + dataflowTester := e2ehelper.NewDataFlowTester(t, "taiga", taiga) + + taskData := &tasks.TaigaTaskData{ + Options: &tasks.TaigaOptions{ + ConnectionId: 1, + ProjectId: 1, + }, + } + + // ── Extraction: raw JSON → _tool_taiga_issues ──────────────────────────── + dataflowTester.ImportCsvIntoRawTable( + "./raw_tables/_raw_taiga_api_issues.csv", + "_raw_taiga_api_issues", + ) + + dataflowTester.FlushTabler(&models.TaigaIssue{}) + dataflowTester.Subtask(tasks.ExtractIssuesMeta, taskData) + // Verify all tool-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(models.TaigaIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_taiga_issues.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + + // ── Conversion: _tool_taiga_issues → ticket.Issue / ticket.BoardIssue ──── + // Key assertion: taigaIssueTypeToDevLake mapping is exercised (Bug→BUG, Enhancement→REQUIREMENT). + dataflowTester.FlushTabler(&ticket.Issue{}) + dataflowTester.FlushTabler(&ticket.BoardIssue{}) + dataflowTester.Subtask(tasks.ConvertIssuesMeta, taskData) + // Verify all domain-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(ticket.Issue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/issues_from_issues.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + dataflowTester.VerifyTableWithOptions(ticket.BoardIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/board_issues_from_issues.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) +} diff --git a/backend/plugins/taiga/e2e/project_test.go b/backend/plugins/taiga/e2e/project_test.go new file mode 100644 index 00000000000..d1e8aa87096 --- /dev/null +++ b/backend/plugins/taiga/e2e/project_test.go @@ -0,0 +1,69 @@ +/* +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 ( + "testing" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/plugins/taiga/impl" + "github.com/apache/incubator-devlake/plugins/taiga/models" + "github.com/apache/incubator-devlake/plugins/taiga/tasks" +) + +// TestTaigaProjectDataFlow verifies the full extract → convert pipeline for +// Taiga projects: raw API JSON → _tool_taiga_projects → ticket.Board. +// +// To regenerate snapshot CSVs from actual output, temporarily replace +// VerifyTableWithOptions with CreateSnapshot for each table. +func TestTaigaProjectDataFlow(t *testing.T) { + var taiga impl.Taiga + dataflowTester := e2ehelper.NewDataFlowTester(t, "taiga", taiga) + + taskData := &tasks.TaigaTaskData{ + Options: &tasks.TaigaOptions{ + ConnectionId: 1, + ProjectId: 1, + }, + } + + // ── Extraction: raw JSON → _tool_taiga_projects ───────────────────────── + dataflowTester.ImportCsvIntoRawTable( + "./raw_tables/_raw_taiga_api_projects.csv", + "_raw_taiga_api_projects", + ) + + dataflowTester.FlushTabler(&models.TaigaProject{}) + dataflowTester.Subtask(tasks.ExtractProjectsMeta, taskData) + // Verify all tool-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(models.TaigaProject{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_taiga_projects.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + + // ── Conversion: _tool_taiga_projects → ticket.Board ────────────────────── + dataflowTester.FlushTabler(&ticket.Board{}) + dataflowTester.Subtask(tasks.ConvertProjectsMeta, taskData) + // Verify all domain-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(ticket.Board{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/boards.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) +} diff --git a/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_epics.csv b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_epics.csv new file mode 100644 index 00000000000..9121a54d0a3 --- /dev/null +++ b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_epics.csv @@ -0,0 +1,3 @@ +id,params,data,url,input,created_at +1,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":401,""ref"":1,""subject"":""Platform v2.0"",""status"":1,""status_extra_info"":{""name"":""In Progress""},""is_closed"":false,""created_date"":""2024-01-05T09:00:00.000Z"",""modified_date"":""2024-01-20T10:00:00.000Z"",""assigned_to"":5,""assigned_to_extra_info"":{""full_name_display"":""Alice Smith""},""color"":""#F2711C""}",https://api.taiga.io/api/v1/epics?project=1,null,2024-01-21 08:00:00.000 +2,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":402,""ref"":2,""subject"":""Mobile App"",""status"":2,""status_extra_info"":{""name"":""Open""},""is_closed"":false,""created_date"":""2024-01-07T11:00:00.000Z"",""modified_date"":""2024-01-18T09:00:00.000Z"",""assigned_to"":null,""assigned_to_extra_info"":null,""color"":""#2185D0""}",https://api.taiga.io/api/v1/epics?project=1,null,2024-01-21 08:00:00.000 diff --git a/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_issues.csv b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_issues.csv new file mode 100644 index 00000000000..5e56af72500 --- /dev/null +++ b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_issues.csv @@ -0,0 +1,3 @@ +id,params,data,url,input,created_at +1,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":301,""ref"":1,""subject"":""Login page crash on mobile"",""status"":1,""status_extra_info"":{""name"":""New""},""type_extra_info"":{""name"":""Bug""},""priority_extra_info"":{""name"":""High""},""severity_extra_info"":{""name"":""Critical""},""is_closed"":false,""created_date"":""2024-01-14T08:00:00.000Z"",""modified_date"":""2024-01-19T14:00:00.000Z"",""finished_date"":null,""assigned_to"":5,""assigned_to_extra_info"":{""full_name_display"":""Alice Smith""},""milestone"":null}",https://api.taiga.io/api/v1/issues?project=1,null,2024-01-21 08:00:00.000 +2,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":302,""ref"":2,""subject"":""Add dark mode support"",""status"":2,""status_extra_info"":{""name"":""Closed""},""type_extra_info"":{""name"":""Enhancement""},""priority_extra_info"":{""name"":""Normal""},""severity_extra_info"":{""name"":""Minor""},""is_closed"":true,""created_date"":""2024-01-08T10:00:00.000Z"",""modified_date"":""2024-01-16T13:00:00.000Z"",""finished_date"":""2024-01-16T13:00:00.000Z"",""assigned_to"":6,""assigned_to_extra_info"":{""full_name_display"":""Bob Jones""},""milestone"":1}",https://api.taiga.io/api/v1/issues?project=1,null,2024-01-21 08:00:00.000 diff --git a/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_projects.csv b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_projects.csv new file mode 100644 index 00000000000..2871848b092 --- /dev/null +++ b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_projects.csv @@ -0,0 +1,2 @@ +id,params,data,url,input,created_at +1,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":1,""name"":""Test Project Alpha"",""slug"":""test-project-alpha"",""description"":""A test project for the DevLake Taiga plugin e2e tests"",""created_date"":""2024-01-01T00:00:00.000Z"",""modified_date"":""2024-01-20T00:00:00.000Z""}",https://api.taiga.io/api/v1/projects/1,null,2024-01-21 08:00:00.000 diff --git a/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_tasks.csv b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_tasks.csv new file mode 100644 index 00000000000..227fff104a2 --- /dev/null +++ b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_tasks.csv @@ -0,0 +1,3 @@ +id,params,data,url,input,created_at +1,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":201,""ref"":1,""subject"":""Write unit tests"",""status"":1,""status_extra_info"":{""name"":""In Progress""},""is_closed"":false,""created_date"":""2024-01-16T09:00:00.000Z"",""modified_date"":""2024-01-21T11:00:00.000Z"",""finished_date"":null,""assigned_to"":5,""assigned_to_extra_info"":{""full_name_display"":""Alice Smith""},""user_story"":101,""milestone"":1,""is_blocked"":false,""blocked_note"":""""}",https://api.taiga.io/api/v1/tasks?project=1,null,2024-01-21 08:00:00.000 +2,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":202,""ref"":2,""subject"":""Deploy to staging"",""status"":2,""status_extra_info"":{""name"":""Done""},""is_closed"":true,""created_date"":""2024-01-12T10:00:00.000Z"",""modified_date"":""2024-01-17T16:00:00.000Z"",""finished_date"":""2024-01-17T16:00:00.000Z"",""assigned_to"":7,""assigned_to_extra_info"":{""full_name_display"":""Carol White""},""user_story"":101,""milestone"":null,""is_blocked"":false,""blocked_note"":""""}",https://api.taiga.io/api/v1/tasks?project=1,null,2024-01-21 08:00:00.000 diff --git a/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_user_stories.csv b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_user_stories.csv new file mode 100644 index 00000000000..4bc83489eeb --- /dev/null +++ b/backend/plugins/taiga/e2e/raw_tables/_raw_taiga_api_user_stories.csv @@ -0,0 +1,3 @@ +id,params,data,url,input,created_at +1,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":101,""ref"":1,""subject"":""Setup CI/CD Pipeline"",""status"":1,""status_extra_info"":{""name"":""In Progress""},""is_closed"":false,""created_date"":""2024-01-15T10:00:00.000Z"",""modified_date"":""2024-01-20T15:30:00.000Z"",""finish_date"":null,""assigned_to"":5,""assigned_to_extra_info"":{""full_name_display"":""Alice Smith""},""total_points"":8.0,""milestone"":1,""milestone_name"":""Sprint 1"",""priority"":3,""is_blocked"":false,""blocked_note"":""""}",https://api.taiga.io/api/v1/userstories?project=1,null,2024-01-21 08:00:00.000 +2,"{""ConnectionId"":1,""ProjectId"":1}","{""id"":102,""ref"":2,""subject"":""User Authentication"",""status"":2,""status_extra_info"":{""name"":""Done""},""is_closed"":true,""created_date"":""2024-01-10T09:00:00.000Z"",""modified_date"":""2024-01-18T17:00:00.000Z"",""finish_date"":""2024-01-18T17:00:00.000Z"",""assigned_to"":6,""assigned_to_extra_info"":{""full_name_display"":""Bob Jones""},""total_points"":5.0,""milestone"":null,""milestone_name"":null,""priority"":1,""is_blocked"":false,""blocked_note"":""""}",https://api.taiga.io/api/v1/userstories?project=1,null,2024-01-21 08:00:00.000 diff --git a/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_epics.csv b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_epics.csv new file mode 100644 index 00000000000..2cc0768c7ca --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_epics.csv @@ -0,0 +1,3 @@ +connection_id,project_id,epic_id,ref,subject,status,is_closed,created_date,modified_date,assigned_to,assigned_to_name,color +1,1,401,1,Platform v2.0,In Progress,0,2024-01-05T09:00:00.000+00:00,2024-01-20T10:00:00.000+00:00,5,Alice Smith,#F2711C +1,1,402,2,Mobile App,Open,0,2024-01-07T11:00:00.000+00:00,2024-01-18T09:00:00.000+00:00,0,,#2185D0 diff --git a/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_issues.csv b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_issues.csv new file mode 100644 index 00000000000..d4fa918fc72 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_issues.csv @@ -0,0 +1,3 @@ +connection_id,project_id,issue_id,ref,subject,status,issue_type_name,priority,severity,is_closed,created_date,modified_date,finished_date,assigned_to,assigned_to_name,milestone_id +1,1,301,1,Login page crash on mobile,New,Bug,High,Critical,0,2024-01-14T08:00:00.000+00:00,2024-01-19T14:00:00.000+00:00,,5,Alice Smith,0 +1,1,302,2,Add dark mode support,Closed,Enhancement,Normal,Minor,1,2024-01-08T10:00:00.000+00:00,2024-01-16T13:00:00.000+00:00,2024-01-16T13:00:00.000+00:00,6,Bob Jones,1 diff --git a/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_projects.csv b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_projects.csv new file mode 100644 index 00000000000..82e1575013d --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_projects.csv @@ -0,0 +1,2 @@ +connection_id,project_id,scope_config_id,name,slug,description,url,is_private,total_milestones,total_story_points +1,1,0,Test Project Alpha,test-project-alpha,A test project for the DevLake Taiga plugin e2e tests,,0,0,0 diff --git a/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_tasks.csv b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_tasks.csv new file mode 100644 index 00000000000..ad8131272fa --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_tasks.csv @@ -0,0 +1,3 @@ +connection_id,project_id,task_id,ref,subject,status,is_closed,created_date,modified_date,finished_date,assigned_to,assigned_to_name,user_story_id,milestone_id,is_blocked,blocked_note +1,1,201,1,Write unit tests,In Progress,0,2024-01-16T09:00:00.000+00:00,2024-01-21T11:00:00.000+00:00,,5,Alice Smith,101,1,0, +1,1,202,2,Deploy to staging,Done,1,2024-01-12T10:00:00.000+00:00,2024-01-17T16:00:00.000+00:00,2024-01-17T16:00:00.000+00:00,7,Carol White,101,0,0, diff --git a/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_user_stories.csv b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_user_stories.csv new file mode 100644 index 00000000000..ac053fec48a --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/_tool_taiga_user_stories.csv @@ -0,0 +1,3 @@ +connection_id,project_id,user_story_id,ref,subject,description,status,status_color,is_closed,created_date,modified_date,finished_date,assigned_to,assigned_to_name,total_points,milestone_id,milestone_name,priority,is_blocked,blocked_note +1,1,101,1,Setup CI/CD Pipeline,,In Progress,,0,2024-01-15T10:00:00.000+00:00,2024-01-20T15:30:00.000+00:00,,5,Alice Smith,8,1,Sprint 1,3,0, +1,1,102,2,User Authentication,,Done,,1,2024-01-10T09:00:00.000+00:00,2024-01-18T17:00:00.000+00:00,2024-01-18T17:00:00.000+00:00,6,Bob Jones,5,0,,1,0, diff --git a/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_epics.csv b/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_epics.csv new file mode 100644 index 00000000000..118e5665334 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_epics.csv @@ -0,0 +1,3 @@ +board_id,issue_id +taiga:TaigaProject:1:1,taiga:TaigaEpic:1:401 +taiga:TaigaProject:1:1,taiga:TaigaEpic:1:402 diff --git a/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_issues.csv b/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_issues.csv new file mode 100644 index 00000000000..afc67821289 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_issues.csv @@ -0,0 +1,3 @@ +board_id,issue_id +taiga:TaigaProject:1:1,taiga:TaigaIssue:1:301 +taiga:TaigaProject:1:1,taiga:TaigaIssue:1:302 diff --git a/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_tasks.csv b/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_tasks.csv new file mode 100644 index 00000000000..0dddfd05a27 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_tasks.csv @@ -0,0 +1,3 @@ +board_id,issue_id +taiga:TaigaProject:1:1,taiga:TaigaTask:1:201 +taiga:TaigaProject:1:1,taiga:TaigaTask:1:202 diff --git a/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_user_stories.csv b/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_user_stories.csv new file mode 100644 index 00000000000..d54c4ccb5e0 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/board_issues_from_user_stories.csv @@ -0,0 +1,3 @@ +board_id,issue_id +taiga:TaigaProject:1:1,taiga:TaigaUserStory:1:101 +taiga:TaigaProject:1:1,taiga:TaigaUserStory:1:102 diff --git a/backend/plugins/taiga/e2e/snapshot_tables/boards.csv b/backend/plugins/taiga/e2e/snapshot_tables/boards.csv new file mode 100644 index 00000000000..94046502c97 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/boards.csv @@ -0,0 +1,2 @@ +id,name,description,url,created_date,type +taiga:TaigaProject:1:1,Test Project Alpha,A test project for the DevLake Taiga plugin e2e tests,,, diff --git a/backend/plugins/taiga/e2e/snapshot_tables/issues_from_epics.csv b/backend/plugins/taiga/e2e/snapshot_tables/issues_from_epics.csv new file mode 100644 index 00000000000..bf58bfbae98 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/issues_from_epics.csv @@ -0,0 +1,3 @@ +id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask,due_date,fix_versions +taiga:TaigaEpic:1:401,,,Platform v2.0,Platform v2.0,,,EPIC,Epic,In Progress,In Progress,,,2024-01-05T09:00:00.000+00:00,2024-01-20T10:00:00.000+00:00,,,,,,,,,,,,,,,0,, +taiga:TaigaEpic:1:402,,,Mobile App,Mobile App,,,EPIC,Epic,Open,Open,,,2024-01-07T11:00:00.000+00:00,2024-01-18T09:00:00.000+00:00,,,,,,,,,,,,,,,0,, diff --git a/backend/plugins/taiga/e2e/snapshot_tables/issues_from_issues.csv b/backend/plugins/taiga/e2e/snapshot_tables/issues_from_issues.csv new file mode 100644 index 00000000000..52da4dad986 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/issues_from_issues.csv @@ -0,0 +1,3 @@ +id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask,due_date,fix_versions +taiga:TaigaIssue:1:301,,,Login page crash on mobile,Login page crash on mobile,,,BUG,Bug,New,New,,,2024-01-14T08:00:00.000+00:00,2024-01-19T14:00:00.000+00:00,,,,,,,,,,High,,,,,0,, +taiga:TaigaIssue:1:302,,,Add dark mode support,Add dark mode support,,,REQUIREMENT,Enhancement,Closed,Closed,,2024-01-16T13:00:00.000+00:00,2024-01-08T10:00:00.000+00:00,2024-01-16T13:00:00.000+00:00,,,,,,,,,,Normal,,,,,0,, diff --git a/backend/plugins/taiga/e2e/snapshot_tables/issues_from_tasks.csv b/backend/plugins/taiga/e2e/snapshot_tables/issues_from_tasks.csv new file mode 100644 index 00000000000..be3cfebb985 --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/issues_from_tasks.csv @@ -0,0 +1,3 @@ +id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask,due_date,fix_versions +taiga:TaigaTask:1:201,,,Write unit tests,Write unit tests,,,TASK,Task,In Progress,In Progress,,,2024-01-16T09:00:00.000+00:00,2024-01-21T11:00:00.000+00:00,,,,,,,,,,,,,,,0,, +taiga:TaigaTask:1:202,,,Deploy to staging,Deploy to staging,,,TASK,Task,Done,Done,,2024-01-17T16:00:00.000+00:00,2024-01-12T10:00:00.000+00:00,2024-01-17T16:00:00.000+00:00,,,,,,,,,,,,,,,0,, diff --git a/backend/plugins/taiga/e2e/snapshot_tables/issues_from_user_stories.csv b/backend/plugins/taiga/e2e/snapshot_tables/issues_from_user_stories.csv new file mode 100644 index 00000000000..bad31c7405c --- /dev/null +++ b/backend/plugins/taiga/e2e/snapshot_tables/issues_from_user_stories.csv @@ -0,0 +1,3 @@ +id,url,icon_url,issue_key,title,description,epic_key,type,original_type,status,original_status,story_point,resolution_date,created_date,updated_date,lead_time_minutes,original_estimate_minutes,time_spent_minutes,time_remaining_minutes,creator_id,creator_name,assignee_id,assignee_name,parent_issue_id,priority,severity,urgency,component,original_project,is_subtask,due_date,fix_versions +taiga:TaigaUserStory:1:101,,,#1,Setup CI/CD Pipeline,,,USER_STORY,User Story,TODO,In Progress,8,,2024-01-15T10:00:00.000+00:00,2024-01-20T15:30:00.000+00:00,,,,,,,5,Alice Smith,,,,,,,0,, +taiga:TaigaUserStory:1:102,,,#2,User Authentication,,,USER_STORY,User Story,DONE,Done,5,2024-01-18T17:00:00.000+00:00,2024-01-10T09:00:00.000+00:00,2024-01-18T17:00:00.000+00:00,12000,,,,,,6,Bob Jones,,,,,,,0,, diff --git a/backend/plugins/taiga/e2e/task_test.go b/backend/plugins/taiga/e2e/task_test.go new file mode 100644 index 00000000000..aefa1fb8fd2 --- /dev/null +++ b/backend/plugins/taiga/e2e/task_test.go @@ -0,0 +1,74 @@ +/* +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 ( + "testing" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/plugins/taiga/impl" + "github.com/apache/incubator-devlake/plugins/taiga/models" + "github.com/apache/incubator-devlake/plugins/taiga/tasks" +) + +// TestTaigaTaskDataFlow verifies the full extract → convert pipeline for +// Taiga tasks: raw API JSON → _tool_taiga_tasks → ticket.Issue (type TASK). +// +// To regenerate snapshot CSVs from actual output, temporarily replace +// VerifyTableWithOptions with CreateSnapshot for each table. +func TestTaigaTaskDataFlow(t *testing.T) { + var taiga impl.Taiga + dataflowTester := e2ehelper.NewDataFlowTester(t, "taiga", taiga) + + taskData := &tasks.TaigaTaskData{ + Options: &tasks.TaigaOptions{ + ConnectionId: 1, + ProjectId: 1, + }, + } + + // ── Extraction: raw JSON → _tool_taiga_tasks ───────────────────────────── + dataflowTester.ImportCsvIntoRawTable( + "./raw_tables/_raw_taiga_api_tasks.csv", + "_raw_taiga_api_tasks", + ) + + dataflowTester.FlushTabler(&models.TaigaTask{}) + dataflowTester.Subtask(tasks.ExtractTasksMeta, taskData) + // Verify all tool-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(models.TaigaTask{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_taiga_tasks.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + + // ── Conversion: _tool_taiga_tasks → ticket.Issue / ticket.BoardIssue ───── + dataflowTester.FlushTabler(&ticket.Issue{}) + dataflowTester.FlushTabler(&ticket.BoardIssue{}) + dataflowTester.Subtask(tasks.ConvertTasksMeta, taskData) + // Verify all domain-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(ticket.Issue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/issues_from_tasks.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + dataflowTester.VerifyTableWithOptions(ticket.BoardIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/board_issues_from_tasks.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) +} diff --git a/backend/plugins/taiga/e2e/user_story_test.go b/backend/plugins/taiga/e2e/user_story_test.go new file mode 100644 index 00000000000..1cb8553e028 --- /dev/null +++ b/backend/plugins/taiga/e2e/user_story_test.go @@ -0,0 +1,74 @@ +/* +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 ( + "testing" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/helpers/e2ehelper" + "github.com/apache/incubator-devlake/plugins/taiga/impl" + "github.com/apache/incubator-devlake/plugins/taiga/models" + "github.com/apache/incubator-devlake/plugins/taiga/tasks" +) + +// TestTaigaUserStoryDataFlow verifies the full extract → convert pipeline +// for Taiga user stories: raw API JSON → _tool_taiga_user_stories → ticket.Issue. +// +// To regenerate snapshot CSVs from actual output, temporarily replace +// VerifyTableWithOptions with CreateSnapshot for each table. +func TestTaigaUserStoryDataFlow(t *testing.T) { + var taiga impl.Taiga + dataflowTester := e2ehelper.NewDataFlowTester(t, "taiga", taiga) + + taskData := &tasks.TaigaTaskData{ + Options: &tasks.TaigaOptions{ + ConnectionId: 1, + ProjectId: 1, + }, + } + + // ── Extraction: raw JSON → _tool_taiga_user_stories ───────────────────── + dataflowTester.ImportCsvIntoRawTable( + "./raw_tables/_raw_taiga_api_user_stories.csv", + "_raw_taiga_api_user_stories", + ) + + dataflowTester.FlushTabler(&models.TaigaUserStory{}) + dataflowTester.Subtask(tasks.ExtractUserStoriesMeta, taskData) + // Verify all tool-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(models.TaigaUserStory{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/_tool_taiga_user_stories.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + + // ── Conversion: _tool_taiga_user_stories → ticket.Issue / ticket.BoardIssue ─ + dataflowTester.FlushTabler(&ticket.Issue{}) + dataflowTester.FlushTabler(&ticket.BoardIssue{}) + dataflowTester.Subtask(tasks.ConvertUserStoriesMeta, taskData) + // Verify all domain-layer columns, ignoring NoPKModel timestamps and raw-data provenance. + dataflowTester.VerifyTableWithOptions(ticket.Issue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/issues_from_user_stories.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) + dataflowTester.VerifyTableWithOptions(ticket.BoardIssue{}, e2ehelper.TableOptions{ + CSVRelPath: "./snapshot_tables/board_issues_from_user_stories.csv", + IgnoreTypes: []interface{}{common.NoPKModel{}}, + }) +} diff --git a/backend/plugins/taiga/impl/impl.go b/backend/plugins/taiga/impl/impl.go new file mode 100644 index 00000000000..73e6e5b9fd7 --- /dev/null +++ b/backend/plugins/taiga/impl/impl.go @@ -0,0 +1,251 @@ +/* +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 impl + +import ( + "fmt" + + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + coreModels "github.com/apache/incubator-devlake/core/models" + "github.com/apache/incubator-devlake/core/plugin" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" + "github.com/apache/incubator-devlake/plugins/taiga/models/migrationscripts" + "github.com/apache/incubator-devlake/plugins/taiga/tasks" +) + +var _ interface { + plugin.PluginMeta + plugin.PluginInit + plugin.PluginTask + plugin.PluginApi + plugin.PluginModel + plugin.PluginMigration + plugin.DataSourcePluginBlueprintV200 + plugin.CloseablePluginTask + plugin.PluginSource +} = (*Taiga)(nil) + +type Taiga struct { +} + +func (p Taiga) Connection() dal.Tabler { + return &models.TaigaConnection{} +} + +func (p Taiga) Scope() plugin.ToolLayerScope { + return &models.TaigaProject{} +} + +func (p Taiga) ScopeConfig() dal.Tabler { + return &models.TaigaScopeConfig{} +} + +func (p Taiga) Init(basicRes context.BasicRes) errors.Error { + api.Init(basicRes, p) + return nil +} + +func (p Taiga) GetTablesInfo() []dal.Tabler { + return []dal.Tabler{ + &models.TaigaConnection{}, + &models.TaigaProject{}, + &models.TaigaUserStory{}, + &models.TaigaTask{}, + &models.TaigaIssue{}, + &models.TaigaEpic{}, + &models.TaigaScopeConfig{}, + } +} + +func (p Taiga) Description() string { + return "To collect and enrich data from Taiga" +} + +func (p Taiga) Name() string { + return "taiga" +} + +func (p Taiga) SubTaskMetas() []plugin.SubTaskMeta { + return []plugin.SubTaskMeta{ + tasks.CollectProjectsMeta, + tasks.ExtractProjectsMeta, + tasks.CollectUserStoriesMeta, + tasks.ExtractUserStoriesMeta, + tasks.CollectTasksMeta, + tasks.ExtractTasksMeta, + tasks.CollectIssuesMeta, + tasks.ExtractIssuesMeta, + tasks.CollectEpicsMeta, + tasks.ExtractEpicsMeta, + tasks.ConvertProjectsMeta, + tasks.ConvertUserStoriesMeta, + tasks.ConvertTasksMeta, + tasks.ConvertIssuesMeta, + tasks.ConvertEpicsMeta, + } +} + +func (p Taiga) PrepareTaskData(taskCtx plugin.TaskContext, options map[string]interface{}) (interface{}, errors.Error) { + var op tasks.TaigaOptions + var err errors.Error + logger := taskCtx.GetLogger() + logger.Debug("%v", options) + + err = helper.Decode(options, &op, nil) + if err != nil { + return nil, errors.Default.Wrap(err, "could not decode Taiga options") + } + + if op.ConnectionId == 0 { + return nil, errors.BadInput.New("taiga connectionId is invalid") + } + + connection := &models.TaigaConnection{} + connectionHelper := helper.NewConnectionHelper( + taskCtx, + nil, + p.Name(), + ) + err = connectionHelper.FirstById(connection, op.ConnectionId) + if err != nil { + return nil, errors.Default.Wrap(err, "unable to get Taiga connection") + } + + taigaApiClient, err := tasks.NewTaigaApiClient(taskCtx, connection) + if err != nil { + return nil, errors.Default.Wrap(err, "failed to create taiga api client") + } + + if op.ProjectId != 0 { + var scope *models.TaigaProject + db := taskCtx.GetDal() + err = db.First(&scope, dal.Where("connection_id = ? AND project_id = ?", op.ConnectionId, op.ProjectId)) + if err != nil && db.IsErrorNotFound(err) { + // Fetch from remote and save + // TODO: Implement fetching from Taiga API + return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find project: %d", op.ProjectId)) + } + if err != nil { + return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find project: %d", op.ProjectId)) + } + if op.ScopeConfigId == 0 && scope.ScopeConfigId != 0 { + op.ScopeConfigId = scope.ScopeConfigId + } + } + + if op.ScopeConfig == nil && op.ScopeConfigId != 0 { + var scopeConfig models.TaigaScopeConfig + db := taskCtx.GetDal() + err = taskCtx.GetDal().First(&scopeConfig, dal.Where("id = ?", op.ScopeConfigId)) + if err != nil && db.IsErrorNotFound(err) { + return nil, errors.BadInput.Wrap(err, "fail to get scopeConfig") + } + op.ScopeConfig = &scopeConfig + if err != nil { + return nil, errors.BadInput.Wrap(err, "fail to make scopeConfig") + } + } + + if op.ScopeConfig == nil && op.ScopeConfigId == 0 { + op.ScopeConfig = new(models.TaigaScopeConfig) + } + + // Set default page size + if op.PageSize <= 0 || op.PageSize > 100 { + op.PageSize = 100 + } + + taskData := &tasks.TaigaTaskData{ + Options: &op, + ApiClient: taigaApiClient, + } + + return taskData, nil +} + +func (p Taiga) MakeDataSourcePipelinePlanV200( + connectionId uint64, + scopes []*coreModels.BlueprintScope, +) (pp coreModels.PipelinePlan, sc []plugin.Scope, err errors.Error) { + return api.MakeDataSourcePipelinePlanV200(p.SubTaskMetas(), connectionId, scopes) +} + +func (p Taiga) RootPkgPath() string { + return "github.com/apache/incubator-devlake/plugins/taiga" +} + +func (p Taiga) MigrationScripts() []plugin.MigrationScript { + return migrationscripts.All() +} + +func (p Taiga) ApiResources() map[string]map[string]plugin.ApiResourceHandler { + return map[string]map[string]plugin.ApiResourceHandler{ + "test": { + "POST": api.TestConnection, + }, + "connections": { + "POST": api.PostConnections, + "GET": api.ListConnections, + }, + "connections/:connectionId": { + "PATCH": api.PatchConnection, + "DELETE": api.DeleteConnection, + "GET": api.GetConnection, + }, + "connections/:connectionId/test": { + "POST": api.TestExistingConnection, + }, + "connections/:connectionId/remote-scopes": { + "GET": api.RemoteScopes, + }, + "connections/:connectionId/scopes/:scopeId": { + "GET": api.GetScope, + "PATCH": api.UpdateScope, + "DELETE": api.DeleteScope, + }, + "connections/:connectionId/scopes": { + "GET": api.GetScopeList, + "PUT": api.PutScope, + }, + "connections/:connectionId/scope-configs": { + "POST": api.CreateScopeConfig, + "GET": api.GetScopeConfigList, + }, + "connections/:connectionId/scope-configs/:scopeConfigId": { + "PATCH": api.UpdateScopeConfig, + "GET": api.GetScopeConfig, + "DELETE": api.DeleteScopeConfig, + }, + "scope-config/:scopeConfigId/projects": { + "GET": api.GetProjectsByScopeConfig, + }, + } +} + +func (p Taiga) Close(taskCtx plugin.TaskContext) errors.Error { + data, ok := taskCtx.GetData().(*tasks.TaigaTaskData) + if !ok { + return errors.Default.New(fmt.Sprintf("GetData failed when try to close %+v", taskCtx)) + } + data.ApiClient.Release() + return nil +} diff --git a/backend/plugins/taiga/models/connection.go b/backend/plugins/taiga/models/connection.go new file mode 100644 index 00000000000..e97979331fb --- /dev/null +++ b/backend/plugins/taiga/models/connection.go @@ -0,0 +1,143 @@ +/* +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 models + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/utils" + helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" +) + +// TaigaConn holds the essential information to connect to the Taiga API +type TaigaConn struct { + helper.RestConnection `mapstructure:",squash"` + helper.BasicAuth `mapstructure:",squash"` + // Token is optional - can be provided directly or obtained via username/password auth + Token string `mapstructure:"token" json:"token" gorm:"serializer:encdec"` +} + +func (tc *TaigaConn) Sanitize() TaigaConn { + tc.Password = "" + tc.Token = utils.SanitizeString(tc.Token) + return *tc +} + +// SetupAuthentication sets up the HTTP request with authentication. +// If Token is set directly, use it. Otherwise exchange Username+Password for a token. +func (tc *TaigaConn) SetupAuthentication(req *http.Request) errors.Error { + if tc.Token != "" { + req.Header.Set("Authorization", "Bearer "+tc.Token) + return nil + } + if tc.Username != "" && tc.Password != "" { + token, err := tc.fetchToken() + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+token) + } + return nil +} + +// fetchToken exchanges username+password for a Taiga auth token via POST /auth +func (tc *TaigaConn) fetchToken() (string, errors.Error) { + endpoint := strings.TrimSuffix(tc.Endpoint, "/") + // strip /api/v1 suffix to get base, then re-add /api/v1/auth + authURL := endpoint + "/auth" + + body, e := json.Marshal(map[string]string{ + "type": "normal", + "username": tc.Username, + "password": tc.Password, + }) + if e != nil { + return "", errors.Default.WrapRaw(e) + } + + resp, e := http.Post(authURL, "application/json", bytes.NewReader(body)) //nolint:noctx + if e != nil { + return "", errors.Default.WrapRaw(e) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return "", errors.Default.New(fmt.Sprintf("taiga auth failed with status %d", resp.StatusCode)) + } + + var result map[string]interface{} + if e := json.NewDecoder(resp.Body).Decode(&result); e != nil { + return "", errors.Default.WrapRaw(e) + } + // Taiga returns auth_token (v5) or token (v6) + for _, key := range []string{"auth_token", "token"} { + if t, ok := result[key]; ok { + if token, ok := t.(string); ok && token != "" { + return token, nil + } + } + } + // fallback: read raw body hint + raw, _ := io.ReadAll(bytes.NewReader(body)) + return "", errors.Default.New(fmt.Sprintf("taiga auth response missing token field, body: %s", string(raw))) +} + +// TaigaConnection holds TaigaConn plus ID/Name for database storage +type TaigaConnection struct { + helper.BaseConnection `mapstructure:",squash"` + TaigaConn `mapstructure:",squash"` +} + +func (TaigaConnection) TableName() string { + return "_tool_taiga_connections" +} + +func (connection *TaigaConnection) MergeFromRequest(target *TaigaConnection, body map[string]interface{}) error { + token := target.Token + password := target.Password + + if err := helper.DecodeMapStruct(body, target, true); err != nil { + return err + } + + modifiedToken := target.Token + modifiedPassword := target.Password + + // preserve existing token if not modified + if modifiedToken == "" || modifiedToken == utils.SanitizeString(token) { + target.Token = token + } + + // preserve existing password if not modified + if modifiedPassword == "" || modifiedPassword == password { + target.Password = password + } + + return nil +} + +func (connection TaigaConnection) Sanitize() TaigaConnection { + connection.TaigaConn = connection.TaigaConn.Sanitize() + return connection +} diff --git a/backend/plugins/taiga/models/epic.go b/backend/plugins/taiga/models/epic.go new file mode 100644 index 00000000000..1c808b380f9 --- /dev/null +++ b/backend/plugins/taiga/models/epic.go @@ -0,0 +1,45 @@ +/* +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 models + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/common" +) + +// TaigaEpic represents an epic in Taiga +type TaigaEpic struct { + common.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"index"` + EpicId uint64 `gorm:"primaryKey;autoIncrement:false" json:"id"` + Ref int `json:"ref"` + Subject string `gorm:"type:varchar(255)" json:"subject"` + Status string `gorm:"type:varchar(100)" json:"status"` + IsClosed bool `json:"isClosed"` + CreatedDate *time.Time `json:"createdDate"` + ModifiedDate *time.Time `json:"modifiedDate"` + AssignedTo uint64 `json:"assignedTo"` + AssignedToName string `gorm:"type:varchar(255)" json:"assignedToName"` + Color string `gorm:"type:varchar(20)" json:"color"` +} + +func (TaigaEpic) TableName() string { + return "_tool_taiga_epics" +} diff --git a/backend/plugins/taiga/models/issue.go b/backend/plugins/taiga/models/issue.go new file mode 100644 index 00000000000..90dda4f6503 --- /dev/null +++ b/backend/plugins/taiga/models/issue.go @@ -0,0 +1,49 @@ +/* +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 models + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/common" +) + +// TaigaIssue represents an issue (bug/enhancement/question) in Taiga +type TaigaIssue struct { + common.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"index"` + IssueId uint64 `gorm:"primaryKey;autoIncrement:false" json:"id"` + Ref int `json:"ref"` + Subject string `gorm:"type:varchar(255)" json:"subject"` + Status string `gorm:"type:varchar(100)" json:"status"` + IssueTypeName string `gorm:"type:varchar(100)" json:"issueTypeName"` // e.g. "Bug", "Enhancement", "Question" + Priority string `gorm:"type:varchar(100)" json:"priority"` + Severity string `gorm:"type:varchar(100)" json:"severity"` + IsClosed bool `json:"isClosed"` + CreatedDate *time.Time `json:"createdDate"` + ModifiedDate *time.Time `json:"modifiedDate"` + FinishedDate *time.Time `json:"finishedDate"` + AssignedTo uint64 `json:"assignedTo"` + AssignedToName string `gorm:"type:varchar(255)" json:"assignedToName"` + MilestoneId uint64 `json:"milestoneId"` +} + +func (TaigaIssue) TableName() string { + return "_tool_taiga_issues" +} diff --git a/backend/plugins/taiga/models/migrationscripts/20250220_add_init_tables.go b/backend/plugins/taiga/models/migrationscripts/20250220_add_init_tables.go new file mode 100644 index 00000000000..3a0a6beeed3 --- /dev/null +++ b/backend/plugins/taiga/models/migrationscripts/20250220_add_init_tables.go @@ -0,0 +1,132 @@ +/* +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 migrationscripts + +import ( + "time" + + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/helpers/migrationhelper" +) + +type TaigaConnection20250220 struct { + ID uint64 `gorm:"primaryKey" json:"id"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + Name string `gorm:"type:varchar(100);uniqueIndex" json:"name"` + Endpoint string `json:"endpoint"` + Username string `json:"username"` + Password string `json:"password"` + Token string `json:"token"` + Proxy string `json:"proxy"` + RateLimitPerHour int `json:"rateLimitPerHour"` +} + +func (TaigaConnection20250220) TableName() string { + return "_tool_taiga_connections" +} + +type TaigaProject20250220 struct { + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"primaryKey;autoIncrement:false"` + Name string `gorm:"type:varchar(255)"` + Slug string `gorm:"type:varchar(255)"` + Description string `gorm:"type:text"` + Url string `gorm:"type:varchar(255)"` + IsPrivate bool + TotalMilestones int + TotalStoryPoints float64 + CreatedAt time.Time + UpdatedAt time.Time + RawDataParams string `gorm:"column:_raw_data_params;type:varchar(255);index"` + RawDataTable string `gorm:"column:_raw_data_table;type:varchar(255)"` + RawDataId uint64 `gorm:"column:_raw_data_id"` + RawDataRemark string `gorm:"column:_raw_data_remark"` + ScopeConfigId uint64 +} + +func (TaigaProject20250220) TableName() string { + return "_tool_taiga_projects" +} + +type TaigaScopeConfig20250220 struct { + ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + ConnectionId uint64 `json:"connectionId" gorm:"index"` + Name string `gorm:"type:varchar(255);uniqueIndex" json:"name"` + Entities string `gorm:"type:json" json:"entities"` +} + +func (TaigaScopeConfig20250220) TableName() string { + return "_tool_taiga_scope_configs" +} + +type TaigaUserStory20250220 struct { + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"index"` + UserStoryId uint64 `gorm:"primaryKey;autoIncrement:false"` + Ref int + Subject string `gorm:"type:varchar(255)"` + Description string `gorm:"type:text"` + Status string `gorm:"type:varchar(100)"` + StatusColor string `gorm:"type:varchar(20)"` + IsClosed bool + CreatedDate *time.Time + ModifiedDate *time.Time + FinishedDate *time.Time + AssignedTo uint64 + AssignedToName string `gorm:"type:varchar(255)"` + TotalPoints float64 + MilestoneId uint64 + MilestoneName string `gorm:"type:varchar(255)"` + Priority int + IsBlocked bool + BlockedNote string `gorm:"type:text"` + CreatedAt time.Time + UpdatedAt time.Time + RawDataParams string `gorm:"column:_raw_data_params;type:varchar(255);index"` + RawDataTable string `gorm:"column:_raw_data_table;type:varchar(255)"` + RawDataId uint64 `gorm:"column:_raw_data_id"` + RawDataRemark string `gorm:"column:_raw_data_remark"` +} + +func (TaigaUserStory20250220) TableName() string { + return "_tool_taiga_user_stories" +} + +type addInitTables20250220 struct{} + +func (*addInitTables20250220) Up(basicRes context.BasicRes) errors.Error { + return migrationhelper.AutoMigrateTables( + basicRes, + &TaigaConnection20250220{}, + &TaigaProject20250220{}, + &TaigaScopeConfig20250220{}, + &TaigaUserStory20250220{}, + ) +} + +func (*addInitTables20250220) Version() uint64 { + return 20250220000001 +} + +func (*addInitTables20250220) Name() string { + return "Taiga init schemas" +} diff --git a/backend/plugins/taiga/models/migrationscripts/20260306_add_task_issue_epic_tables.go b/backend/plugins/taiga/models/migrationscripts/20260306_add_task_issue_epic_tables.go new file mode 100644 index 00000000000..ff84ba19b84 --- /dev/null +++ b/backend/plugins/taiga/models/migrationscripts/20260306_add_task_issue_epic_tables.go @@ -0,0 +1,128 @@ +/* +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 migrationscripts + +import ( + "time" + + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/helpers/migrationhelper" +) + +type TaigaTask20260306 struct { + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"index"` + TaskId uint64 `gorm:"primaryKey;autoIncrement:false"` + Ref int + Subject string `gorm:"type:varchar(255)"` + Status string `gorm:"type:varchar(100)"` + IsClosed bool + CreatedDate *time.Time + ModifiedDate *time.Time + FinishedDate *time.Time + AssignedTo uint64 + AssignedToName string `gorm:"type:varchar(255)"` + UserStoryId uint64 + MilestoneId uint64 + IsBlocked bool + BlockedNote string `gorm:"type:text"` + CreatedAt time.Time + UpdatedAt time.Time + RawDataParams string `gorm:"column:_raw_data_params;type:varchar(255);index"` + RawDataTable string `gorm:"column:_raw_data_table;type:varchar(255)"` + RawDataId uint64 `gorm:"column:_raw_data_id"` + RawDataRemark string `gorm:"column:_raw_data_remark"` +} + +func (TaigaTask20260306) TableName() string { + return "_tool_taiga_tasks" +} + +type TaigaIssue20260306 struct { + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"index"` + IssueId uint64 `gorm:"primaryKey;autoIncrement:false"` + Ref int + Subject string `gorm:"type:varchar(255)"` + Status string `gorm:"type:varchar(100)"` + IssueTypeName string `gorm:"type:varchar(100)"` + Priority string `gorm:"type:varchar(100)"` + Severity string `gorm:"type:varchar(100)"` + IsClosed bool + CreatedDate *time.Time + ModifiedDate *time.Time + FinishedDate *time.Time + AssignedTo uint64 + AssignedToName string `gorm:"type:varchar(255)"` + MilestoneId uint64 + CreatedAt time.Time + UpdatedAt time.Time + RawDataParams string `gorm:"column:_raw_data_params;type:varchar(255);index"` + RawDataTable string `gorm:"column:_raw_data_table;type:varchar(255)"` + RawDataId uint64 `gorm:"column:_raw_data_id"` + RawDataRemark string `gorm:"column:_raw_data_remark"` +} + +func (TaigaIssue20260306) TableName() string { + return "_tool_taiga_issues" +} + +type TaigaEpic20260306 struct { + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"index"` + EpicId uint64 `gorm:"primaryKey;autoIncrement:false"` + Ref int + Subject string `gorm:"type:varchar(255)"` + Status string `gorm:"type:varchar(100)"` + IsClosed bool + CreatedDate *time.Time + ModifiedDate *time.Time + AssignedTo uint64 + AssignedToName string `gorm:"type:varchar(255)"` + Color string `gorm:"type:varchar(20)"` + CreatedAt time.Time + UpdatedAt time.Time + RawDataParams string `gorm:"column:_raw_data_params;type:varchar(255);index"` + RawDataTable string `gorm:"column:_raw_data_table;type:varchar(255)"` + RawDataId uint64 `gorm:"column:_raw_data_id"` + RawDataRemark string `gorm:"column:_raw_data_remark"` +} + +func (TaigaEpic20260306) TableName() string { + return "_tool_taiga_epics" +} + +type addTaskIssueEpicTables20260306 struct{} + +func (*addTaskIssueEpicTables20260306) Up(basicRes context.BasicRes) errors.Error { + return migrationhelper.AutoMigrateTables( + basicRes, + &TaigaTask20260306{}, + &TaigaIssue20260306{}, + &TaigaEpic20260306{}, + ) +} + +func (*addTaskIssueEpicTables20260306) Version() uint64 { + return 20260306000001 +} + +func (*addTaskIssueEpicTables20260306) Name() string { + return "Taiga add task, issue, epic tables" +} diff --git a/backend/plugins/taiga/models/migrationscripts/register.go b/backend/plugins/taiga/models/migrationscripts/register.go new file mode 100644 index 00000000000..d2cfd08e269 --- /dev/null +++ b/backend/plugins/taiga/models/migrationscripts/register.go @@ -0,0 +1,30 @@ +/* +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 migrationscripts + +import ( + "github.com/apache/incubator-devlake/core/plugin" +) + +// All return all the migration scripts +func All() []plugin.MigrationScript { + return []plugin.MigrationScript{ + new(addInitTables20250220), + new(addTaskIssueEpicTables20260306), + } +} diff --git a/backend/plugins/taiga/models/project.go b/backend/plugins/taiga/models/project.go new file mode 100644 index 00000000000..7b26125624e --- /dev/null +++ b/backend/plugins/taiga/models/project.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 models + +import ( + "fmt" + + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/plugin" +) + +// TaigaProject represents a Taiga project (scope) +type TaigaProject struct { + common.Scope `mapstructure:",squash"` + ProjectId uint64 `json:"projectId" gorm:"primaryKey;autoIncrement:false"` + Name string `gorm:"type:varchar(255)" json:"name"` + Slug string `gorm:"type:varchar(255)" json:"slug"` + Description string `gorm:"type:text" json:"description"` + Url string `gorm:"type:varchar(255)" json:"url"` + IsPrivate bool `json:"isPrivate"` + TotalMilestones int `json:"totalMilestones"` + TotalStoryPoints float64 `json:"totalStoryPoints"` +} + +func (p TaigaProject) ScopeId() string { + return fmt.Sprintf("%d", p.ProjectId) +} + +func (p TaigaProject) ScopeName() string { + return p.Name +} + +func (p TaigaProject) ScopeFullName() string { + return p.Name +} + +func (p TaigaProject) ScopeParams() interface{} { + return &plugin.ApiResourceInput{ + Params: map[string]string{ + "connectionId": fmt.Sprintf("%d", p.ConnectionId), + "projectId": fmt.Sprintf("%d", p.ProjectId), + }, + } +} + +func (TaigaProject) TableName() string { + return "_tool_taiga_projects" +} diff --git a/backend/plugins/taiga/models/scope_config.go b/backend/plugins/taiga/models/scope_config.go new file mode 100644 index 00000000000..c6397083bca --- /dev/null +++ b/backend/plugins/taiga/models/scope_config.go @@ -0,0 +1,53 @@ +/* +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 models + +import ( + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/common" +) + +type StatusMapping struct { + StandardStatus string `json:"standardStatus"` +} + +type StatusMappings map[string]StatusMapping + +type TypeMapping struct { + StandardType string `json:"standardType"` + StatusMappings StatusMappings `json:"statusMappings"` +} + +type TaigaScopeConfig struct { + common.ScopeConfig `mapstructure:",squash" json:",inline" gorm:"embedded"` + TypeMappings map[string]TypeMapping `mapstructure:"typeMappings,omitempty" json:"typeMappings" gorm:"type:json;serializer:json"` +} + +func (r *TaigaScopeConfig) SetConnectionId(c *TaigaScopeConfig, connectionId uint64) { + c.ConnectionId = connectionId + c.ScopeConfig.ConnectionId = connectionId +} + +func (r *TaigaScopeConfig) Validate() errors.Error { + // Add validation logic if needed + return nil +} + +func (r TaigaScopeConfig) TableName() string { + return "_tool_taiga_scope_configs" +} diff --git a/backend/plugins/taiga/models/task.go b/backend/plugins/taiga/models/task.go new file mode 100644 index 00000000000..248267cf9c2 --- /dev/null +++ b/backend/plugins/taiga/models/task.go @@ -0,0 +1,49 @@ +/* +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 models + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/common" +) + +// TaigaTask represents a task (sub-task of a user story) in Taiga +type TaigaTask struct { + common.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"index"` + TaskId uint64 `gorm:"primaryKey;autoIncrement:false" json:"id"` + Ref int `json:"ref"` + Subject string `gorm:"type:varchar(255)" json:"subject"` + Status string `gorm:"type:varchar(100)" json:"status"` + IsClosed bool `json:"isClosed"` + CreatedDate *time.Time `json:"createdDate"` + ModifiedDate *time.Time `json:"modifiedDate"` + FinishedDate *time.Time `json:"finishedDate"` + AssignedTo uint64 `json:"assignedTo"` + AssignedToName string `gorm:"type:varchar(255)" json:"assignedToName"` + UserStoryId uint64 `json:"userStoryId"` + MilestoneId uint64 `json:"milestoneId"` + IsBlocked bool `json:"isBlocked"` + BlockedNote string `gorm:"type:text" json:"blockedNote"` +} + +func (TaigaTask) TableName() string { + return "_tool_taiga_tasks" +} diff --git a/backend/plugins/taiga/models/user_story.go b/backend/plugins/taiga/models/user_story.go new file mode 100644 index 00000000000..498584477dc --- /dev/null +++ b/backend/plugins/taiga/models/user_story.go @@ -0,0 +1,53 @@ +/* +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 models + +import ( + "time" + + "github.com/apache/incubator-devlake/core/models/common" +) + +// TaigaUserStory represents a user story in Taiga +type TaigaUserStory struct { + common.NoPKModel + ConnectionId uint64 `gorm:"primaryKey"` + ProjectId uint64 `gorm:"index"` + UserStoryId uint64 `gorm:"primaryKey;autoIncrement:false" json:"id"` + Ref int `json:"ref"` + Subject string `gorm:"type:varchar(255)" json:"subject"` + Description string `gorm:"type:text" json:"description"` + Status string `gorm:"type:varchar(100)" json:"status"` + StatusColor string `gorm:"type:varchar(20)" json:"statusColor"` + IsClosed bool `json:"isClosed"` + CreatedDate *time.Time `json:"createdDate"` + ModifiedDate *time.Time `json:"modifiedDate"` + FinishedDate *time.Time `json:"finishedDate"` + AssignedTo uint64 `json:"assignedTo"` + AssignedToName string `gorm:"type:varchar(255)" json:"assignedToName"` + TotalPoints float64 `json:"totalPoints"` + MilestoneId uint64 `json:"milestoneId"` + MilestoneName string `gorm:"type:varchar(255)" json:"milestoneName"` + Priority int `json:"priority"` + IsBlocked bool `json:"isBlocked"` + BlockedNote string `gorm:"type:text" json:"blockedNote"` +} + +func (TaigaUserStory) TableName() string { + return "_tool_taiga_user_stories" +} diff --git a/backend/plugins/taiga/taiga.go b/backend/plugins/taiga/taiga.go new file mode 100644 index 00000000000..4a6da00a8a1 --- /dev/null +++ b/backend/plugins/taiga/taiga.go @@ -0,0 +1,45 @@ +/* +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 main // must be main for plugin entry point + +import ( + "github.com/apache/incubator-devlake/core/runner" + "github.com/apache/incubator-devlake/plugins/taiga/impl" + "github.com/spf13/cobra" +) + +// PluginEntry exports a symbol for Framework to load +var PluginEntry impl.Taiga //nolint + +// standalone mode for debugging +func main() { + cmd := &cobra.Command{Use: "taiga"} + connectionId := cmd.Flags().Uint64P("connectionId", "c", 0, "taiga connection id") + projectId := cmd.Flags().Uint64P("projectId", "p", 0, "taiga project id") + timeAfter := cmd.Flags().StringP("timeAfter", "a", "", "collect data that are created after specified time, ie 2006-01-02T15:04:05Z") + _ = cmd.MarkFlagRequired("connectionId") + _ = cmd.MarkFlagRequired("projectId") + + cmd.Run = func(cmd *cobra.Command, args []string) { + runner.DirectRun(cmd, args, PluginEntry, map[string]interface{}{ + "connectionId": *connectionId, + "projectId": *projectId, + }, *timeAfter) + } + runner.RunCmd(cmd) +} diff --git a/backend/plugins/taiga/tasks/api_client.go b/backend/plugins/taiga/tasks/api_client.go new file mode 100644 index 00000000000..4b722cc1a6c --- /dev/null +++ b/backend/plugins/taiga/tasks/api_client.go @@ -0,0 +1,49 @@ +/* +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/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +func NewTaigaApiClient(taskCtx plugin.TaskContext, connection *models.TaigaConnection) (*api.ApiAsyncClient, errors.Error) { + // create synchronize api client + apiClient, err := api.NewApiClientFromConnection(taskCtx.GetContext(), taskCtx, connection) + if err != nil { + return nil, err + } + + // create rate limit calculator + rateLimiter := &api.ApiRateLimitCalculator{ + UserRateLimitPerHour: connection.RateLimitPerHour, + } + + asyncApiClient, err := api.CreateAsyncApiClient( + taskCtx, + apiClient, + rateLimiter, + ) + if err != nil { + return nil, err + } + + return asyncApiClient, nil +} diff --git a/backend/plugins/taiga/tasks/epic_collector.go b/backend/plugins/taiga/tasks/epic_collector.go new file mode 100644 index 00000000000..f99d48aabee --- /dev/null +++ b/backend/plugins/taiga/tasks/epic_collector.go @@ -0,0 +1,79 @@ +/* +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" + "fmt" + "net/http" + "net/url" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" +) + +const RAW_EPIC_TABLE = "taiga_api_epics" + +var _ plugin.SubTaskEntryPoint = CollectEpics + +var CollectEpicsMeta = plugin.SubTaskMeta{ + Name: "collectEpics", + EntryPoint: CollectEpics, + EnabledByDefault: true, + Description: "collect Taiga epics", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func CollectEpics(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + logger := taskCtx.GetLogger() + logger.Info("collect epics") + + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_EPIC_TABLE, + }, + ApiClient: data.ApiClient, + PageSize: 1000, + UrlTemplate: "epics", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("project", fmt.Sprintf("%d", data.Options.ProjectId)) + return query, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var result []json.RawMessage + err := api.UnmarshalResponse(res, &result) + if err != nil { + return nil, err + } + return result, nil + }, + }) + if err != nil { + logger.Error(err, "collect epics error") + return err + } + return collector.Execute() +} diff --git a/backend/plugins/taiga/tasks/epic_convertor.go b/backend/plugins/taiga/tasks/epic_convertor.go new file mode 100644 index 00000000000..ed5bb53b0fb --- /dev/null +++ b/backend/plugins/taiga/tasks/epic_convertor.go @@ -0,0 +1,106 @@ +/* +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/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var ConvertEpicsMeta = plugin.SubTaskMeta{ + Name: "convertEpics", + EntryPoint: ConvertEpics, + EnabledByDefault: true, + Description: "convert Taiga epics", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ConvertEpics(subtaskCtx plugin.SubTaskContext) errors.Error { + logger := subtaskCtx.GetLogger() + data := subtaskCtx.GetData().(*TaigaTaskData) + db := subtaskCtx.GetDal() + + epicIdGen := didgen.NewDomainIdGenerator(&models.TaigaEpic{}) + boardIdGen := didgen.NewDomainIdGenerator(&models.TaigaProject{}) + boardId := boardIdGen.Generate(data.Options.ConnectionId, data.Options.ProjectId) + + converter, err := api.NewStatefulDataConverter(&api.StatefulDataConverterArgs[models.TaigaEpic]{ + SubtaskCommonArgs: &api.SubtaskCommonArgs{ + SubTaskContext: subtaskCtx, + Table: RAW_EPIC_TABLE, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + }, + Input: func(stateManager *api.SubtaskStateManager) (dal.Rows, errors.Error) { + clauses := []dal.Clause{ + dal.Select("*"), + dal.From(&models.TaigaEpic{}), + dal.Where("connection_id = ?", data.Options.ConnectionId), + } + if stateManager.IsIncremental() { + since := stateManager.GetSince() + if since != nil { + clauses = append(clauses, dal.Where("updated_at >= ?", since)) + } + } + return db.Cursor(clauses...) + }, + Convert: func(epic *models.TaigaEpic) ([]interface{}, errors.Error) { + var result []interface{} + + issue := &ticket.Issue{ + DomainEntity: domainlayer.DomainEntity{ + Id: epicIdGen.Generate(epic.ConnectionId, epic.EpicId), + }, + IssueKey: epic.Subject, + Title: epic.Subject, + Type: "EPIC", + OriginalType: "Epic", + Status: epic.Status, + OriginalStatus: epic.Status, + CreatedDate: epic.CreatedDate, + UpdatedDate: epic.ModifiedDate, + } + + result = append(result, issue) + + boardIssue := &ticket.BoardIssue{ + BoardId: boardId, + IssueId: issue.Id, + } + result = append(result, boardIssue) + + logger.Debug("converted epic %d", epic.EpicId) + return result, nil + }, + }) + + if err != nil { + return err + } + + return converter.Execute() +} diff --git a/backend/plugins/taiga/tasks/epic_extractor.go b/backend/plugins/taiga/tasks/epic_extractor.go new file mode 100644 index 00000000000..6acd76dacf9 --- /dev/null +++ b/backend/plugins/taiga/tasks/epic_extractor.go @@ -0,0 +1,106 @@ +/* +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" + "time" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractEpics + +var ExtractEpicsMeta = plugin.SubTaskMeta{ + Name: "extractEpics", + EntryPoint: ExtractEpics, + EnabledByDefault: true, + Description: "extract Taiga epics", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ExtractEpics(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_EPIC_TABLE, + }, + Extract: func(row *api.RawData) ([]interface{}, errors.Error) { + var apiEpic struct { + Id uint64 `json:"id"` + Ref int `json:"ref"` + Subject string `json:"subject"` + StatusExtraInfo struct { + Name string `json:"name"` + } `json:"status_extra_info"` + IsClosed bool `json:"is_closed"` + CreatedDate *time.Time `json:"created_date"` + ModifiedDate *time.Time `json:"modified_date"` + AssignedTo *uint64 `json:"assigned_to"` + AssignedToExtraInfo *struct { + FullNameDisplay string `json:"full_name_display"` + } `json:"assigned_to_extra_info"` + Color string `json:"color"` + } + err := json.Unmarshal(row.Data, &apiEpic) + if err != nil { + return nil, errors.Default.Wrap(err, "error unmarshalling epic") + } + + var assignedTo uint64 + var assignedToName string + if apiEpic.AssignedTo != nil { + assignedTo = *apiEpic.AssignedTo + } + if apiEpic.AssignedToExtraInfo != nil { + assignedToName = apiEpic.AssignedToExtraInfo.FullNameDisplay + } + + epic := &models.TaigaEpic{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + EpicId: apiEpic.Id, + Ref: apiEpic.Ref, + Subject: apiEpic.Subject, + Status: apiEpic.StatusExtraInfo.Name, + IsClosed: apiEpic.IsClosed, + CreatedDate: apiEpic.CreatedDate, + ModifiedDate: apiEpic.ModifiedDate, + AssignedTo: assignedTo, + AssignedToName: assignedToName, + Color: apiEpic.Color, + } + + return []interface{}{epic}, nil + }, + }) + + if err != nil { + return err + } + + return extractor.Execute() +} diff --git a/backend/plugins/taiga/tasks/issue_collector.go b/backend/plugins/taiga/tasks/issue_collector.go new file mode 100644 index 00000000000..cf79d539901 --- /dev/null +++ b/backend/plugins/taiga/tasks/issue_collector.go @@ -0,0 +1,79 @@ +/* +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" + "fmt" + "net/http" + "net/url" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" +) + +const RAW_ISSUE_TABLE = "taiga_api_issues" + +var _ plugin.SubTaskEntryPoint = CollectIssues + +var CollectIssuesMeta = plugin.SubTaskMeta{ + Name: "collectIssues", + EntryPoint: CollectIssues, + EnabledByDefault: true, + Description: "collect Taiga issues", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func CollectIssues(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + logger := taskCtx.GetLogger() + logger.Info("collect issues") + + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_ISSUE_TABLE, + }, + ApiClient: data.ApiClient, + PageSize: 1000, + UrlTemplate: "issues", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("project", fmt.Sprintf("%d", data.Options.ProjectId)) + return query, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var result []json.RawMessage + err := api.UnmarshalResponse(res, &result) + if err != nil { + return nil, err + } + return result, nil + }, + }) + if err != nil { + logger.Error(err, "collect issues error") + return err + } + return collector.Execute() +} diff --git a/backend/plugins/taiga/tasks/issue_convertor.go b/backend/plugins/taiga/tasks/issue_convertor.go new file mode 100644 index 00000000000..5612a3b588c --- /dev/null +++ b/backend/plugins/taiga/tasks/issue_convertor.go @@ -0,0 +1,132 @@ +/* +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 ( + "strings" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var ConvertIssuesMeta = plugin.SubTaskMeta{ + Name: "convertIssues", + EntryPoint: ConvertIssues, + EnabledByDefault: true, + Description: "convert Taiga issues", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +// taigaIssueTypeToDevLake maps Taiga's customizable issue type names to +// DevLake standard issue types. Taiga's default types are Bug, Enhancement, +// and Question; additional custom types fall back to REQUIREMENT. +func taigaIssueTypeToDevLake(typeName string) string { + switch strings.ToLower(typeName) { + case "bug": + return "BUG" + case "enhancement", "feature": + return "REQUIREMENT" + case "question": + return "QUESTION" + default: + return "REQUIREMENT" + } +} + +func ConvertIssues(subtaskCtx plugin.SubTaskContext) errors.Error { + logger := subtaskCtx.GetLogger() + data := subtaskCtx.GetData().(*TaigaTaskData) + db := subtaskCtx.GetDal() + + issueIdGen := didgen.NewDomainIdGenerator(&models.TaigaIssue{}) + boardIdGen := didgen.NewDomainIdGenerator(&models.TaigaProject{}) + boardId := boardIdGen.Generate(data.Options.ConnectionId, data.Options.ProjectId) + + converter, err := api.NewStatefulDataConverter(&api.StatefulDataConverterArgs[models.TaigaIssue]{ + SubtaskCommonArgs: &api.SubtaskCommonArgs{ + SubTaskContext: subtaskCtx, + Table: RAW_ISSUE_TABLE, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + }, + Input: func(stateManager *api.SubtaskStateManager) (dal.Rows, errors.Error) { + clauses := []dal.Clause{ + dal.Select("*"), + dal.From(&models.TaigaIssue{}), + dal.Where("connection_id = ?", data.Options.ConnectionId), + } + if stateManager.IsIncremental() { + since := stateManager.GetSince() + if since != nil { + clauses = append(clauses, dal.Where("updated_at >= ?", since)) + } + } + return db.Cursor(clauses...) + }, + Convert: func(taigaIssue *models.TaigaIssue) ([]interface{}, errors.Error) { + var result []interface{} + + devLakeType := taigaIssueTypeToDevLake(taigaIssue.IssueTypeName) + originalType := taigaIssue.IssueTypeName + if originalType == "" { + originalType = "Issue" + } + + issue := &ticket.Issue{ + DomainEntity: domainlayer.DomainEntity{ + Id: issueIdGen.Generate(taigaIssue.ConnectionId, taigaIssue.IssueId), + }, + IssueKey: taigaIssue.Subject, + Title: taigaIssue.Subject, + Type: devLakeType, + OriginalType: originalType, + Status: taigaIssue.Status, + OriginalStatus: taigaIssue.Status, + Priority: taigaIssue.Priority, + CreatedDate: taigaIssue.CreatedDate, + UpdatedDate: taigaIssue.ModifiedDate, + ResolutionDate: taigaIssue.FinishedDate, + } + + result = append(result, issue) + + boardIssue := &ticket.BoardIssue{ + BoardId: boardId, + IssueId: issue.Id, + } + result = append(result, boardIssue) + + logger.Debug("converted issue %d (type: %s → %s)", taigaIssue.IssueId, originalType, devLakeType) + return result, nil + }, + }) + + if err != nil { + return err + } + + return converter.Execute() +} diff --git a/backend/plugins/taiga/tasks/issue_extractor.go b/backend/plugins/taiga/tasks/issue_extractor.go new file mode 100644 index 00000000000..f2dd54ca995 --- /dev/null +++ b/backend/plugins/taiga/tasks/issue_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" + "time" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractIssues + +var ExtractIssuesMeta = plugin.SubTaskMeta{ + Name: "extractIssues", + EntryPoint: ExtractIssues, + EnabledByDefault: true, + Description: "extract Taiga issues", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ExtractIssues(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_ISSUE_TABLE, + }, + Extract: func(row *api.RawData) ([]interface{}, errors.Error) { + var apiIssue struct { + Id uint64 `json:"id"` + Ref int `json:"ref"` + Subject string `json:"subject"` + StatusExtraInfo struct { + Name string `json:"name"` + } `json:"status_extra_info"` + TypeExtraInfo *struct { + Name string `json:"name"` + } `json:"type_extra_info"` + PriorityExtraInfo *struct { + Name string `json:"name"` + } `json:"priority_extra_info"` + SeverityExtraInfo *struct { + Name string `json:"name"` + } `json:"severity_extra_info"` + IsClosed bool `json:"is_closed"` + CreatedDate *time.Time `json:"created_date"` + ModifiedDate *time.Time `json:"modified_date"` + FinishedDate *time.Time `json:"finished_date"` + AssignedTo *uint64 `json:"assigned_to"` + AssignedToExtraInfo *struct { + FullNameDisplay string `json:"full_name_display"` + } `json:"assigned_to_extra_info"` + Milestone *uint64 `json:"milestone"` + } + err := json.Unmarshal(row.Data, &apiIssue) + if err != nil { + return nil, errors.Default.Wrap(err, "error unmarshalling issue") + } + + var assignedTo uint64 + var assignedToName string + if apiIssue.AssignedTo != nil { + assignedTo = *apiIssue.AssignedTo + } + if apiIssue.AssignedToExtraInfo != nil { + assignedToName = apiIssue.AssignedToExtraInfo.FullNameDisplay + } + var issueTypeName string + if apiIssue.TypeExtraInfo != nil { + issueTypeName = apiIssue.TypeExtraInfo.Name + } + var priority string + if apiIssue.PriorityExtraInfo != nil { + priority = apiIssue.PriorityExtraInfo.Name + } + var severity string + if apiIssue.SeverityExtraInfo != nil { + severity = apiIssue.SeverityExtraInfo.Name + } + var milestoneId uint64 + if apiIssue.Milestone != nil { + milestoneId = *apiIssue.Milestone + } + + issue := &models.TaigaIssue{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + IssueId: apiIssue.Id, + Ref: apiIssue.Ref, + Subject: apiIssue.Subject, + Status: apiIssue.StatusExtraInfo.Name, + IssueTypeName: issueTypeName, + Priority: priority, + Severity: severity, + IsClosed: apiIssue.IsClosed, + CreatedDate: apiIssue.CreatedDate, + ModifiedDate: apiIssue.ModifiedDate, + FinishedDate: apiIssue.FinishedDate, + AssignedTo: assignedTo, + AssignedToName: assignedToName, + MilestoneId: milestoneId, + } + + return []interface{}{issue}, nil + }, + }) + + if err != nil { + return err + } + + return extractor.Execute() +} diff --git a/backend/plugins/taiga/tasks/project_collector.go b/backend/plugins/taiga/tasks/project_collector.go new file mode 100644 index 00000000000..4a6462b40f6 --- /dev/null +++ b/backend/plugins/taiga/tasks/project_collector.go @@ -0,0 +1,76 @@ +/* +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" + "net/http" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" +) + +const RAW_PROJECT_TABLE = "taiga_api_projects" + +var _ plugin.SubTaskEntryPoint = CollectProjects + +var CollectProjectsMeta = plugin.SubTaskMeta{ + Name: "collectProjects", + EntryPoint: CollectProjects, + EnabledByDefault: true, + Description: "collect Taiga projects", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func CollectProjects(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + logger := taskCtx.GetLogger() + logger.Info("collect projects") + + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_PROJECT_TABLE, + }, + ApiClient: data.ApiClient, + UrlTemplate: "projects/{{ .Params.ProjectId }}", + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var result json.RawMessage + err := api.UnmarshalResponse(res, &result) + if err != nil { + return nil, err + } + return []json.RawMessage{result}, nil + }, + }) + if err != nil { + logger.Error(err, "collect project error") + return err + } + return collector.Execute() +} + +type TaigaApiParams struct { + ConnectionId uint64 + ProjectId uint64 +} diff --git a/backend/plugins/taiga/tasks/project_convertor.go b/backend/plugins/taiga/tasks/project_convertor.go new file mode 100644 index 00000000000..032831d0717 --- /dev/null +++ b/backend/plugins/taiga/tasks/project_convertor.go @@ -0,0 +1,88 @@ +/* +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 ( + "reflect" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var ConvertProjectsMeta = plugin.SubTaskMeta{ + Name: "convertProjects", + EntryPoint: ConvertProjects, + EnabledByDefault: true, + Description: "convert Taiga projects", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ConvertProjects(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + logger := taskCtx.GetLogger() + db := taskCtx.GetDal() + logger.Info("convert project:%d", data.Options.ProjectId) + + idGen := didgen.NewDomainIdGenerator(&models.TaigaProject{}) + clauses := []dal.Clause{ + dal.Select("*"), + dal.From(&models.TaigaProject{}), + dal.Where("connection_id = ? AND project_id = ?", data.Options.ConnectionId, data.Options.ProjectId), + } + cursor, err := db.Cursor(clauses...) + if err != nil { + return err + } + defer cursor.Close() + + converter, err := api.NewDataConverter(api.DataConverterArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_PROJECT_TABLE, + }, + InputRowType: reflect.TypeOf(models.TaigaProject{}), + Input: cursor, + Convert: func(inputRow interface{}) ([]interface{}, errors.Error) { + project := inputRow.(*models.TaigaProject) + domainBoard := &ticket.Board{ + DomainEntity: domainlayer.DomainEntity{Id: idGen.Generate(data.Options.ConnectionId, data.Options.ProjectId)}, + Name: project.Name, + Description: project.Description, + Url: project.Url, + } + return []interface{}{ + domainBoard, + }, nil + }, + }) + if err != nil { + return err + } + + return converter.Execute() +} diff --git a/backend/plugins/taiga/tasks/project_extractor.go b/backend/plugins/taiga/tasks/project_extractor.go new file mode 100644 index 00000000000..669e34760a8 --- /dev/null +++ b/backend/plugins/taiga/tasks/project_extractor.go @@ -0,0 +1,84 @@ +/* +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/core/errors" + "github.com/apache/incubator-devlake/core/models/common" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractProjects + +var ExtractProjectsMeta = plugin.SubTaskMeta{ + Name: "extractProjects", + EntryPoint: ExtractProjects, + EnabledByDefault: true, + Description: "extract Taiga projects", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ExtractProjects(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_PROJECT_TABLE, + }, + Extract: func(row *api.RawData) ([]interface{}, errors.Error) { + var apiProject struct { + Id uint64 `json:"id"` + Name string `json:"name"` + Slug string `json:"slug"` + Description string `json:"description"` + CreatedDate string `json:"created_date"` + ModifiedDate string `json:"modified_date"` + } + err := json.Unmarshal(row.Data, &apiProject) + if err != nil { + return nil, errors.Default.Wrap(err, "error unmarshalling project") + } + + project := &models.TaigaProject{ + Scope: common.Scope{ + ConnectionId: data.Options.ConnectionId, + }, + ProjectId: apiProject.Id, + Name: apiProject.Name, + Slug: apiProject.Slug, + Description: apiProject.Description, + } + + return []interface{}{project}, nil + }, + }) + + if err != nil { + return err + } + + return extractor.Execute() +} diff --git a/backend/plugins/taiga/tasks/task_collector.go b/backend/plugins/taiga/tasks/task_collector.go new file mode 100644 index 00000000000..fabec6e39a4 --- /dev/null +++ b/backend/plugins/taiga/tasks/task_collector.go @@ -0,0 +1,79 @@ +/* +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" + "fmt" + "net/http" + "net/url" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" +) + +const RAW_TASK_TABLE = "taiga_api_tasks" + +var _ plugin.SubTaskEntryPoint = CollectTasks + +var CollectTasksMeta = plugin.SubTaskMeta{ + Name: "collectTasks", + EntryPoint: CollectTasks, + EnabledByDefault: true, + Description: "collect Taiga tasks", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func CollectTasks(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + logger := taskCtx.GetLogger() + logger.Info("collect tasks") + + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_TASK_TABLE, + }, + ApiClient: data.ApiClient, + PageSize: 1000, + UrlTemplate: "tasks", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("project", fmt.Sprintf("%d", data.Options.ProjectId)) + return query, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var result []json.RawMessage + err := api.UnmarshalResponse(res, &result) + if err != nil { + return nil, err + } + return result, nil + }, + }) + if err != nil { + logger.Error(err, "collect tasks error") + return err + } + return collector.Execute() +} diff --git a/backend/plugins/taiga/tasks/task_convertor.go b/backend/plugins/taiga/tasks/task_convertor.go new file mode 100644 index 00000000000..f13b51686db --- /dev/null +++ b/backend/plugins/taiga/tasks/task_convertor.go @@ -0,0 +1,107 @@ +/* +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/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var ConvertTasksMeta = plugin.SubTaskMeta{ + Name: "convertTasks", + EntryPoint: ConvertTasks, + EnabledByDefault: true, + Description: "convert Taiga tasks", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ConvertTasks(subtaskCtx plugin.SubTaskContext) errors.Error { + logger := subtaskCtx.GetLogger() + data := subtaskCtx.GetData().(*TaigaTaskData) + db := subtaskCtx.GetDal() + + taskIdGen := didgen.NewDomainIdGenerator(&models.TaigaTask{}) + boardIdGen := didgen.NewDomainIdGenerator(&models.TaigaProject{}) + boardId := boardIdGen.Generate(data.Options.ConnectionId, data.Options.ProjectId) + + converter, err := api.NewStatefulDataConverter(&api.StatefulDataConverterArgs[models.TaigaTask]{ + SubtaskCommonArgs: &api.SubtaskCommonArgs{ + SubTaskContext: subtaskCtx, + Table: RAW_TASK_TABLE, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + }, + Input: func(stateManager *api.SubtaskStateManager) (dal.Rows, errors.Error) { + clauses := []dal.Clause{ + dal.Select("*"), + dal.From(&models.TaigaTask{}), + dal.Where("connection_id = ?", data.Options.ConnectionId), + } + if stateManager.IsIncremental() { + since := stateManager.GetSince() + if since != nil { + clauses = append(clauses, dal.Where("updated_at >= ?", since)) + } + } + return db.Cursor(clauses...) + }, + Convert: func(task *models.TaigaTask) ([]interface{}, errors.Error) { + var result []interface{} + + issue := &ticket.Issue{ + DomainEntity: domainlayer.DomainEntity{ + Id: taskIdGen.Generate(task.ConnectionId, task.TaskId), + }, + IssueKey: task.Subject, + Title: task.Subject, + Type: "TASK", + OriginalType: "Task", + Status: task.Status, + OriginalStatus: task.Status, + CreatedDate: task.CreatedDate, + UpdatedDate: task.ModifiedDate, + ResolutionDate: task.FinishedDate, + } + + result = append(result, issue) + + boardIssue := &ticket.BoardIssue{ + BoardId: boardId, + IssueId: issue.Id, + } + result = append(result, boardIssue) + + logger.Debug("converted task %d", task.TaskId) + return result, nil + }, + }) + + if err != nil { + return err + } + + return converter.Execute() +} diff --git a/backend/plugins/taiga/tasks/task_data.go b/backend/plugins/taiga/tasks/task_data.go new file mode 100644 index 00000000000..dd6b3d58bb0 --- /dev/null +++ b/backend/plugins/taiga/tasks/task_data.go @@ -0,0 +1,54 @@ +/* +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/core/errors" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +type TaigaOptions struct { + ConnectionId uint64 `json:"connectionId" mapstructure:"connectionId"` + ProjectId uint64 `json:"projectId" mapstructure:"projectId"` + ScopeConfig *models.TaigaScopeConfig `json:"scopeConfig" mapstructure:"scopeConfig"` + ScopeConfigId uint64 `json:"scopeConfigId" mapstructure:"scopeConfigId"` + PageSize int `json:"pageSize" mapstructure:"pageSize"` +} + +type TaigaTaskData struct { + Options *TaigaOptions + ApiClient *api.ApiAsyncClient +} + +func DecodeAndValidateTaskOptions(options map[string]interface{}) (*TaigaOptions, errors.Error) { + var op TaigaOptions + err := api.Decode(options, &op, nil) + if err != nil { + return nil, err + } + if op.ConnectionId == 0 { + return nil, errors.BadInput.New(fmt.Sprintf("invalid connectionId:%d", op.ConnectionId)) + } + if op.ProjectId == 0 { + return nil, errors.BadInput.New(fmt.Sprintf("invalid projectId:%d", op.ProjectId)) + } + return &op, nil +} diff --git a/backend/plugins/taiga/tasks/task_extractor.go b/backend/plugins/taiga/tasks/task_extractor.go new file mode 100644 index 00000000000..29bece08e12 --- /dev/null +++ b/backend/plugins/taiga/tasks/task_extractor.go @@ -0,0 +1,122 @@ +/* +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" + "time" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractTasks + +var ExtractTasksMeta = plugin.SubTaskMeta{ + Name: "extractTasks", + EntryPoint: ExtractTasks, + EnabledByDefault: true, + Description: "extract Taiga tasks", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ExtractTasks(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_TASK_TABLE, + }, + Extract: func(row *api.RawData) ([]interface{}, errors.Error) { + var apiTask struct { + Id uint64 `json:"id"` + Ref int `json:"ref"` + Subject string `json:"subject"` + StatusExtraInfo struct { + Name string `json:"name"` + } `json:"status_extra_info"` + IsClosed bool `json:"is_closed"` + CreatedDate *time.Time `json:"created_date"` + ModifiedDate *time.Time `json:"modified_date"` + FinishedDate *time.Time `json:"finished_date"` + AssignedTo *uint64 `json:"assigned_to"` + AssignedToExtraInfo *struct { + FullNameDisplay string `json:"full_name_display"` + } `json:"assigned_to_extra_info"` + UserStory *uint64 `json:"user_story"` + Milestone *uint64 `json:"milestone"` + IsBlocked bool `json:"is_blocked"` + BlockedNote string `json:"blocked_note"` + } + err := json.Unmarshal(row.Data, &apiTask) + if err != nil { + return nil, errors.Default.Wrap(err, "error unmarshalling task") + } + + var assignedTo uint64 + var assignedToName string + if apiTask.AssignedTo != nil { + assignedTo = *apiTask.AssignedTo + } + if apiTask.AssignedToExtraInfo != nil { + assignedToName = apiTask.AssignedToExtraInfo.FullNameDisplay + } + var userStoryId uint64 + if apiTask.UserStory != nil { + userStoryId = *apiTask.UserStory + } + var milestoneId uint64 + if apiTask.Milestone != nil { + milestoneId = *apiTask.Milestone + } + + task := &models.TaigaTask{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + TaskId: apiTask.Id, + Ref: apiTask.Ref, + Subject: apiTask.Subject, + Status: apiTask.StatusExtraInfo.Name, + IsClosed: apiTask.IsClosed, + CreatedDate: apiTask.CreatedDate, + ModifiedDate: apiTask.ModifiedDate, + FinishedDate: apiTask.FinishedDate, + AssignedTo: assignedTo, + AssignedToName: assignedToName, + UserStoryId: userStoryId, + MilestoneId: milestoneId, + IsBlocked: apiTask.IsBlocked, + BlockedNote: apiTask.BlockedNote, + } + + return []interface{}{task}, nil + }, + }) + + if err != nil { + return err + } + + return extractor.Execute() +} diff --git a/backend/plugins/taiga/tasks/user_story_collector.go b/backend/plugins/taiga/tasks/user_story_collector.go new file mode 100644 index 00000000000..80f3ec7a67d --- /dev/null +++ b/backend/plugins/taiga/tasks/user_story_collector.go @@ -0,0 +1,80 @@ +/* +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" + "fmt" + "net/http" + "net/url" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" +) + +const RAW_USER_STORY_TABLE = "taiga_api_user_stories" + +var _ plugin.SubTaskEntryPoint = CollectUserStories + +var CollectUserStoriesMeta = plugin.SubTaskMeta{ + Name: "collectUserStories", + EntryPoint: CollectUserStories, + EnabledByDefault: true, + Description: "collect Taiga user stories", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func CollectUserStories(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + logger := taskCtx.GetLogger() + logger.Info("collect user stories") + + collector, err := api.NewApiCollector(api.ApiCollectorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_USER_STORY_TABLE, + }, + ApiClient: data.ApiClient, + PageSize: 1000, // Fetch all in one page - Taiga returns all user stories for a project + UrlTemplate: "userstories", + Query: func(reqData *api.RequestData) (url.Values, errors.Error) { + query := url.Values{} + query.Set("project", fmt.Sprintf("%d", data.Options.ProjectId)) + // Don't specify page - get all results + return query, nil + }, + ResponseParser: func(res *http.Response) ([]json.RawMessage, errors.Error) { + var result []json.RawMessage + err := api.UnmarshalResponse(res, &result) + if err != nil { + return nil, err + } + return result, nil + }, + }) + if err != nil { + logger.Error(err, "collect user stories error") + return err + } + return collector.Execute() +} diff --git a/backend/plugins/taiga/tasks/user_story_convertor.go b/backend/plugins/taiga/tasks/user_story_convertor.go new file mode 100644 index 00000000000..963a25ae18e --- /dev/null +++ b/backend/plugins/taiga/tasks/user_story_convertor.go @@ -0,0 +1,129 @@ +/* +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/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/models/domainlayer" + "github.com/apache/incubator-devlake/core/models/domainlayer/didgen" + "github.com/apache/incubator-devlake/core/models/domainlayer/ticket" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var ConvertUserStoriesMeta = plugin.SubTaskMeta{ + Name: "convertUserStories", + EntryPoint: ConvertUserStories, + EnabledByDefault: true, + Description: "convert Taiga user stories", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ConvertUserStories(subtaskCtx plugin.SubTaskContext) errors.Error { + logger := subtaskCtx.GetLogger() + data := subtaskCtx.GetData().(*TaigaTaskData) + db := subtaskCtx.GetDal() + + issueIdGen := didgen.NewDomainIdGenerator(&models.TaigaUserStory{}) + boardIdGen := didgen.NewDomainIdGenerator(&models.TaigaProject{}) + boardId := boardIdGen.Generate(data.Options.ConnectionId, data.Options.ProjectId) + + converter, err := api.NewStatefulDataConverter(&api.StatefulDataConverterArgs[models.TaigaUserStory]{ + SubtaskCommonArgs: &api.SubtaskCommonArgs{ + SubTaskContext: subtaskCtx, + Table: RAW_USER_STORY_TABLE, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + }, + Input: func(stateManager *api.SubtaskStateManager) (dal.Rows, errors.Error) { + clauses := []dal.Clause{ + dal.Select("*"), + dal.From(&models.TaigaUserStory{}), + dal.Where("connection_id = ?", data.Options.ConnectionId), + } + if stateManager.IsIncremental() { + since := stateManager.GetSince() + if since != nil { + clauses = append(clauses, dal.Where("updated_at >= ?", since)) + } + } + return db.Cursor(clauses...) + }, + Convert: func(userStory *models.TaigaUserStory) ([]interface{}, errors.Error) { + var result []interface{} + + // Map Taiga is_closed to DevLake standard status + status := "TODO" + if userStory.IsClosed { + status = "DONE" + } + + issue := &ticket.Issue{ + DomainEntity: domainlayer.DomainEntity{ + Id: issueIdGen.Generate(userStory.ConnectionId, userStory.UserStoryId), + }, + IssueKey: fmt.Sprintf("#%d", userStory.Ref), + Title: userStory.Subject, + Type: "USER_STORY", + OriginalType: "User Story", + Status: status, + OriginalStatus: userStory.Status, + CreatedDate: userStory.CreatedDate, + UpdatedDate: userStory.ModifiedDate, + ResolutionDate: userStory.FinishedDate, + AssigneeId: fmt.Sprintf("%d", userStory.AssignedTo), + AssigneeName: userStory.AssignedToName, + } + + if userStory.TotalPoints > 0 { + issue.StoryPoint = &userStory.TotalPoints + } + + // Calculate lead time: creation → resolution for closed stories + if userStory.IsClosed && issue.CreatedDate != nil && issue.ResolutionDate != nil { + leadTimeMinutes := uint(issue.ResolutionDate.Sub(*issue.CreatedDate).Minutes()) + if leadTimeMinutes > 0 { + issue.LeadTimeMinutes = &leadTimeMinutes + } + } + + result = append(result, issue) + + boardIssue := &ticket.BoardIssue{ + BoardId: boardId, + IssueId: issue.Id, + } + result = append(result, boardIssue) + + logger.Debug("converted user story %d", userStory.UserStoryId) + return result, nil + }, + }) + + if err != nil { + return err + } + + return converter.Execute() +} diff --git a/backend/plugins/taiga/tasks/user_story_extractor.go b/backend/plugins/taiga/tasks/user_story_extractor.go new file mode 100644 index 00000000000..642981e2076 --- /dev/null +++ b/backend/plugins/taiga/tasks/user_story_extractor.go @@ -0,0 +1,135 @@ +/* +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" + "time" + + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/plugins/taiga/models" +) + +var _ plugin.SubTaskEntryPoint = ExtractUserStories + +var ExtractUserStoriesMeta = plugin.SubTaskMeta{ + Name: "extractUserStories", + EntryPoint: ExtractUserStories, + EnabledByDefault: true, + Description: "extract Taiga user stories", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +func ExtractUserStories(taskCtx plugin.SubTaskContext) errors.Error { + data := taskCtx.GetData().(*TaigaTaskData) + extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{ + RawDataSubTaskArgs: api.RawDataSubTaskArgs{ + Ctx: taskCtx, + Params: TaigaApiParams{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + }, + Table: RAW_USER_STORY_TABLE, + }, + Extract: func(row *api.RawData) ([]interface{}, errors.Error) { + var apiUserStory struct { + Id uint64 `json:"id"` + Ref int `json:"ref"` + Subject string `json:"subject"` + Status uint64 `json:"status"` + StatusExtraInfo struct { + Name string `json:"name"` + } `json:"status_extra_info"` + IsClosed bool `json:"is_closed"` + CreatedDate *time.Time `json:"created_date"` + ModifiedDate *time.Time `json:"modified_date"` + FinishDate *time.Time `json:"finish_date"` + AssignedTo *uint64 `json:"assigned_to"` + AssignedToExtraInfo *struct { + FullNameDisplay string `json:"full_name_display"` + } `json:"assigned_to_extra_info"` + TotalPoints *float64 `json:"total_points"` + MilestoneId *uint64 `json:"milestone"` + MilestoneName *string `json:"milestone_name"` + Priority *int `json:"priority"` + IsBlocked bool `json:"is_blocked"` + BlockedNote string `json:"blocked_note"` + } + err := json.Unmarshal(row.Data, &apiUserStory) + if err != nil { + return nil, errors.Default.Wrap(err, "error unmarshalling user story") + } + + var assignedTo uint64 + var assignedToName string + if apiUserStory.AssignedTo != nil { + assignedTo = *apiUserStory.AssignedTo + } + if apiUserStory.AssignedToExtraInfo != nil { + assignedToName = apiUserStory.AssignedToExtraInfo.FullNameDisplay + } + var totalPoints float64 + if apiUserStory.TotalPoints != nil { + totalPoints = *apiUserStory.TotalPoints + } + var milestoneId uint64 + if apiUserStory.MilestoneId != nil { + milestoneId = *apiUserStory.MilestoneId + } + var milestoneName string + if apiUserStory.MilestoneName != nil { + milestoneName = *apiUserStory.MilestoneName + } + var priority int + if apiUserStory.Priority != nil { + priority = *apiUserStory.Priority + } + + userStory := &models.TaigaUserStory{ + ConnectionId: data.Options.ConnectionId, + ProjectId: data.Options.ProjectId, + UserStoryId: apiUserStory.Id, + Ref: apiUserStory.Ref, + Subject: apiUserStory.Subject, + Status: apiUserStory.StatusExtraInfo.Name, + IsClosed: apiUserStory.IsClosed, + CreatedDate: apiUserStory.CreatedDate, + ModifiedDate: apiUserStory.ModifiedDate, + FinishedDate: apiUserStory.FinishDate, + AssignedTo: assignedTo, + AssignedToName: assignedToName, + TotalPoints: totalPoints, + MilestoneId: milestoneId, + MilestoneName: milestoneName, + Priority: priority, + IsBlocked: apiUserStory.IsBlocked, + BlockedNote: apiUserStory.BlockedNote, + } + + return []interface{}{userStory}, nil + }, + }) + + if err != nil { + return err + } + + return extractor.Execute() +} diff --git a/grafana/dashboards/Taiga.json b/grafana/dashboards/Taiga.json new file mode 100644 index 00000000000..7e1263b43d7 --- /dev/null +++ b/grafana/dashboards/Taiga.json @@ -0,0 +1,2316 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [ + { + "asDropdown": false, + "icon": "bolt", + "includeVars": false, + "keepTime": true, + "tags": [], + "targetBlank": false, + "title": "Homepage", + "tooltip": "", + "type": "link", + "url": "/grafana/d/Lv1XbLHnk/data-specific-dashboards-homepage" + }, + { + "asDropdown": false, + "icon": "external link", + "includeVars": false, + "keepTime": true, + "tags": [ + "Data Source Specific Dashboard" + ], + "targetBlank": false, + "title": "Metric dashboards", + "tooltip": "", + "type": "dashboards", + "url": "" + } + ], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 3, + "w": 13, + "x": 0, + "y": 0 + }, + "id": 1, + "links": [ + { + "targetBlank": true, + "title": "Taiga Plugin", + "url": "https://github.com/apache/incubator-devlake" + } + ], + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "- Use Cases: This dashboard shows project management metrics from Taiga across all issue types (User Stories, Tasks, Issues/Requirements, Epics).\n- Data Source Required: Taiga\n- Metrics: Issue throughput (filtered by type), lead time, story points (User Stories), milestone progress, assignee breakdown and issue type breakdown.\n- Use the **Issue Type** variable to filter panels to a specific type, or select All to see all types together.", + "mode": "markdown" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Dashboard Introduction", + "type": "text" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 100, + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "1. Issue Throughput", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Total number of user stories created in the selected time range and board.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 0, + "y": 4 + }, + "id": 2, + "links": [ + { + "targetBlank": true, + "title": "Requirement Count", + "url": "https://devlake.apache.org/docs/Metrics/RequirementCount" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "select\r\n count(distinct i.id) as value\r\nfrom issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere\r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Number of Issues [Created in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Total number of issues that have been marked as Done/Closed in the selected time range.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 4, + "y": 4 + }, + "id": 3, + "links": [ + { + "targetBlank": true, + "title": "Requirement Count", + "url": "https://devlake.apache.org/docs/Metrics/RequirementCount" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "select\r\n count(distinct i.id) as value\r\nfrom issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere\r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Number of Closed Issues [Created in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Monthly distribution of open vs. closed issues.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 1, + "drawStyle": "bars", + "fillOpacity": 12, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 16, + "x": 8, + "y": 4 + }, + "id": 4, + "links": [ + { + "targetBlank": true, + "title": "Requirement Count", + "url": "https://devlake.apache.org/docs/Metrics/RequirementCount" + } + ], + "options": { + "legend": { + "calcs": [ + "sum" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "SELECT\r\n DATE_ADD(date(i.created_date), INTERVAL -DAYOFMONTH(date(i.created_date))+1 DAY) as time,\r\n count(distinct case when status != 'DONE' then i.id else null end) as \"Number of Open Stories\",\r\n count(distinct case when status = 'DONE' then i.id else null end) as \"Number of Closed Stories\"\r\nFROM issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere\r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})\r\ngroup by 1", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Issue Status Distribution over Month [Created in Selected Time Range]", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Issue Delivery Rate = count(Closed Issues) / count(All Issues)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 50 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 10 + }, + "id": 5, + "links": [ + { + "targetBlank": true, + "title": "Requirement Delivery Rate", + "url": "https://devlake.apache.org/docs/Metrics/RequirementDeliveryRate" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "with _requirements as(\r\n select\r\n count(distinct i.id) as total_count,\r\n count(distinct case when i.status = 'DONE' then i.id else null end) as delivered_count\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where\r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})\r\n)\r\n\r\nselect\r\n now() as time,\r\n 1.0 * delivered_count/total_count as requirement_delivery_rate\r\nfrom _requirements", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Issue Delivery Rate [Created in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Monthly trend of issue delivery rate.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Delivery Rate(%)", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 12, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 16, + "x": 8, + "y": 10 + }, + "id": 6, + "links": [ + { + "targetBlank": true, + "title": "Requirement Delivery Rate", + "url": "https://devlake.apache.org/docs/Metrics/RequirementDeliveryRate" + } + ], + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "group": [], + "metricColumn": "none", + "queryType": "randomWalk", + "rawQuery": true, + "rawSql": "with _requirements as(\r\n select\r\n DATE_ADD(date(i.created_date), INTERVAL -DAYOFMONTH(date(i.created_date))+1 DAY) as time,\r\n 1.0 * count(distinct case when i.status = 'DONE' then i.id else null end)/count(distinct i.id) as delivered_rate\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where\r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})\r\n group by 1\r\n)\r\n\r\nselect\r\n time,\r\n delivered_rate\r\nfrom _requirements\r\norder by time", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Issue Delivery Rate over Time [Created in Selected Time Range]", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 101, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "2. Issue Lead Time", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Average number of days from story creation to resolution.", + "fieldConfig": { + "defaults": { + "decimals": 1, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 14 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 0, + "y": 17 + }, + "id": 7, + "links": [ + { + "targetBlank": true, + "title": "Requirement Lead Time", + "url": "https://devlake.apache.org/docs/Metrics/RequirementLeadTime" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "/^value$/", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n avg(lead_time_minutes/1440) as value\r\nfrom issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere\r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.resolution_date)\r\n and bi.board_id in (${board_id})", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Mean Lead Time in Days [Resolved in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "80% of stories are resolved within this many days.", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 21 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 4, + "y": 17 + }, + "id": 8, + "links": [ + { + "targetBlank": true, + "title": "Requirement Lead Time", + "url": "https://devlake.apache.org/docs/Metrics/RequirementLeadTime" + } + ], + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "with _ranks as(\r\n select\r\n i.lead_time_minutes,\r\n percent_rank() over (order by lead_time_minutes asc) as ranks\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where\r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.resolution_date)\r\n and bi.board_id in (${board_id})\r\n)\r\n\r\nselect\r\n max(lead_time_minutes/1440) as value\r\nfrom _ranks\r\nwhere\r\n ranks <= 0.8", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "80% Stories' Lead Time ≤ # Days [Resolved in Selected Time Range]", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Mean lead time per month for resolved stories.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Lead Time (days)", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 16, + "x": 8, + "y": 17 + }, + "id": 9, + "links": [ + { + "targetBlank": true, + "title": "Requirement Lead Time", + "url": "https://devlake.apache.org/docs/Metrics/RequirementLeadTime" + } + ], + "options": { + "barRadius": 0, + "barWidth": 0.5, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "with _requirements as(\r\n select\r\n DATE_ADD(date(i.resolution_date), INTERVAL -DAYOFMONTH(date(i.resolution_date))+1 DAY) as time,\r\n avg(lead_time_minutes/1440) as mean_lead_time\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where\r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.resolution_date)\r\n and bi.board_id in (${board_id})\r\n group by 1\r\n)\r\n\r\nselect\r\n date_format(time,'%M %Y') as month,\r\n mean_lead_time\r\nfrom _requirements\r\norder by time asc", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Mean Lead Time by Month [Resolved in Selected Time Range]", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "The cumulative distribution of story lead time. Each point shows the percent rank of a given lead time value.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 10, + "links": [ + { + "targetBlank": true, + "title": "Requirement Lead Time", + "url": "https://devlake.apache.org/docs/Metrics/RequirementLeadTime" + } + ], + "options": { + "barRadius": 0, + "barWidth": 0.51, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 100 + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "with _ranks as(\r\n select\r\n round(i.lead_time_minutes/1440) as lead_time_day\r\n from issues i\r\n join board_issues bi on i.id = bi.issue_id\r\n where\r\n i.type in (${type})\r\n and i.status = 'DONE'\r\n and $__timeFilter(i.resolution_date)\r\n and bi.board_id in (${board_id})\r\n order by lead_time_day asc\r\n)\r\n\r\nselect\r\n now() as time,\r\n lpad(concat(lead_time_day,'d'), 4, ' ') as metric,\r\n percent_rank() over (order by lead_time_day asc) as value\r\nfrom _ranks\r\norder by lead_time_day asc", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Cumulative Distribution of Lead Time [Resolved in Selected Time Range]", + "transformations": [ + { + "id": "reduce", + "options": { + "reducers": [ + "current" + ] + } + } + ], + "type": "barchart" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 102, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "3. Story Points", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Total story points for all user stories in the selected time range.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 0, + "y": 30 + }, + "id": 11, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n sum(ts.total_points) as value\r\nfrom _tool_taiga_user_stories ts\r\n join board_issues bi on bi.issue_id = concat('taiga:TaigaUserStory:', ts.connection_id, ':', ts.user_story_id)\r\nwhere\r\n bi.board_id in (${board_id})", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Total Story Points", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Total story points for closed/completed user stories.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 4, + "y": 30 + }, + "id": 12, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n sum(ts.total_points) as value\r\nfrom _tool_taiga_user_stories ts\r\n join board_issues bi on bi.issue_id = concat('taiga:TaigaUserStory:', ts.connection_id, ':', ts.user_story_id)\r\n join issues i on i.id = bi.issue_id\r\nwhere\r\n bi.board_id in (${board_id})\r\n and i.status = 'DONE'", + "refId": "A", + "sql": { + "columns": [ + { + "parameters": [], + "type": "function" + } + ], + "groupBy": [ + { + "property": { + "type": "string" + }, + "type": "groupBy" + } + ], + "limit": 50 + }, + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Completed Story Points", + "type": "stat" + }, + { + "datasource": "mysql", + "description": "Story points allocated to each milestone/sprint. Requires milestone data from Taiga.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Story Points", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 16, + "x": 8, + "y": 30 + }, + "id": 13, + "options": { + "barRadius": 0, + "barWidth": 0.6, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": -15, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n COALESCE(NULLIF(ts.milestone_name,''), 'No Milestone') as Milestone,\r\n sum(ts.total_points) as `Story Points`\r\nfrom _tool_taiga_user_stories ts\r\n join board_issues bi on bi.issue_id = concat('taiga:TaigaUserStory:', ts.connection_id, ':', ts.user_story_id)\r\nwhere\r\n bi.board_id in (${board_id})\r\ngroup by 1\r\norder by `Story Points` desc", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Story Points by Milestone", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Story points distributed across assignees.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Story Points", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 36 + }, + "id": 14, + "options": { + "barRadius": 0, + "barWidth": 0.6, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": -15, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n COALESCE(NULLIF(i.assignee_name,''), 'Unassigned') as Assignee,\r\n sum(i.story_point) as `Story Points`\r\nfrom issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere\r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})\r\ngroup by 1\r\norder by `Story Points` desc", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Story Points by Assignee [Created in Selected Time Range]", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Distribution of story points across open vs. closed stories.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 36 + }, + "id": 15, + "options": { + "displayLabels": [ + "name", + "value" + ], + "legend": { + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "pieType": "pie", + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n sum(ts.total_points) as `Story Points`,\r\n CASE WHEN i.status = 'DONE' THEN 'Completed' ELSE 'In Progress' END as Status\r\nfrom _tool_taiga_user_stories ts\r\n join board_issues bi on bi.issue_id = concat('taiga:TaigaUserStory:', ts.connection_id, ':', ts.user_story_id)\r\n join issues i on i.id = bi.issue_id\r\nwhere\r\n bi.board_id in (${board_id})\r\ngroup by Status", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Story Points: Completed vs In Progress", + "type": "piechart" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 42 + }, + "id": 103, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "4. Issues Overview", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Breakdown of all Taiga issues by their current status, across all issue types (User Story, Task, Issue/Requirement, Epic).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 43 + }, + "id": 16, + "options": { + "displayLabels": ["name", "value"], + "legend": { + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "pieType": "donut", + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n now() as time,\n count(distinct case when i.status = 'TODO' then i.id end) as 'To Do',\n count(distinct case when i.status = 'IN_PROGRESS' then i.id end) as 'In Progress',\n count(distinct case when i.status = 'DONE' then i.id end) as 'Done',\n count(distinct case when i.status not in ('TODO','IN_PROGRESS','DONE') then i.id end) as 'Other'\nFROM issues i\n join board_issues bi on i.id = bi.issue_id\nWHERE bi.board_id in (${board_id})", + "refId": "A" + } + ], + "title": "Issues by Status", + "type": "piechart" + }, + { + "datasource": "mysql", + "description": "Number of user stories assigned to each team member.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "User Stories", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 43 + }, + "id": 17, + "options": { + "barRadius": 0, + "barWidth": 0.6, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "horizontal", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n COALESCE(NULLIF(i.assignee_name,''), 'Unassigned') as Assignee,\r\n count(distinct i.id) as `User Stories`\r\nfrom issues i\r\n join board_issues bi on i.id = bi.issue_id\r\nwhere\r\n i.type in (${type})\r\n and $__timeFilter(i.created_date)\r\n and bi.board_id in (${board_id})\r\ngroup by 1\r\norder by `User Stories` desc", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Issues by Assignee [Created in Selected Time Range]", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Number of user stories in each milestone/sprint.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "User Stories", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 43 + }, + "id": 18, + "options": { + "barRadius": 0, + "barWidth": 0.6, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "horizontal", + "showValue": "auto", + "stacking": "none", + "tooltip": { + "mode": "single", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n COALESCE(NULLIF(ts.milestone_name,''), 'No Milestone') as Milestone,\r\n count(distinct ts.user_story_id) as `User Stories`\r\nfrom _tool_taiga_user_stories ts\r\n join board_issues bi on bi.issue_id = concat('taiga:TaigaUserStory:', ts.connection_id, ':', ts.user_story_id)\r\nwhere\r\n bi.board_id in (${board_id})\r\ngroup by 1\r\norder by `User Stories` desc", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "User Stories per Milestone", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Milestone progress: open vs. closed user stories per sprint.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 1, + "scaleDistribution": { + "type": "linear" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 51 + }, + "id": 19, + "options": { + "barRadius": 0, + "barWidth": 0.6, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "normal", + "tooltip": { + "mode": "multi", + "sort": "none" + }, + "xTickLabelRotation": -15, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "select\r\n COALESCE(NULLIF(ts.milestone_name,''), 'No Milestone') as Milestone,\r\n count(distinct case when i.status != 'DONE' then ts.user_story_id else null end) as `Open Stories`,\r\n count(distinct case when i.status = 'DONE' then ts.user_story_id else null end) as `Closed Stories`\r\nfrom _tool_taiga_user_stories ts\r\n join board_issues bi on bi.issue_id = concat('taiga:TaigaUserStory:', ts.connection_id, ':', ts.user_story_id)\r\n join issues i on i.id = bi.issue_id\r\nwhere\r\n bi.board_id in (${board_id})\r\ngroup by 1\r\norder by `Closed Stories` desc", + "refId": "A", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Milestone Progress: Open vs. Closed Stories", + "type": "barchart" + }, + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 77 + }, + "id": 130, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "
\n\nThis dashboard is created based on this [data schema](https://devlake.apache.org/docs/DataModels/DevLakeDomainLayerSchema). Want to add more metrics? Please follow the [guide](https://devlake.apache.org/docs/Configuration/Dashboards/GrafanaUserGuide).", + "mode": "markdown" + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "randomWalk", + "refId": "A" + } + ], + "type": "text" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 60 + }, + "id": 104, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "5. Issue Type Breakdown", + "type": "row" + }, + { + "datasource": "mysql", + "description": "Distribution of all Taiga items across issue types (User Story, Task, Issue/Requirement, Epic).", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "hideFrom": { "legend": false, "tooltip": false, "viz": false } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [{ "color": "green", "value": null }] + } + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 6, "x": 0, "y": 61 }, + "id": 20, + "options": { + "displayLabels": ["name", "value"], + "legend": { "displayMode": "list", "placement": "right", "showLegend": true }, + "pieType": "pie", + "tooltip": { "mode": "single", "sort": "none" } + }, + "pluginVersion": "9.5.15", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n now() as time,\n count(distinct case when i.type = 'USER_STORY' then i.id end) as 'User Story',\n count(distinct case when i.type = 'TASK' then i.id end) as 'Task',\n count(distinct case when i.type = 'REQUIREMENT' then i.id end) as 'Issue',\n count(distinct case when i.type = 'EPIC' then i.id end) as 'Epic'\nFROM issues i\n join board_issues bi on i.id = bi.issue_id\nWHERE bi.board_id in (${board_id})", + "refId": "A" + } + ], + "title": "Issues by Type", + "type": "piechart" + }, + { + "datasource": "mysql", + "description": "Open vs closed count for each Taiga issue type in the selected time range.", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Count", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { "legend": false, "tooltip": false, "viz": false }, + "lineWidth": 1, + "scaleDistribution": { "type": "linear" }, + "thresholdsStyle": { "mode": "off" } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [{ "color": "green", "value": null }] + } + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 10, "x": 6, "y": 61 }, + "id": 21, + "options": { + "barRadius": 0, + "barWidth": 0.6, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, + "orientation": "auto", + "showValue": "auto", + "stacking": "normal", + "tooltip": { "mode": "multi", "sort": "none" }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "select\n COALESCE(i.original_type, i.type) as `Issue Type`,\n count(distinct case when i.status != 'DONE' then i.id else null end) as `Open`,\n count(distinct case when i.status = 'DONE' then i.id else null end) as `Closed`\nfrom issues i\n join board_issues bi on i.id = bi.issue_id\nwhere\n $__timeFilter(i.created_date)\n and bi.board_id in (${board_id})\ngroup by 1\norder by 1", + "refId": "A" + } + ], + "title": "Open vs Closed by Type [Created in Selected Time Range]", + "type": "barchart" + }, + { + "datasource": "mysql", + "description": "Monthly count of items created, broken down by issue type (User Stories, Tasks, Issues, Epics).", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 1, + "drawStyle": "bars", + "fillOpacity": 12, + "gradientMode": "none", + "hideFrom": { "legend": false, "tooltip": false, "viz": false }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { "type": "linear" }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { "group": "A", "mode": "normal" }, + "thresholdsStyle": { "mode": "off" } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [{ "color": "green", "value": null }, { "color": "red", "value": 80 }] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 8, "x": 16, "y": 61 }, + "id": 22, + "options": { + "legend": { "calcs": ["sum"], "displayMode": "list", "placement": "bottom", "showLegend": true }, + "tooltip": { "mode": "multi", "sort": "none" } + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n DATE_ADD(date(i.created_date), INTERVAL -DAYOFMONTH(date(i.created_date))+1 DAY) as time,\n count(distinct case when i.type='USER_STORY' then i.id end) as 'User Stories',\n count(distinct case when i.type='TASK' then i.id end) as 'Tasks',\n count(distinct case when i.type='REQUIREMENT' then i.id end) as 'Issues',\n count(distinct case when i.type='EPIC' then i.id end) as 'Epics'\nFROM issues i\n join board_issues bi on i.id = bi.issue_id\nWHERE\n bi.board_id in (${board_id})\n AND $__timeFilter(i.created_date)\nGROUP BY 1\nORDER BY 1", + "refId": "A" + } + ], + "title": "Items Created per Month by Type", + "type": "timeseries" + }, + { + "datasource": "mysql", + "description": "Average lead time in days from creation to resolution, broken down by issue type (resolved issues only).", + "fieldConfig": { + "defaults": { + "color": { "mode": "palette-classic" }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Avg Lead Time (days)", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { "legend": false, "tooltip": false, "viz": false }, + "lineWidth": 1, + "scaleDistribution": { "type": "linear" }, + "thresholdsStyle": { "mode": "off" } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [{ "color": "green", "value": null }, { "color": "red", "value": 80 }] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 69 }, + "id": 23, + "options": { + "barRadius": 0, + "barWidth": 0.5, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true }, + "orientation": "auto", + "showValue": "auto", + "stacking": "none", + "tooltip": { "mode": "single", "sort": "none" }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 0 + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "datasource": "mysql", + "editorMode": "code", + "format": "table", + "rawQuery": true, + "rawSql": "select\n COALESCE(i.original_type, i.type) as `Issue Type`,\n round(avg(\n COALESCE(i.lead_time_minutes, TIMESTAMPDIFF(MINUTE, i.created_date, i.resolution_date))\n /1440), 1) as `Avg Lead Time (days)`\nfrom issues i\n join board_issues bi on i.id = bi.issue_id\nwhere\n i.status = 'DONE'\n and bi.board_id in (${board_id})\ngroup by 1\nhaving `Avg Lead Time (days)` is not null\norder by 2 desc", + "refId": "A" + } + ], + "title": "Average Lead Time by Type", + "type": "barchart" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [ + "Data Source Dashboard" + ], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": "mysql", + "definition": "select concat(name, '--', id) from boards where id like 'taiga%'", + "hide": 0, + "includeAll": true, + "label": "Choose Project", + "multi": true, + "name": "board_id", + "options": [], + "query": "select concat(name, '--', id) from boards where id like 'taiga%'", + "refresh": 1, + "regex": "/^(?.*)--(?.*)$/", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": "mysql", + "definition": "select distinct i.type from issues i join board_issues bi on i.id = bi.issue_id where bi.board_id like 'taiga%'", + "hide": 0, + "includeAll": true, + "label": "Issue Type", + "multi": true, + "name": "type", + "options": [], + "query": "select distinct i.type from issues i join board_issues bi on i.id = bi.issue_id where bi.board_id like 'taiga%'", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-6M", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Taiga", + "uid": "taiga-dashboard", + "version": 2, + "weekStart": "" +} From 6799e00b74086bbd9f5af7039f3855adfae43c9b Mon Sep 17 00:00:00 2001 From: Rodrigo Silva Date: Mon, 30 Mar 2026 19:21:08 +0200 Subject: [PATCH 34/38] fix(docker): pin Poetry to 2.2.1 for Python 3.9 compatibility (#8735) Poetry 2.3.0 dropped Python 3.9 support. Without cache the installer fetches the latest version (currently 2.3.2), which fails on the python:3.9-slim-bookworm base image. Pin to 2.2.1, the last release compatible with Python 3.9. Co-authored-by: Rodrigo Silva --- backend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 69cbeca7add..a8708c5e3b3 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -149,7 +149,7 @@ RUN python3 -m pip install --no-cache --upgrade pip setuptools && \ python3 -m pip install --upgrade pip # Setup Python Poetry package manager -RUN curl -sSL https://install.python-poetry.org | python3 - +RUN curl -sSL https://install.python-poetry.org | python3 - --version 2.2.1 ENV PATH="$PATH:/app/.local/bin" # Build Python plugins, make sure the scripts has execute permission From 35bb875c84c117bcbc7b69e88142559a1bfb23e7 Mon Sep 17 00:00:00 2001 From: "Daniele M." Date: Wed, 1 Apr 2026 12:22:21 +0100 Subject: [PATCH 35/38] fix(linker): scope clearHistoryData to current project only (#8814) (#8815) The clearHistoryData() function used a LEFT JOIN with project_name in the ON clause, causing the subquery to return all PR IDs regardless of project. This effectively wiped the entire pull_request_issues table on every linker run, deleting links from other projects sharing the same repos and links created by the GitHub converter. Fix: - Use INNER JOIN + WHERE for proper project scoping - Add issue-side subquery scoped to current project's boards - Filter by _raw_data_table/_raw_data_remark to only delete linker-created rows Add e2e test for cross-project shared repo scenario. --- .../linker/e2e/link_pr_and_issue_test.go | 42 +++++++++++++++++++ .../cross_project_board_issues.csv | 4 ++ .../snapshot_tables/cross_project_issues.csv | 4 ++ .../cross_project_project_mapping.csv | 5 +++ ...ross_project_pull_request_issues_after.csv | 5 +++ ...oss_project_pull_request_issues_before.csv | 4 ++ .../cross_project_pull_requests.csv | 3 ++ .../plugins/linker/tasks/link_pr_and_issue.go | 18 ++++++-- 8 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 backend/plugins/linker/e2e/snapshot_tables/cross_project_board_issues.csv create mode 100644 backend/plugins/linker/e2e/snapshot_tables/cross_project_issues.csv create mode 100644 backend/plugins/linker/e2e/snapshot_tables/cross_project_project_mapping.csv create mode 100644 backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_request_issues_after.csv create mode 100644 backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_request_issues_before.csv create mode 100644 backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_requests.csv diff --git a/backend/plugins/linker/e2e/link_pr_and_issue_test.go b/backend/plugins/linker/e2e/link_pr_and_issue_test.go index dbec92a600a..15a0e47674b 100644 --- a/backend/plugins/linker/e2e/link_pr_and_issue_test.go +++ b/backend/plugins/linker/e2e/link_pr_and_issue_test.go @@ -29,6 +29,48 @@ import ( "github.com/apache/incubator-devlake/plugins/linker/tasks" ) +func TestLinkPrToIssueWithSharedRepo(t *testing.T) { + var plugin impl.Linker + dataflowTester := e2ehelper.NewDataFlowTester(t, "linker", plugin) + + regexpStr := "#(\\d+)" + re, err := regexp.Compile(regexpStr) + if err != nil { + panic(err) + } + taskData := &tasks.LinkerTaskData{ + Options: &tasks.LinkerOptions{ + PrToIssueRegexp: regexpStr, + ProjectName: "GitHub1", + }, + PrToIssueRegexp: re, + } + + // Import input tables for two projects sharing repo R1 + dataflowTester.ImportCsvIntoTabler("./snapshot_tables/cross_project_issues.csv", &ticket.Issue{}) + dataflowTester.ImportCsvIntoTabler("./snapshot_tables/cross_project_pull_requests.csv", &code.PullRequest{}) + dataflowTester.ImportCsvIntoTabler("./snapshot_tables/cross_project_project_mapping.csv", &crossdomain.ProjectMapping{}) + dataflowTester.ImportCsvIntoTabler("./snapshot_tables/cross_project_board_issues.csv", &ticket.BoardIssue{}) + + // Pre-populate pull_request_issues with data from GitHub2's linker and from GitHub converter. + // These rows must survive when we run the linker for GitHub1. + dataflowTester.ImportCsvIntoTabler("./snapshot_tables/cross_project_pull_request_issues_before.csv", &crossdomain.PullRequestIssue{}) + + dataflowTester.Subtask(tasks.LinkPrToIssueMeta, taskData) + + // Verify: GitHub1's links are created, GitHub2's linker link and converter link survive + dataflowTester.VerifyTable( + crossdomain.PullRequestIssue{}, + "./snapshot_tables/cross_project_pull_request_issues_after.csv", + e2ehelper.ColumnWithRawData( + "pull_request_id", + "pull_request_key", + "issue_id", + "issue_key", + ), + ) +} + func TestLinkPrToIssue(t *testing.T) { var plugin impl.Linker dataflowTester := e2ehelper.NewDataFlowTester(t, "linker", plugin) diff --git a/backend/plugins/linker/e2e/snapshot_tables/cross_project_board_issues.csv b/backend/plugins/linker/e2e/snapshot_tables/cross_project_board_issues.csv new file mode 100644 index 00000000000..8b61a7a95af --- /dev/null +++ b/backend/plugins/linker/e2e/snapshot_tables/cross_project_board_issues.csv @@ -0,0 +1,4 @@ +"board_id","issue_id","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark" +"github:GithubRepo:1:384111310","github:GithubIssue:1:1237324696","2024-05-14 10:42:37.541","2024-05-28 00:25:41.436","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_graphql_issues",69,"" +"github:GithubRepo:1:384111310","github:GithubIssue:1:1237324697","2024-05-14 10:42:37.541","2024-05-28 00:25:41.436","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_graphql_issues",69,"" +"github:GithubRepo:2:999999999","github:GithubIssue:2:2001","2024-05-14 10:42:37.541","2024-05-28 00:25:41.436","{""ConnectionId"":2,""Name"":""other/repo""}","_raw_github_graphql_issues",70,"" diff --git a/backend/plugins/linker/e2e/snapshot_tables/cross_project_issues.csv b/backend/plugins/linker/e2e/snapshot_tables/cross_project_issues.csv new file mode 100644 index 00000000000..2805a0d3a6f --- /dev/null +++ b/backend/plugins/linker/e2e/snapshot_tables/cross_project_issues.csv @@ -0,0 +1,4 @@ +"id","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark","url","icon_url","issue_key","title","description","epic_key","type","original_type","status","original_status","resolution_date","created_date","updated_date","lead_time_minutes","parent_issue_id","priority","story_point","original_estimate_minutes","time_spent_minutes","time_remaining_minutes","creator_id","creator_name","assignee_id","assignee_name","severity","component","original_project","urgency" +"github:GithubIssue:1:1237324696","2024-05-14 10:42:37.529","2024-05-15 12:07:36.450","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_graphql_issues",59,"","https://github.com/apache/incubator-devlake/issues/1884","","1884","Issue 1884","desc","","","type/feature-request","TODO","OPEN","2032-05-16 15:23:21.000","2022-05-16 15:23:21.000","2024-05-11 00:17:21.000",10,"","",11,1,12,11,"github:GithubAccount:1:14050754","Startrekzky","","","","","","" +"github:GithubIssue:1:1237324697","2024-05-14 10:42:37.529","2024-05-15 12:07:36.450","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_graphql_issues",59,"","https://github.com/apache/incubator-devlake/issues/1885","","1885","Issue 1885","desc","","","type/feature-request","TODO","OPEN","2032-05-16 15:23:21.000","2022-05-16 15:23:21.000","2024-05-11 00:17:21.000",10,"","",11,1,12,11,"github:GithubAccount:1:14050754","Startrekzky","","","","","","" +"github:GithubIssue:2:2001","2024-05-14 10:42:37.529","2024-05-15 12:07:36.450","{""ConnectionId"":2,""Name"":""other/repo""}","_raw_github_graphql_issues",60,"","https://github.com/other/repo/issues/2001","","2001","Issue 2001","desc","","","type/bug","TODO","OPEN","2032-05-16 15:23:21.000","2022-05-16 15:23:21.000","2024-05-11 00:17:21.000",10,"","",11,1,12,11,"github:GithubAccount:1:14050754","Startrekzky","","","","","","" diff --git a/backend/plugins/linker/e2e/snapshot_tables/cross_project_project_mapping.csv b/backend/plugins/linker/e2e/snapshot_tables/cross_project_project_mapping.csv new file mode 100644 index 00000000000..2fc40772666 --- /dev/null +++ b/backend/plugins/linker/e2e/snapshot_tables/cross_project_project_mapping.csv @@ -0,0 +1,5 @@ +"project_name","table","row_id","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark" +"GitHub1","repos","github:GithubRepo:1:384111310","2024-05-15 12:02:13.590","2024-05-15 12:02:13.590","GitHub1","",0,"" +"GitHub1","boards","github:GithubRepo:1:384111310","2024-05-15 12:02:13.590","2024-05-15 12:02:13.590","GitHub1","",0,"" +"GitHub2","repos","github:GithubRepo:1:384111310","2024-05-15 12:02:13.590","2024-05-15 12:02:13.590","GitHub2","",0,"" +"GitHub2","boards","github:GithubRepo:2:999999999","2024-05-15 12:02:13.590","2024-05-15 12:02:13.590","GitHub2","",0,"" diff --git a/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_request_issues_after.csv b/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_request_issues_after.csv new file mode 100644 index 00000000000..87ff1971b17 --- /dev/null +++ b/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_request_issues_after.csv @@ -0,0 +1,5 @@ +pull_request_id,issue_id,pull_request_key,issue_key,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark +github:GithubPullRequest:1:1819250573,github:GithubIssue:1:1237324696,7317,1884,,,0,"pull_requests," +github:GithubPullRequest:1:1819250573,github:GithubIssue:1:1237324697,7317,1885,,,0,"pull_requests," +github:GithubPullRequest:1:1819250574,github:GithubIssue:2:2001,7318,2001,,,0,"pull_requests," +github:GithubPullRequest:1:1819250574,github:GithubIssue:1:1237324696,7318,1884,"{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}",_raw_github_api_pull_requests,191,"" diff --git a/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_request_issues_before.csv b/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_request_issues_before.csv new file mode 100644 index 00000000000..217266f3bce --- /dev/null +++ b/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_request_issues_before.csv @@ -0,0 +1,4 @@ +pull_request_id,issue_id,pull_request_key,issue_key,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark +github:GithubPullRequest:1:1819250574,github:GithubIssue:1:1237324697,7318,1885,,,0,"pull_requests," +github:GithubPullRequest:1:1819250574,github:GithubIssue:2:2001,7318,2001,,,0,"pull_requests," +github:GithubPullRequest:1:1819250574,github:GithubIssue:1:1237324696,7318,1884,"{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}",_raw_github_api_pull_requests,191,"" diff --git a/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_requests.csv b/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_requests.csv new file mode 100644 index 00000000000..8c6907f0f65 --- /dev/null +++ b/backend/plugins/linker/e2e/snapshot_tables/cross_project_pull_requests.csv @@ -0,0 +1,3 @@ +"id","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark","base_repo_id","base_ref","base_commit_sha","head_repo_id","head_ref","head_commit_sha","merge_commit_sha","status","original_status","type","component","title","description","url","author_name","author_id","parent_pr_id","pull_request_key","created_date","merged_date","closed_date" +"github:GithubPullRequest:1:1819250573","2024-05-15 12:07:36.778","2024-05-15 12:07:36.778","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_api_pull_requests",191,"","github:GithubRepo:1:384111310","main","64c52748f3529784cb6c8a372691aa0f638fa73d","github:GithubRepo:1:384111310","fix#7275","14fb6488f2208e6a65374a86efce12dd460987e0","91dbce48759da14a4a030124c3ef751f1c5d8389","CLOSED","closed","","","fix: can't GET projects which have / in their name #1884 #1885","desc","https://github.com/apache/incubator-devlake/pull/7317","abeizn","github:GithubAccount:1:101256042","",7317,"2024-04-12 05:31:43.000","2024-04-13 05:31:43.000","2024-04-12 06:44:27.000" +"github:GithubPullRequest:1:1819250574","2024-05-15 12:07:36.778","2024-05-15 12:07:36.778","{""ConnectionId"":1,""Name"":""apache/incubator-devlake""}","_raw_github_api_pull_requests",192,"","github:GithubRepo:1:384111310","main","64c52748f3529784cb6c8a372691aa0f638fa73d","github:GithubRepo:1:384111310","fix#2001","14fb6488f2208e6a65374a86efce12dd460987e0","","MERGED","merged","","","fix: something related to #2001","desc","https://github.com/apache/incubator-devlake/pull/7318","abeizn","github:GithubAccount:1:101256042","",7318,"2024-04-12 05:31:43.000","2024-04-13 05:31:43.000","2024-04-12 06:44:27.000" diff --git a/backend/plugins/linker/tasks/link_pr_and_issue.go b/backend/plugins/linker/tasks/link_pr_and_issue.go index 52fb7aa861d..faeeffd716b 100644 --- a/backend/plugins/linker/tasks/link_pr_and_issue.go +++ b/backend/plugins/linker/tasks/link_pr_and_issue.go @@ -52,13 +52,23 @@ func clearHistoryData(db dal.Dal, data *LinkerTaskData) errors.Error { WHERE pull_request_id IN ( SELECT pr.id FROM pull_requests pr - LEFT JOIN project_mapping pm + INNER JOIN project_mapping pm ON pm.table = 'repos' AND pm.row_id = pr.base_repo_id - AND pm.project_name = ? - ) + WHERE pm.project_name = ? + ) + AND issue_id IN ( + SELECT bi.issue_id + FROM board_issues bi + INNER JOIN project_mapping pm2 + ON pm2.table = 'boards' + AND pm2.row_id = bi.board_id + WHERE pm2.project_name = ? + ) + AND (_raw_data_table = '' OR _raw_data_table IS NULL) + AND _raw_data_remark LIKE '%pull_requests,%' ` - return db.Exec(sql, data.Options.ProjectName) + return db.Exec(sql, data.Options.ProjectName, data.Options.ProjectName) } func LinkPrToIssue(taskCtx plugin.SubTaskContext) errors.Error { From b46f10c165ee827828407bc8a6dd7670be0a7070 Mon Sep 17 00:00:00 2001 From: Chris Pavlicek Date: Wed, 1 Apr 2026 13:52:58 +0100 Subject: [PATCH 36/38] fix(circleci): prevent negative values when calculating circleci (#8800) workflow duration --- backend/plugins/circleci/circleci | Bin 0 -> 39212626 bytes .../_raw_circleci_api_workflows.csv | 2 +- .../_tool_circleci_workflows.csv | 2 +- .../e2e/snapshot_tables/cicd_pipelines.csv | 2 +- .../circleci/tasks/workflow_extractor.go | 6 +++++- 5 files changed, 8 insertions(+), 4 deletions(-) create mode 100755 backend/plugins/circleci/circleci diff --git a/backend/plugins/circleci/circleci b/backend/plugins/circleci/circleci new file mode 100755 index 0000000000000000000000000000000000000000..745e690b9f85fc5803eaa477b96dd6ff34c0c1fe GIT binary patch literal 39212626 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

$(ZqP{O+%IzL7L9J_S81CxIgm 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 h>|7rXe8c$%iXdg=5t9Y7g=uWb};!133 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

K$SwTDmuDca7c$~e$*Izp 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 i?Cf%l>GM(0KeME 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�&>=~?W_+1(S$}a3 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≫pK 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

0mg^x}z_ zLvpoDK8Ay*1&r`ddjHiQ=zFRwq>2G6m-nnv7& zYPw*1bv;C!%l*{r+DE;o81-U1H8XFBbmnJD9bO)ph{; z$X8eR_U4}xe7op+>(&BdJYUW3{l1F(8ehf!HouSIcYWvnNAtbFx^)%t->-82qxn9R z-}%0WdS3ge^|bNuvDy2$19GlDxdXCTpWFc%=6)#YLfMY`Tn7B5&|JO{*Vd6u@rwu0 zVeqPLo7%R{#+F3=M)=>zA)~LT)kZ(X&i#o$JA{vM;Jw>@&}5VD4PKPo_JF4{`V8za1`XYRIxe+MhDE zZ3kkT;+uTl*r}}D)-v!z9O8Y{5_%H<(JR#9-Aoi;YuH|Q4X|FC~BaTu)8II^z8PyL@fe;~SM zCiQHt#OE@Lv(!TV9>m|LHN{FRsqau3Xq!|SXrEjeh@<;DZsGg~y|o{`)wR1a@a`*> zfw0!rW$2qp!Ne~)9~o6Wy!d_O+yGR3TmpY?s2?6V?ZE47U6-C8@R=fk|zIM`n}u&O4H<@{&%mrnlN;z_Cb zbBY6s*P_dAvl7u;fNzOt9o*i@Klz&WLr3MMMxkX4TE=UUAJ^D=L-EaF@85|f11M`7w>V-nLEsSUiHp8uk!^u=J*1yQg=adGs^c=EcYYa^I^{LiN7$hK8)p# zWA+iy$R3Y2;6`ok%eEdZ<29vGT}4u)0)({V;vc^ecu1{s#}a`Q(lk=C6BF-T)HA6tzitjW69vTSwmMM zWA{C8=g+hDmM&VV#ge!=KME_663Ux;OakO@6y*(ak-R znd61b5xaD)?7f*i$1dqc{y$BeOegl$1izJ-On;N}z{5cPR-3_Aq8oT$1mEU9B6P}C z46 z6Z2e^pWQN{u%KlkbC~4JZxw5@upqzXyu!kkhj{)l&nNqWiM9MYpFS^e=65smd;RFK zOAau<+nL{c%RT*e(VjrHliWEEHt@@T z&zU`cOEwuB!o7R3!Oz{1=Qe+3d9N-p`C|>0O^;>BXHx$*pF^7t7>a=byv{c3?rdxJZ@~S;!T~L_7~?8K6W|zW%|4&;&o3O*@+{Av ze5xk|~ z5xl12aWHs1tywmc%g0`xa`|{MF#g}>(3uVd`jR9^W7 z{kVMdlKI=#BQJWMKks?|W6yK(tE+dmdY(V!dA`~6_v7YoTV^-#_wi(Q2YF%M+C1&Z z?0S#PcJ~9T&XjH4S6{r&Pytie5p!_mSzPy?SNtarDaBt}Mmw zaMz=E?D5D|>0_^6amP;T7TIx()gRqr0mqMwP36Wgr>>K~fJ>Lx517Ag8|yvK^ZlN` z{~rn%}3mtF|ii?m}z__Ik?mBL|uIEjusO z;_o727x$w#!;`GUr@-q@_~|M36-BRE-Q2s59?0ujd@lP6*%#S)brTB<>L%T}xaTV9 z{CVgsJGS5)YxV`$(7(fuoot;}cYxoz`R(FG-|G1ydg)8(rTz4I*>l!`Z==tKpwA9J zkf^`dkBv)T7v^yX_dx#Ued*GR@0`%{F74i<-K0eq^vo%+x|@k(e9FpeDdO*0_^p5^ zG!1xr_uh8C9Qo8CmYWOA3?D;yFLucBa;I-k_>{sC5{_h8u?XTL#ACGnV%IbKqmf*a0nW?mh<1^1CKbN2jBd7&+#ZpOatL z!M?GWeb5B3tUG1E@-b@hH=n;25rYX z^q)bS@zDQ(_FKYHIxd~LYp!21IAlMHjeiDfs1Lrz8GP+^ag?Norw?j=ci;RTyfm&a zo(kY+WJp~HxN>FMc=+4JllF=KC_HU(@N`i>@bt@*;7Rp&-F?w(^k>%~&uZRd{+Aoth*^^VBLNBtLs*053H;6W!IIJSlxB#lrm({EY*WTcD3Jv41tHc;8XQua!;!) zV)Z!V^id;>HO(F1#m?2~88p8`KB zhh_qOsGkV?8=Z;7;1k83w!!1=(^+3?cS|tw8OH~6+%~L(Huzub#BDQ~Hr{^Q>8B0; z-%sCN+QTru{3ETLDYUVkdtn?%?tt~E_Ez#mD86z&KH51KI_K7$FWEA~tqbSM6!*I; zQ~KtCwmUR^l$@`0ny!IoL`(hW+EX)4?s#whegwS9cQXfnO((WVQ+|%w*J)2ITSavt z<%4X$8l0ndI-sG+VWwTKgX?iQwhVH82cmBIKNBwdIA22{os1$Amt1Cx)zI{Cc#6cR^l*tzrt_R z-Gya5wFzeoO1B+s|4-QJ`DvW7I*d%kZzebx%MT2CE_*_`j`A-SV4KLF*umJjgK}Fs zk!5A_Ke7J{kF&>~&e-1l_gL%}z3a7^q-Qj)bc$ly6^k`WCGj8qDU{O+jiTo>r5sWAZ?XO+r(S` z-`_d!nR#b22?4SH^7#yzc`xVk+@I$>=Q#~!@HX+{ByxWKThs2knb_C@>NM`APGeyR z{Z6b#F*C)yCqvp@N;pb^%Xi{1%;L#;=GG6Q3&qhl9nhq}vp~x|mv& zuZ{6~pT3#+)tJHKSHFb6q_^g!@RHXuHy8YU9({;CcG*0tb+I6ST3MTUet~jSI_H2t z_)q(#m8ZV}9CRQ<9|TUa2{yiU0s9e&PrO}qmuk%_=Ie>ijEuBrMP7*vQhc|V=NzAD z-*gh1Os!)gGZjxRey8sV`RLjwuUN<_1s?HEVt9O4yB+X!y6w^yY`D9%XI?SIF51vp zc&=^j)7=A)%Li>Y<0)(@%I|qnGG+yMD+X`35qryy^UQ+BT%74NdJtWEMM;SF9@4DRDR=i-hZ(06D@amSs&-13^Mk8btn>%438d-Gae<9k0o z^6^-a1COf$vNnj%MW!}U8lN5LJmIpdE{#jA31!$l*Pq@aTeK563Wgn5f*)Wj8}8Pg zhL^x!Y%?-wB=WhaSl?MQ!1jNhb&@Fe<{-Cbac_3P@Rf_Pf4)@f#iBenW#N~4PW4KN zpCi{4cPU4nLnrObOEJA$f$>eicoF+d%NH){nan#;EaX z+WB-Y_$c70B_Td~anLd&JZ6eXn~3If~ur7>#caG^p_{WPEcOA2NC6 z9^_d$J_o$MQfB}SG)`mdLeD8%m$B`IHjS+douq7CWZ++7Xb)|2EbQSzAIdLU4rN5u?|6bw${bVj$^JClJ)gHm%nJ36=@`Y3DrL*9l?DK)z zj=?@V0s1;dex0|EoX1VdNv-2-mU7OF31Ooo;DtWqTw)Y?=H!&MDwm08qyy!PX zRPn6Mld*HL^~U%sO87DjvjdjNjeXvTX&D*mo<_VtA~=7HZf#?!Wq zJ?@NOb;bR$uj)7U5xm3r6C)00>@#{=iJxYU-ClEJulC3Os{nlAHQ<}(-@b-0d2s3T zWcr}d_kQeFPGyeWmt8*G$NFP;^=_TL*ALzrKYah*kNLpx?z+L!N)X;F2B2ro=-D*Q zJ2s{|djY!cPaE$MUH{Y{>#u#fcJR#}Zy&U2U@ID~hL-<7jd#@muhWJO;qrw^*otJ z&V}~!$bOZKRb8SyikJ1b6oKv#2dj+<&=%}h>=}Pt>S41XkTixJ=_C?NE zvzp&`N-kUZYwIhPQFlkWWh;48`#8hO*)FpAM{1nt5Us@=na5t<_0(a^JF>f$oU;Ap zUTkchH=w+ph3y=)|23aW(IHX%SLNkMm*f#c3NtU+PDlNQoYX)L%`epuc zM^%sHzKN0Y++LoWeqBw^L_V9bKcnn>(K~;kPsQ$D=kGc<=0LvEPc?2|5C7JUz0Qt( zT>y^m{0b)@Cg*_P8Nja$_=N-TlRiBm3w8}|96s#s@nI+U7(Dv0TNi+xYP|;S&lRTs zOnTgpEPd2ieLdj%_u;rreIuI=hQ1CL{956$gMr@!;CHPXe*k`W{vF|Wh3nsk-;zUs z-<}-&c}5ud1pT$bqr;%RLhx3Ej?vm2=YJDhRsFIev!6k+uvwi>=U7_%pc_{JE*Ayh zqH{Qce7la^YbQV2vgC)=Kk0l_@yBb7FOKdBF*fOL$q(sq)nkog|4BEE=Uy52s>m-b zBlefzy+{;W1%Hd!pE=)0XOKw#UWELzbZKK_Avb;>t|$6%RlZbE?k58Lpc=SN*66R3 zH-`hhpU;BtZ~rT8U#RwzY>fTarTO+B9ljgg_lRU zb9$v;N|m<;&9AT>=QT9u>+vn@DR8`@xS69dM_-DAXY2FP@Q3H~hjhB; zA^R&rjnK-#xhtt_{+xrdIqJsgMm4e7^4A65!orj`3-oAQ&GJ|86R@@+Hby z8u{3*%c--seE*DtBN}DcA#c_89ZLiwaw_ydp9+$eudau9DAz+`cRxBflR9+zg#|T2l`X% zFtTN{bmuPBi$`~|@1iue;S10!^r3xa+o=owmzVnUts^=PCgjnnM<@jG(p z&t2GOt=MO>^~=Cx5Kq5$efxO&^RP}GPbL~Rz8ONr(Zeib zkEZAA_IGH1m(~d9LVt1M%?V=2bJ(+RA^54L9tP*R^px|NI680TFg}u(8i!(v%8R|1 zkNnfUPqDud8K8PtYu~o{u4*Sv{zp&;$DtkRwU7C8&bBu_&OLEsXZW7SxfsFUZa#zZ z6L>76oghEuWzo$0eVQ36KOL|?#u@Cd^TkYGBJUvk%f{E*D^%ZZT(SrVkdFkTq7Sw`x#lk+2o%~bhd0Hvu;3sg0YvvUT+z^^AnvdyOVWOY%A?Q z)9;#{o^Q)rUK6ff;v9`^|9g*-XKDXWx)^=5sxEpW=Q%Mxn*YoODsLV zAiHrI`v<5CvJe01(P?Kit&W_$b@iH~$ZHU-1D7OrV*|G0?OC>>i(P+JW2En)&p#5F zKl{U&e{+ucx7FD*T5j}V&{h|%2*zjL%lXeai20v&(DR>|n!hcC+Vys@#rh?f;;c% zB+fhP?4#y7`sU_$`W_#4ENhJ;ICEwaIVjj~ujG5*kD_A=u*JO3Qx5_8Q^G#>TK1?* zUd$zyGVQgav^S}jy{fCsURBlv=kiSa?m@>A4|q@H)<0_yoP=1%nFZtTP^?JH!?3Fbom(2C+kC!Je} z{MBA@!C*cxxE~mNow1w@42IE%Y919Kr<>{D>I@tICYEFD(ORAD>y3?tKIgBM^StQg z6F$9Mn?qh&{gjr+h8`QwO!1?HQ?=5k<{fSWEe9idP z*seNbvxze{uVBr)VT3(nvndby4Rw3u#dXXiAB(o`Gq!j7j7{xjRo#UMZ6}en?bV(+ zV>5xwu(80RD62|0n>>a0Zmke_06?(W@6i-e1z6YHrkki%Rr< zF?;!RW=4FrN6n*X#l(_x&*}S(SJ6S+;H7svdj5W3f6{UMWsF(6-oXCI0PNBAyPU4S z$-YWx^gAB-+)H2TSGxW|gAZTV8+_RO&mc~g3n$F66TGB!y+4;dzp=Xh0q}FL)%B~K zu5V&2lChFS()AC5A8e$t4)!;fSlHjMzl`T3k2CbJcSc%!$H3rGU{LGZSwp4!c|Hs> z=spGeJOlgrKJ3+}gME9*Qrv%_ViM|}X@0D%k!&`NIu&WIHYrSDI z@XiJ6HlEknFT3kJ_QDQZsX7>n(aDCq0G*!1{!+csCUB7iS4}=XBoFGSJsGdV#$!Au zGERLLeJ=HRrxDy(9d&V!;ta^(O^OL(gYA+Hw)QjBZ^^oL57%6r@Tatyeg7`*7f^$; zBRsLCVBz?4WfxTQ$ez!gcZ~AlD^UA=y`R|NnFy6fX)jlH^=li^= zGk3Cib7$MZ^XAum7-aBf3id#+$Y1 z#i8=%IgB$GZyv{3v-#^MpYG3dPjF5Cgp1n@`wH!04}O&zM!Ec%S;k&X=Szw&mA^+U zbk(xPlVk12u#SLDCVR@pvc7I&SrdjiTh-5T48+2V)u$f|?_}IT|7oK+D=zKNS1~q? zS9Z__Xiav|GyFAv6Lwtn2yB28(B0^V4XkxEV5bE2!;}NjATlxAE_#`K2JwFe4H8pJ z$PPRKTP0v0$u^qj6|Bs*k4g?igMogXeYDx{H%NmgBafYZG@pJ7jXoaMeUt1XU~cze z4NK{Vd#SUiF?L|Tb|L#ar2`mu8_#O5P8YU#oOX0p#x`WKY80tvoY4uq(@!UyVs*l| zl;gqo+&UrUmuKjN6S8P+@s};FEf4xb_z=PU)vhj9+e~N*o6P2SsD4zqWyG;>HnWH4 z$#^xgcqVf~XAk3=J0tMt*adxk1shxED+W^*BMusSk@)gfeoy0fo9sO3w}#rEWc|mM z5+`Y6KbCA6)v2o9Or65YXm2#jPW}vYk3bJm>{i8ttFT+GF0}i1O+GGgHGZ3Sb}T7= zV2tgIQ8it}8|~1lsn13G32JdFZ}7@g4I6(SaDYdmf|buBj|bqjBWwSZ_#j#c4Ub@5 ze-vvT)JCf-niQ)iZ)fLU-)Jty#w}oP$%eAZSi$J!t2@E9_CGCvhn|I(ZsD)uSmNDh z;h{;M>KYYh@X%)x2aw|dT6VrgNe&)Lh%TW;)k%LA9$J8nr9Pj7htzLrs4&CFIFEh@ zmE(ba9S{BKdds`nJhYWQ)Yr-M(`tCA$egX$1#U9!tD=?{r~{~RcEJz3#XpQ&d%eU% zyTPqT8`iceX!$epc&I$|EMq%Z9=h;~OnJTf8p}gB`f}6BY!_e1me)yaLL;lAm9chW z{t3xza4i~*GoJ)>($?g~en<^2OVj=3^>@_g0P?!{ed6DAetI0feFGi~(qy&P58%BM zj(M}W^t$)&Q(YJFoYq>B*i<#}RV_G~3x1B$Geu?llB|a%p^rB1SFt|W*EdXjjm=*c zdzo{h;OSL{r=kBib1dU*OYhRDv8B}VZCjt_>5u;>Jbk+5=@Z}sN1yfJA~#Rlymsxq zT+6uDF|K5#aHlpKfZ!y62Li|ui~FmUDvtag2KZ`Iz<2N0uj8v@50zIC%vuCGN%0B6 z*2O3O9hmm>fzXkPPb86xvVop~Kh>vfAjOGf18FV7^}CaP9i7cpz3p^-V!(dCet>?< z0`}1T^y%!Ot+I#UH)jt?zTh((+WS0or!gDa^KBxXeXP0cW-Vej@uOjW{75ix^?R>m zER(|6mdF6D#}wiN3-*HhMBf&jp})W&XnVT(uMEJQ*hGK+W(?W<{V{+3LH;&1Jp*ue zvAJy9)Af5*0Pe&l`tx_7U&r5Ne!tmzb3ofO0BZ;5a1J;N#%(;SI$}DL)Y+aBun!D> zGZw?&$OYM+x%j(RIROLmx3!(J`TNFC8s8^_=db0O@aKG=XaCvqd?a9B6`TE%X@95I z^Gq#&?H_h^MX~e7M&6of*3}h5d|2@cY??T{DfuvubwtIn;E5OJjqG`{GfXa5iF}02 zHAU>NJGYY$v6(iukG^GfC$SB!F`ge>+d+Q}gT8`sM~COv|MviV4eYb|`hH-Uldpkq zM=87vUn}mYKC{;tUBADg-$D60N58iopkLXzqBZq9gf&LP*9*u&)|fNa80lMa8W-De zYmA~R7k8Y;ShCl4zDfThuS*X_LqEtYIKGC0nxi^t1d=9)M#T&(XZJQYUFq$rYdkHM6z^hd)u`To`_VDQT-%z`cGmu%;D@2B zYqIpna9}MvOE#W-r`nY7Wc9N2hSrj9V=VKpo7Z!5U*8jPU@Ch+wv+6}n~L&R*2zXJ z$y@n8YJ|2S%cpUcNLx5>=QMI8r+GKtnKU$)w^DHy+2eKG*SeG9kK)}p@~4VDH*v;T zpf)C96Vi9vdFV4_Pbqn1-KpG`%)O0IU1jCOdLP%axt)EGb3M8BRJ(S!&8tYDhhz`L zbq1BO2mIU~V38olLF?7e`0XdiZ^+(1vxxe#?~F>zBgvQ<<*ZY1PKMP*#6*2tV8+qb z7ASaMrY-OcF&xLcoiC?lMoygs9J6)Ox5+<|%*fVB*>MnO11L`J`g@-KoUF*Hivs;Q zUGz1-zo0H!0uG%nS_j@T)`_5%z&eqU4K;I+4bVxa;@|XlTk*>d(@FYB+jS8z?ZaC-Z$+fK=Z{d%mWRwsBsA zd$X36KHp&ixz5|zpQD^2>@nGmyBt4X#W*L3pV1i+I%87|C46X+fj3&UpAI`4e!E%m8& zMy)q$o!6&D)9>~48<3%^0{(ixejN->%|RQ3t~DANYWFlPW3Qa`*$Z2afIc$pD}U@= zJg>OF>a%38HJ*mfm%o*YE2EEn+up#%`0nUj`R;j)^FT2%OJf#yjs8A9)*V;LkH6`k z(sr547u>hl+GffXobSsBM{kR==*_Gv_;far^A|SX$oUq?5Yb4&=~dsyeulGKM4LhR z-(hu~!PBTippUKO?&OjgibG4kZph(d54S$H>GRLOKX}^M;P*Kl{+IxNU1G% zcDr1BVHsnPZ=H{Ctue^AmaU|-9oqPN=?G^pS-f|A*4wnfD~~BwJ&|)rwo{K`JM|cz z!LO3v-$<^b_ql>tRS|Y6`%L8jE2jVPAHCTuUSI3W2KBp#}KEBxgI_OpKLURi1%wQp-;1Karw@Z0xk%6+~e zxMbw>zG~`l=Z)@OQ7##MOe%j&^*>bywCerdW9~a=aQ&$6j0;{`wov(>$HwltuCAvh zT>9(e<-}YY-^aRsxI0QsoesupuN`BqHIgqGPhC6GT#K{D@%z-ZW6iZ1;P&g(wWH0o zwX7Askh(U;T=Tg0v(&Yt%(X_~N3A!%-?8Qz_W0#nxz_Yajjz&N+d}t@TM)c2M{1K5Br^D|_1Hi>@Kouz`Hh z`zAcSdKrJ$0RIRuOpO&jGGm4Q6o)Bito4j_IepyE88pi{gQg2wTEkeM_LiG7XmtLJ z_5~`hPkUj4zwI7B$%g!v2xHZ_HghhnXwuT2t551^F$mk^Ec~e%+lNj`B&oj$Y}W>1 zi`+Hitp>KpmYlGyJ~Y_=B79dzVUo zqZj5V&-x>=&;0Ih$V!`2UZptZ{_|oX=Yia$A)-;C4zMJ*#g}hspe)qM= zSvD^**SmM{uHbKCAESU9zVSPY(z^Wjff}JspRdTu7m)p^`~=l#NrXel(}qW@h{eY_ zo3kA{zpsFNO~$SGM;S6;J~DMaGIas_*PhKk_ncRdrL~Gh@caDybEoS5&7pJ8QH?SS zC#_}VL+7EEyRP)@9NKLIAIhag_Kr1cG2pfp-LeJ!wiVmX(A7Vx$rl5&hKu~_!rimt6Zvb zVw00-Lpdp`L8kF+_s5e&U)%lc`Q(U+cZaq7-$BOM?2mC9?dS|cH%4+@SIylS?X`Kd zUd#6`>N9v$j#)kZEh9&^7C1)Occ-|h-~@~-eu18G>-%RdN#kC4Z}jm_JSZbSWJlJ1 z+Wz{p;ZfopcO&zS{;WbSw~euSRQRr99Q1v5HTbOquhN~uH$GHF!aH}W?kBjOhIwwC zSx0PF`D$(GZs7ic)>V~-f(|49?=q&}WI+G#juT%lo@!)~Z=3T=&vE<~D=#?d~hfZ>i_I z2MkNGFGujsT%Ku1k1Z<+?VN@ln}%Ff{91i#@0;X;Xrp(bl?mGdFmUsqH3a(jsOST` zTDU?sWY9-&{`Gm8^G}AD{{(N}m!KojjGhgLpe6n`0UHOCqkWhZ`hPQd*utZ+uMiq@ zx^d_*(mVSCuz13UMQZ>S2SX2Upl9PgEz|~Rp@umIVR4^lVX;p07Vq#|_*ZOI_(5M^ z?&d$*pSO6uA0IutX7yW)_1)5g>g*UjQDo>V`8Z|cY zZ$7eYI{WbFU{5ttOQE1_?TgAG!@%K)DSTAPOZb~wqdU8ZHFr__idqRTD5ju%^83gI zftOSJmp)G3j$#j5$5Bo*b`sA-E8ywJJJ1{K`}y)(V7Q#MpY`LY$?#?+d96V>*?Ljs zyqBgAdo2yiA^!IH05`1Dm_cauOQ*0vg&)&iY^f;Sc zb*9^@k>%j*fj{-w^UCpK+UQ^T8=lsC$S12M@1?5;yOY{yZL`sH*tg2v2y@@%o1Om0 zH<~-}dn(}{eCx|ijubHX(Jh>ZC>e7meO+nS7ZTXSRlr8PqnMR+a$>fP34IOt=sRts z&P%QWhG~BA>yW4Hq9OkF`C*X{!yjbvLkfQQA^qyjSIedZe&iIk0gHzPzv0XY*tN~H z@Vg=h{NmNv(But8c&8coLEDc{;ClzxH*kHpXsFs-<=uTW=O(jO1iZACbvw_t^PA^Z zZQx$HYP$F^R}3mi4CbXjq~R^O?BM-*!CU9rXTt~h3+{@|{BWervy!c-Yg%8|b@7$H zyXWdk8t;^!C!V_NDAxGEUk&tH8^9fXpEVks$%d&#Udo1?3EN$u5%}$9|ig8&qor**;CV zvDkDIb=|k=I+^<`nv@R|U+@NAIuYcLblY3R}Aqy}TWpMYS>hsOf2^Z4iF z{SM?(&^{#pwW5!_gSJ!i;Yl z{f8M>9pjq7xEdJO+8j7>aYQ2r(7#QLGb8Q?U%EBtlQot?_?%d!>d~nGecP=5n8i6g z?~FP+r9axQMyD?EdfOK8ex2l?SJ8(K=<6%qn5ae`_OVY)FgYGwPt3RJSY%HfF|iXE zw;vZ=N)70UH!gNwIxa|D;(gfu;qDrEQv33VvvKVhbFEeN#8cOfG}p?w_Dt&9vF2JM zc3Nxd+R^4(931~7b#08f7UkL#scT1>Yv`oQzn{7`)?D+rhHO_{kg-&nYc=rs1F7eZ zH`nO%a&);r=Htw@Eu8%oRU8mqkz4?dXYv>QP@XHchR!&Y*w2NZK?h$=eh2*|iFI@? zVT~JoApia(`gxWZ-fm)e#i8pT?IMP^7n$Bi3~y5CRujWh>`r@g_wvCu9UJ_uvxVBJ z@!ml!;MjR@G=E(4BX?f$BjITa>mu4erdZ+@bfoMO&9j{`K$G2^#eVrbVhc;r0XIXp zS~pk;oQSQUyF)GSr#-e(i z#*fDSEI0dr$?qzPeK6NMJgfD8^;_wA-9@cSS8H8OGFy3QS~EyYa{GS^>0?++gY1q; z;LYz}cA;vn*P_ej*?3J#Mqf@&&Lm`XEpwB;TYwx#UMsdx5ofHH?`HRCuUs4+Nx%EO^OyH|sYxH!(T0?`~5hS`ynjySF*xT4PD(O1vFX7>K_^cD%xr}>j z`27v&#O)a`0LSv5w(EKDBK>;{edz4-J$&l8pO&?@{&4nh#i7X&A`iFWQIr3Zg5yBX z=S?YKjB~JEzZV#b{KcdE@hI1Hx0knbPq=93thZL&wt?>j;9WH;CbHjBw(LS|*$2_# zKO?6{HhvNFI2rn2PQCNt&+$AziRbmK^9Q!@>`6T9{DG5rb~|y2a$*$BV@kOhSJ<4v zDm|s~OrYI~j7MWoe&P9V-F(|zzN`I-w7(Uz3PEy@Hjgv+Yej znT3=1RIpKORr=qK&B3ssWk2IL@L}wN%gGvJVgGtfv*6cvM&%w~nDI3r(-$H`wQgI$ z`0n+>j4!;Cb>E$JZ!N#A5nn#D?{Len=v#2B;qz}7W{zW+KaRK$C(r-q@Uti@pU17q z=gQ;R9H@&x&c-U`Y)qk!V{Ll%#Q7Vo`OecjW@=`PEI*WFU&RRr?sQaIg4-v`5oGlMuCy1V2`KKN^r9v8^|={_W?V89e@$J+ueQkGBsMkMx&~$EWD;VEOTy9C*x- zq4blRAHSZ$<7L@+tc?DMT*x2h!rkQuiM#*4Ai$44?q&vXHxNJC_P|OgJkNp z-t`j$xXj6u$AZgaGjTcp5O8_iP;p6r*|@y$5ODeS7p)A)$&>UkFi)msYn#Kigc+$$)AHtK@=fdm%()Ype5#?4jg9iBmLy&$FHUM@#<_GmJ$nF zII$-e-mW=FyzQUq^P`WqdLM89mSwNodK78?OAtE{uAcGt|8?+JI7&-T*i=>nOxV3f89UbZIZ3`pw4O7Y_kI z>TK*bbfW4?q-#LtwK%<~JkfW^&+PrW8zw#jXE<0WECfTv+8b!J7*lPngcYCWk*+XXhL-tk? zFYOnPUBvu?@nXAv%p8dE5EJzCsM7IX>EsvuHeWrc_8K0&Yk>BiI+XUXPZ|bjZ{wk~ z7ykOAiw9`$n}f7x&#z0b*O>G68oY||$u^#yyuqtz3VBoW`K=h=a^gtDC08x;!lqt< z)?wR;Ww%2k?c8tY-E#O(`O0rVOEn&6TijrCi?$F~E9+^vGtM(_Ku6JVwAbUl^=<4r z$=vywXX~V5WZ&y8^hAOX~d56~vo^^kDX66Elb~e&UQ3iEUo24B6JRu&23^ z80~oK^G%~>f!2g;@$1VNdjvmEYfw@A&Nu&qTGG(=T4F|((6rV(quf_cverlK*e!hp zzdwDxm0zN_qZxO0eQ-D49cKSnx}J_*-*ELN?OL<;^_hJa$xubInl)WySQ6gE4(1y$jhK9>@Hkhj1BxlT{VrvQR}i{b(%O2k_OFX|axU&i%LWcNs}Z+v5h1jW{gKZ zU^f~00Db3@4^e0>VAJ-O544#rA6_R*vW_S^gF10 z2=wdZ!>{~)tC7=+r7K=1-XBy(!1Kzn&6W{Q0IyE?I3*+e@ptfi0vX(eZ5fmizeY!h zw@ls>yr|s$Y#E{a5%Kp!j8osmU(3OvYFH@OAc>5qht}pnb8DfuTIf$_D5HC+{Z!E1 z#J+<0Jih>*-wiG9X1(LVw{E>{BHy3$ig?EBu4b)svghsW(kEQFvyj;I7LVFdp@Q!5 z-(SAEk~5*vY2*zQwQSUwfus5mUr2Xo3_5RSI^!UpE;b!mQH`89mT^1W{NxwNpAlbw zGz5IBbROO4h{-!o$!^+mG~sab&pvK~vfIiCyWgOiIVm9cq^Lf9G z@!T^qF{OuX8^QLb1E=NeaZ;PAHJ|i)o}3Om&u3oSiG^!zYd5)Kv*~LC=MqUi){$RP z&NJ}WzFDl9ivRU}1-XhkvqWubJ++oKw}`U*GZpV!;Gl(;Uj`k2WhV(r-M6#^b_e>iZj5<0DBzrOZUJv=cM(SEA+ z+D}EU9e8`=A?hgscW1jeT|Js{NEh|DT`bHpWV1IicK3ATty!<|S{~vv^>q??5g z(kxS7t-rrFkNu$q$g<`99n9Zzv|9r04l2*!OGmp7hMURB=qJyRE6!gkfOepvRLvdd z?`c1v>-SGTKY%<7^y_$Lo!@VNp0R#Z0rWQvIvj%Em$H2tFB!Vuw+@|{%kOi#Q+AK@ z`~I);R*-*!(?EWorT>%la>WeCXEC~xn+UB9x2;Pc?s~~FbDfl)VK+ZDFuI1-z2>rsdJv@ zlzIEK<}8_^wa~H1*02X2kb%p}l+Ty%=ktB-&T0JCTCHr;x!}jyp7&voCCP=5?9Aug z3CM&z^gx`m)xxa3mm-h%klRp--8D;p$${92?^ntiht_aQiIFb?R;A>PE2piLIO}Bn z9fuqT$J)yJYuqE)w~4L0M6^x5wZ31&_qEt_`hJzJW5enD7tJ&F z`32^>eZJm&x7TaUcY8kD7x*5;f6M1At&^{nigkGWbMW41;GNEwSN>V07w*0YcyoUA z6Usl(8nbc`1h)cUz5&`+4#G*~An5$)Fz_w_-c9&6g14)ubqny8Eu#3DY>_aqS%xnu z9IEz=$vx$-DJgYWd$u-dtOP7K_Xl*#f|HGjLVHlZ3M@4KVwne{v>P@ zH!iJpCb4-K*DkjgxYi$+%h}hs+M#Xv-{dFAhTr96<)?U7zD^Z$P|Rt127U*~%MZ}| zg+BZhV^|-+frGzjDHva158fu7TXo&f?73CXf3#1&oEgs+X!t{nN3!r9_F&bnv18Kr znl(H|LmEQ9FPorHptK2AR zOd%H>Ky=U=l<1^^7U0S#Q z2=k5j>-G_yXYg>Lv;Az%1HGT3mCScf6RbE-PIluK?N=;1`+)Dp!KGl-#-2Xe1UhR( zeBu5%{H#D01o0yqy$zUE&!s*j^^nCY@ToatOV>SMP{rpO;8^45WXm>}k0RSnb%?6? zOHRezYq1OE|JMLN!Erf%H+x<;?-^OA_i6=KKA*mKfV1*aFtK0B^}F?V+V{n|fII7s&0C2a9xIu^Ugy{{^0KvmpPaMaXKAx; z|MZpZwEHyeZl~St*VXrI&p*Fqdl8?}e9HJl`84Wx>+iZ~x6>Q8^XX&rO}mm6I_G{a z=hd$%$?N_D{HA;#`Li{qwuJU~=CzEw7@LHC>*!be#1hCU#ki8-yIArSe@55ki`6rZ zd5lf59?`bOUd9|8Ew9*_-UACQzZR)~{~+{eV;Sz-D$i7>fe z5pQ1$=bugn9~<#|Do5UI*2oJNPCoaq(AQpK1-G&9(ZbclU{*!E<73~f0)D(NI6qOJ zX_M#q{P(#5=+myBrO#&+|LHtC>9{0vv2N{AvHG`Oxpg}E`Eh=G{EnzrNX==nH9P4S z93{Y+dp3U|vF0-69J7BLy?x%p|EPbCYT#b^Aoogh-;;ci+`Rj%{L7v&i5&!-XZ!=8;3OO$W2gWqa{y%XKSO@er$WP)T*3A`u0CA%`t-hv>0CSvOh zcH^9vUV}dz?9cYc{hI*KIQYs&4eEF8mr)(` zB=I=qjdxXhz0mz*W}O__C7#qi@E@k&W_7EL@8u&G3Yf<*lOuj5IxDEV4J`4glxy6% zCT!^92nSPqE9Dw@uBqPmTgK_ex5CupN&DOKt(DjA)>BRGQ+)hujsvErqf^i^+Mg6f z&&1(<@nai&J`FyvhHuJq@XfmCp-u4Oo)aI`Z=O!vNqhD3yBqy_Kht@CLXP)ix!y-c zxcAp$LuniXy}vZq`^W(IeyjWm|NVCPx><7T%l`Xj-0--2F9cu6*83L%A#Sb9)LR8U zNqA4|2s$e%${LFo^2Jw8v%$38Fod=}FSaSGZS(F82Yh#v z*IF41jmaFBd6!_#0p^5VTp9bPtalv^N+w;cJ*mE5UmxHNNg+pnd$Q~u?X8o|(=i(# zU?#K(e`sxN*RjxFC9yc{9L2ciLWhP1;isX{peGz+GX!aHJ~SvBrj!_ABYAgf=X_|8 zeH{I0;I$n&-iHR=`!&UbzaP)_J~Zgw$Hq_f--E@yw&Mc%%xtO?)nFzbPR)zDt3d%XMoW_53b z+6=;-VpS1%L;j#y1BC8n=U4eQzHDL9YXVsnLH3S^Zt)fS(d{&!Zg>vA?Wh>^vuZAM zKh4m6UbpHsshz<4n`EK&77ip;MfT*L-VV=Xi4nJ)H%174zcl(VdG*;pG(JV zBgEY!qfavafy?EuduYPRf+jZUxd+GD-a_y-Y1x7#j3FTv;SSHSDsPhQ4v+DjDP_$YOdW6yQ>HFI{i*(<7bHSO!uUMcOVIs%(h zK9B6CO5zFS(5}f#08d)K+s*o25$k(e&)d%Wo{PuXdOpR#ztHT@v9`lSJ+kF%7`yl; zTZY}41)CrHGR(=ZJ@lPj&saG$(?+0Mv6-i1E4O3UO=m93`I*jKRC{SO_NcK}n1^aC zBuk^cBT_c1Z_gA07xexoGzQvC=8&JZK2F-+RL-7k&O%^>&HVyvTsswWSjJv(_GzzF z3}ZZbJQKWVMLs_AR&3=y#+MI%mU-{%U(cI$vNrHi4?cpnmSE-RbosN;DSP`(e2V@3 zk%gRLOdL_q)XG=Yd7ap1Ra_(1x5>pGr;_KRSYH(~NU=w)I|uu4xDX7^2;d=D52bjV z;D20-Hg&dy)*g2pkE};uD86BGnt;hf=3Kyem>O3fdwvzS9qhabH@}OSU#%az8xJ44 z^Csppx8QjbnwzT!>G^Y;$J`Vf#y9RYHRXVVVk`w~2R?7Y^?N$~Zt?ftj1QcBJy^eO z)>wm zmwy&)u6`XYFZ25i((=gxSob^Y412?!?cw0OAP1a{|HHG{=S|#-yi)91wF86aO$h#i zg;`@nJ}SogdB!GLDZ1#t#%Rx*$j}w!6~#Z2r9Zg#d#*`eD-QA&ZHkXvocZKWSs8VF zmV8`9?nQR|wG-JN^hadZ$;J!8kDg>ff1AwMS_9csFK?%Be376{wg8)~%h)!BDVuB( zHr*s^(`DF1KhO0(Hko_B)%QgPdjF|h?_-m>_Zxj*MDL@YWK(AJ|2_YG*^&#e$=rLj z1KDKw74mO|`=Bqf`x4(aYYoRP&GIvpYo_`=#*eAy-I=_L|I*1jze=5zHHZy%pgyDF z*blP$%xQ}qsGZil7`hup^vY`XtOac!*%6;`_D{8~ zA5m=95Yzc_%8QfER82-!Rj5N0-q;8IDlbL4S2|eno_Jj-me{8HL^nSAUw`UT{_Hus z;lqVyjWGJCsWr#_T52;y@cpq1W1re<<9|u=){5cXc z#X|A_ZY5T?mHZ>c%#?fDS|?lgxY%6gE}1F&BVcQsodoXf(qW8I>$2mh1FmaYzt!~# z=xE*J9E#pBx?1b&1>`kYpT*7Hx66zSR9rFa$D{r0fqCW!=DEYCC$nG1tWT!r7o-=( zf&WvvmefYlyjUwG);ub98go*-Sbl3cYmUk*ok)I02$b6E z?ExFntzuaTWSrLR=6X8w$kxLt#|DIF&Ixn&GV^0yF8XNo5j{^Pk%jdA za+23u$C{w>f$Mr2UXmR=ml(X(2GRB4-L4D1@BH3o<-E+1&5W+@ATOgpdH-XeF`nN{ z%>Oy!CYy=xmn(jPZ0jrx?c7dZ+wm#3lVe$h521Z8oyb1WV8rzF{V#aUgjKauQ{rb8*C%?HGU$%ejz}hgb zjau5M_1l0pRz+@~m=S*%tPSOEuJH=ZTI2BR>wCKCcNXL8zt*_ItTjH%TH`JFQJwJ5 zmXa0ZjfBY6xtUrT-pUAYQJz5u_M2i>k2ttUUJ5SA%ueX;SskHepZLS%)!mOP>zwlJk=Eb!6jT~*BZ`v#|Z7xvm6g(!mq4vp(Y59t|W^K+n zd^a|y^JRnaM8z5#pl#V&GvN1$dEVKMj()ifx#;Iztdsw7 zpUu0__@+UJ#`p8}q=mJ$pMo+d1g|IHy|Ou~Cp{|mW3?$+3yL0wSsCF(LmTU*cts>_Tn zSmo+6f0mpX>4GiLoOA(eHKs1J8{eH8Up4f}7`5J4$68JtS<=b4y5QsOCAaLH#OE1* z9IDeI`(qn%7UeMn$8n6t0iWj@$GQGEo@N}QEJz6WVT=Xgt}j1SOcPFHy z;q9_IGp4pJUC&>j@U2mbjy z^f>LXF9Dkj8;s{WkbBA>)_JJ1eY$u~wXNdlIE~NgXW3)28TZhSaID|bX--eqqthp# zYipp3TIj;oxR+dY_KjT|O~+(Yc}PY!kI)>+pO$Q{RV|Q9KVal)mEwzQiSZa-$Z9LV ztDD(7>3DT*!1fESU)g-U^m>5e{^C)s12{ji*68?re+|Iuc*V8eO>RyS-g5al_2lF% zgD17txVdCm_s@~9OW{wmj=*p13GEf2?sq{;khiyO#ZH4pWKS-oMoC2a)tI^eK>Z5;8Vvl*D_ydB}r^sIr!A8Y>6-7%0z3bq z53@#D7ln^YO|3Q2rPYz-kn>&kfSvEfJ&NHvxm`;?x#-lrlUx7WHqKvIf9^A0!Sgc~ zPB3|z%76PKu&&>I!=1{7E+C&_O{2GO8+#x&LIcSg;M0aEyj0qP-86RQ!g=SCpY{Ct zoWbfDTf#H%7w~=ow%dHxqc;2R{~OPfE4Ojl=&Fs0QTZF&#uRLi7Wxxp;AUHcaSL2YZndsZDo^QKKX4c?$Ca&~) z&*Z+=J?qY!)~mnumD9}l9ejc?OR4u_$u;+o$d%T<_>VT zPCi<7wD*^1bH9=~fa|tPqP@RAOTTGHzh`3inEU>3`q?(MuUY(YKQe1Rbl~Q4A9KMj zKPNbs=$n0you+XymIPy&%R1~d>iQ+GfcNkXjeMS+9^3zH0dBJy7ybODig8G$@cSre zO!G;}TiO~--o}wfX8g3%%y^|MhXVW7H~JoX1U`%N{9h{Qe-7=O=h-*`bAF9$N#N2B zO`E-ybC}n8j2D^lon9Avw={YnK9H@cb)zxLJwtEk`)IzGmWBJRZ+wvk2U6-ef-GR7p>h4e!$l`!+cungw|d`MtuXD(&5rQd;b8>Qlrx3ga+l8 zWWM5rNnq||zvi<+@I%f@zRE5V9@l2W5BX~3YI(HxV&J!4`HqY?*nSdRNXH7_(yhT5 z*)HlD2A_@ldd#hvm1My!m%qBNI?tRpRLok${_6Y}zVk-q#x;3fOlxF`yO5o0eA^6p zI!QG~?_jR?FsEkb#(j&s0_5DVme0M}*L*YQU}`NX3GH?;_rCSvioP2ZcN#@*Qh;`t zr{m=(7D1!P=(Z->)3bV~oX=vtH#1u=TWz%UhbZ^Y0}s%awQE8x_eg$0i-!MsruiH_L)(l+&)j9? zTl)STx(|)@o{L=7eL z;m5^Hg1B7A{eEzUUma{N)!dO?f=w-WDFyc?KQM?F#_@LGH*pDUY3FZFjcq=szsyo? z4%zjmvd=Uqw-mQ657?AWe(m8ruHbpX$;+T==vHgc(gBJ;u=Y7N4($uqvPas%dxj4u zI|dv{&c9nb)7hBH`*wNTZSb<4yN$_wzlymDme82!%B=G^I|=;1eCHd@kz!(6;8phh z!Nia{$sfnQ$%r8-e^PdA2Yi1&cI(sFIcvbzX~^%*{GCO7NwsU?{faKm-&*5^_O){c z*VBq2>P#j4+Wb~)`)1p_%KKMb`R;|8Ht+BK{rk|-S&x$^B!6YD?3hAe;oG@$ncE!t zZ!280I`8#9O$tIZg1C2{xYYo zO8x@ZF6dZinsq_bUErq+n(m@atsj{-MLUb3>8ruP668rT6w{jHX-7uxUYns0{kp#J zzlE3k?eygUzXLi^`LVk-M_@T4085u6yPNSol!HHaWaab9zm}gJ1uj+0V>&dTxWDQ^ zG@z4{{#e0eW84jL- z9Qnh-|L+3-%Lc*!ac;ba8UI)RgW`YbdyM~Q*lXr=>0#x6;CZP0|L`$`@V^^x7XGzf zt2MD;epzt6u^s)}f$r_Rf_;(b9jynyC>>saZHyjU`+3E^CdHn53fl;MPi*+Lh&SG@ zMa_&7AH$C_XHr(g9^)DAuZpyO*xYyaQ7tj#H_-jEQ5TS7qwgQaRyv+{XR;5Xi+%Ei z#B=rh0{qBZ$T85Gax~1kFup}AdtD3BqYKF`DXJ=q6~Fz;bHh2q;*?Od_Y1Onv58Xp zlJDu5nq4>2`hu}1@MBW8=q1<_mtjv_5yjpqZ22azjj+~rptiIhS^irdIz5a|&sQEA z>m#z6>i^>WZNFdg5W2i#_L&u$Jx5y8-L?Urg6p0)9AA)mF^>l;|MkV^{^fx`_jyH& zw-7_>@Kse}W8q7c-#eClAFP)*j>h0E@Vw@WMALoW~~7mQodgCBgC$-Wpv(IV*%$+@i!Qca6VDj zMOl1@PxNu$=5qef3bWrUz25QJ!f1+CJaCu?e(Io=y4Eu7JAAGH7!%)NkGnVaTHqhF zw;teJpsqjM_)-`3;ci{Hpyw8^aAj#I&&*>3vCksS;{@5n*zNeMzxfa5aRNTB#!o+g z;IHh(Z!_+J_NNt_e2{d0XORDL*@%Dr+dwkH!d`r6{2gpeNhSGP?@peKe^2Deu`OMiS|d2$`k7u}1G@_zEn3|x1DT9}th|Xl<%4h@u~`Qt zcF}>ar(D~vOUOYccACpUg8#b?1OA_Q?U3-lNj~3`KTPAlO8eyd<9}6upYPD{f8Alm|3&W& z{x{{||6P--CJxH~-^q=C_T~=G{|_7n{GanK@IUqMi2t6AhnfFpz9;;j8~zo)-|Fh#dZ^aUV+XZj?O;`U9WRv_ve%H(3aa~3}gRKE) z^8cjQ%8B!)>}`9GeA35M_v?@7H}tWQ$CnL&5Axe>4Fi));Bq2tJEw$(-?kV%ycj)P zvS@M7h|q|YYdAYLiXPUUn-cV}_UNP*+~P#|Me$w z^TT@u{~tW~?%{vidjoS40j>|K1Sb zf9BsA{;xmq?&<&e83&L*$iZN}##LjYy_ag=w&XuDQEPEYX- z>fsllW3;b&1LIPTZq6|r!`P9*D}wzW!`{}czSptW()GPJOFqvs@JZ`O!Dko!oBiJC zN9jrFjxg(#LHN|9#$@Gb5H1>1eQ-?V^|!k*CE4E!JVJpnb@YQr=6GHsCzxDe0}s^? z&e``U3ybqzzr+N(v-(T~`qbL5^pyMO@G)d~n7jeIFHZE5b4-C6S7mNoeooS1g9qct z*|!gmJlF3b!lT&GNBX<~!#|=AXisbFZL%$(lVHBGrB%N+zwf(?CSKvZ5N9jwcDSLY zgyD|>ZbZKhAC^Bd``-jTWY=oR=(Et$0wq*T-748wh8O+5BJ7=V{GeO_(SYl3MGk&2 z@`8EFUUd8*JF1X;`XEoZJ&|@S{rSS>Nqi>&2a}(Kt(B4&K7R}(FLoGtk;xyU!H33{ z@AJqq#??3ge+my@3-m8}U|{3-yCr}J@lQ5??8qTccjb_$oy2~M%lgAdc4P;6C1nSY zt1g%Kp8{hI=5qay8@DfCLjn2vGWQ%lExgkCCXRk3^A%T(e_{9CB!O4^LBMNR);Oh$l>0bTcpVOX)WI1k zj?cBf^I-JR!SJ8zjmWn$HRXMH<&=d!9v%NZ6&xSBNqaYj%6}FvhpUAK35^1<@;ybbkbouLry#-o#ALi zGG`$DVQN?TwaB}t1^8Tigsk~rCzpMFQWcQPxy~ax9QtfWU>pal&x*75e@H)!W-Uj1 zUb1}z$>_bljJ`0E2`|a$4%RE82hwW~s4pzTimo=WD>bFIv|4jNm1N$rr-QM%oJO28mwFPB+e2jkfxjFj0vo2td z{n?+R)8E^xhf3V*~J5!`UxOp%ZhRxr;uuZ&T~Y39e`C zsU=qW40Q>{X`IN5s9)(r9MEuuZ!O@j>qF%%Y=hnt5YpC)vhVS#+_E&_+n~rE^{#Jez%_! z8~bce^Ujldo9%en1E6!Hz0%k_lLC7ceV_6w2TOGHe`N9NWV2u4*i`L~_)K6l+w0Yt zw{?us)j_NF_x=X!pfS&VR~^YbFR}0FUC*yubo=-HoE~`Gbxke(^y2Z5>@GFa1{^f-ayXBd4gVWa_`X z_O(0fXj3q0=M23juW5A>eXaU;nK(}GH5LE3{o)yWc4t!Gq3Mn0b?gi2fLAut<__}O z&6yz3qiT81*WOxSxchW+6w01kT^b7Q>tc^>7jW3_72YVfX`NFO8vEC zS3dO_>MU_@i(l_aaCh~d{+ApL$&IbNHy)YM%D$0TXv^$V1@3Q5>T520qwfh*M*|*L zy$LIG{dqy7*}t`i_D1mOXf>ksk?644WjSbdE8FA^-$Sdp>i=8&BU69vLVvmVMxNmv zThA}sK9pQ(@!MBCDHvl21$3J1Hz)tB|B%^VMm&T5#HSg30XOw^hx$UV4#ggf>zy&! zci68teTG~V?_-={W%b`p;6k;v;ET&|LYKOFZ6hVKfOpvc+ZvwpYj>`WzN_}k`B~@b zs6Nd_InL8@dfe#%H~$r8KSf&qNTxX*4nEmiqdn+1P=h_xG77$se5-8q_SK;`${VRC z4*f3EU(Teob;WPEQ}zAUQCqx$=h}F;ZqrSxOVQ=%kIUo0K>MOTr(EVS;`1A*@0Qo{ zxf4~p%WG)_HXg9C@b+UiJo6TGEBZD%#Fu-pMv9hxmZje^;Qa-``~CkA@LrUqZymhT zu-2Zd8yd3T?XdoY}nf1xLyx!ewh=Z*6db{qi_1pK?g)(aV|B1d-za&HF@=X4RB6o+5fN!s6 z+-vaZ#JB4$FX{I*WW+RY80TMEx=(UXx}XkOCVF=~(7pt|K_=?l(Hd-nvO@3iZTa3~ zKhe3HtP{_`u59%8V0E!C%H>a?M>o0iw5@y&wUp=FgLO%dcqtA4e=)RvIq*-QM@09@ ztMM=IVm-E*wby%)$4khELN+#>>2l%xHn8)v+nF{s7| z+RP2qX>KUsGmPVA>^W}YtN1oAb`E+hc>^{}qZf-;Q>&TlAJny#viqoW0ZrW0+O!%S z)|=pY$+akQ?PQ*LTeVBVwk}N^TB)Mu^1t2N+dPf40)jSPNOeqq_WsyCPxmzc^#m*T zEZuxKcJsu5oD0M|_j6W7)W+j+|(F03G=dJoyMb`2%?J zNoeUTXjky}pZy{>!$8j-nf0t2kM<)j_4jbrs-EG05A*qL;PGgF1NBp$)sM4}gX7dS z(Mbt(B3cX5NtMoa{r5?+BcYQoWzor76Z+GMsk!0v;KD3=F>z;j@c;Ten9~0yK9|=2 z<=7uuw~&7vLGQ@6SN$K^DzZ-$pO5gl@e2c-&q|z5w$TNC|Jmp9PB!O_r_WzjeCHZ! zq9n#(7aRj`Bioy>0qU>;WXmk2&nm_`1Bce>b%pDsmEm5sV5wyomvh(Vy8Z;yjE;p@uuw5M~}~Cr@A`u zH$3`J2xPwZ2T=< zFHqy(#Q06EL)Ijf>#y8@<^7W*_tCIQ+-=743W?f%*J8Yd*6KKGO0sdIdfb zx!V`8_teF$qCT+NZ9K| zZz>M8X)bzh{0QE`KiBV?_3kXBbX@P%kMuS>cuOt^?Wr2_8I>2QYm$q>dk#PDJg*&7 zW&fwo^J>FpPc8u`P2dJ!paZ+9{aR>eG4go<GZ&8eZx(%vhAsbu1pE(Qlbo!Xh2b=pRMYLb! zJuaBd#derm=uyjpHDbvE@<8vS*2B}(dO%m1S`XW3v(D4r>~MDtdhPwR-A=8CdTKpn zKBK+a;qE9pMCV3Npw`2E)Oz5VQzE=)+tJ=^bPLb46%Y$vKs=j#RK>N~zf3)Zlg<91 ziGDqV&xGteX7Cq#0^E;_ZPWh2LjSzB8O*nFYPS8JV?T#Ie@yc{(!fUbIBYFP;ZZWk z(z<<4`f#xOg5%koUAh$eECHUNyT>L&7mAsxhI|~p1HQXtn_)AZv*%3kOy3dZ)6Dk$ zwKIt=Vdu^!RuI38^<(f=S>Sy?jxWo4!{f$==AA7^dykp(BG{v|EIK*1oP6DrfX@T; z_ec7x40-!5LcTlr+yH!P{d(%PvWYJ^b;$6^9wTywxkP)9rytjT9qq3hp7NhoMgGeh za{B}OJ{IokU-U2qdN_soF5WUZ_9gZtoyL6sHN^S#26w7y%$WwjvEy3oRQ!sr2JNLO zZiz!riN(?0=cD+5)zCXKP-ovIrlNPwvpm13?tJX7;_ju;q>%{=&WEp5J0rhk)lGkE zE(2e0K1A$#$+TYmt-qGKy_eALRAl^l(cZHdL-2R98k_lwsF5f07OQRI=&tRn(`{cL zZ2Jbk?S{;@PaLf6E3?|3lWu!%ulM?y#3_9}VSuaalIYSGm_ zcZ5c*EX^Ck0gcX8yK;pRwR! zDYDDa(XG0ECHRw&L>?Zdz>3~Y6Mqu~7ezQ-L;ew{s#OZ`1= z5$$mrH)Y5?IZ%BW$#GX-#_~sAOO)}niN}O*cvWlNNqE)jnsAHO;`BS&$nL# z_QBcIK$bn@^kwn6nfg*XQMz&WEoq%8eJLF(-6?%~GUtkVN1-d>`HH{1(|oVai!k+! z(t7cZyZV~fsdj!2y%?8l5Ir*|Y~;J6ql{kMRg2tSihhbi+l|_}!=*6w*MPh44 zFWNSx7en1;*e}{M(S}}}i(brpMtU*S?IG8Td1gF%@m};I&z!OjAIptR&%}Yb!)dYh zwdT}w#&70qGyM3bIX&+b`nrud)N|hOQgnOb7ORt{_&RB?bP{~G7nvx%w3zwL)>^L$k#AfKzIWXR`_p{MmsXpHyR zDbU5K$ne{%PKkX38U6ua_y{t5w|FJ1U-KIuH7)lu+x-gfIJj(Mk6mv4GXPwS9h9lx zgK!IeUmNOqqLdho>+3=Ks`Ag5U8lIgt#vUuUGY0Xq}R#6HW=N7w~M?g7VP z$iWPI41FZsWMrO^fvofUGH@<3P_~DSYlK_68~e+^8eaxFd2ZT4_f%qArP@IT2HW{< zupM6p*7!0oqa7my1MMIKgY7&UY{!>@HNFgV?bv!wR&EC2JCJ^nta17!j&5-JWx~Jv z@^5CeH>g`$vheh=1K>$(K7-?Fc*}Pxvv7pXCYyOEIJzka6JJlIaD*OAVCxM9N7n?~ z$;MHzode+L3&D1>apbo%5RP_*M%_00PdC0adb}6={-SGoHibs7tjrr>?D}6|0~~4e zlg<(v(el%K{?@z~nPKz+biNw-9~u_z{T6=*gLg5tu&aQ#)`N9+g<$hV_@IAH>%+1ZdY7Eeco$e^ybHY_5q#H&U#+9@ z^O!IF4u!7Ef^_ZMOjiRl2d^iAlk6pm5%<%ZE;o2~MStC?TvzsETK!q=$EQEozy5t+ z6ZY>Ka?pavh0vcIDfp6 zHK)WKs-4_efsex(5J$w?mhj%Symwc$S8D)mP1I+nzc&2xHrjEz7(Hj=jo*u<^>9k> zu8H=p>MON=d2k=MNqsxQ-Xc_p-_DAhAX@8X9NrpdKi$1f@SbtP9 z^Cs!T=CnUrj_#^!Jte~*J=*t2M@i42Q$IqxPFI|$eTF&owX1vYbVdTXFaJ=meghp* z6}GxJiH{+jo0x+?0e!XAL1Tfs?XpGGXDNNUHl;(vKd!APZF%VN1GSa?eh2+_(y#hV z`@K5fVpvA)c;Y5gMlMBK8@`WZu#-Y@JG=lvT0SnJW3~J{xI^LcK(_7uc94m`;Bb* zBEKs=Z(ovH`?Z`edn&&V#{Y_|edx}#Pe00$3Ho2!gYe`>dzzgbG5m~Nkvz$eC0Q|C ztugOC9eCrbJu)?izG01P@9Fp#fwTWyyi@gibLIP7gM6qejP^!H;A46&ap6HkK2&>_3( zcxR66ZoRW4+WYz)eey$TYq+V4qxX_rPr~myk05?+wD+@N@9tJ&yy(15@-?>1!p7l3F#1-xDa7?v#%kewc8^1Gr zN(BGT-jn_db+5xWbfsUCP`Vc&^d+a})GiOTTNpkn@F2zj~&| z_j4okw~qdJ#`(Dhj(R4__?;}jMEhfXy;-H$MgMqij`}RV&kHPHA_h<^U4)!S06%n; z^F4RnUUgcA@A(bk5FMJk7W2?zzXys9w*fopkJ;A$-F5pGJBE+@{_kgmx0&!HvZmt( z^apaMs|o#a3;JUv`r{60OnPHB@qg(JbVVwTiM_0PLz3-_jouiMQ*V6XYXj&FWWoPq z?oHsUuFm}b?_IJ13JQudXp;~S5UjQ?fZFCJL2+qor_wr8+Gb-db}Y3Woobt4K$O(V zRcA6&?XU@$tF08Zw$p_mDr&ljbeXZ8a+lmJL|dt}<_enM`*Y6soBPe>2I>4}e*ZtO zSGf0nmvf%;oM$`Fd7kGaE=3+8JBIw2?(Y=(#PwqyS8vSsx9!&(zP5+_nEBd1j@~%m z-?m?G_}U)wW9GE&x5r0X!_>he-Wn!>o{6*HrFG1@e}M)Uf)~mE>+Jd^h}`~X&`GA2fZ`IdnVcVsZZ5OZ9^_=<7iL(|_guK2nn@C(dyf*EUIZ;aB|LAKqz8 zg6j#;sK=j6w^2jT^?|IKhkQAsAR1sV&KLichd*sxtDZ6YD>K3MZ0OeAiT8=NXw?icGdJaz518IgbiCr+UKp>qhd;A#1Fx)SlJn z8BZSHoRL|jl1I$tQl9bq=IV*%@yo~rXP64!r$*yr8->n5)+A>l*RO|fpq+FrJarNL ziXM$4=XJhOq5^)MX8CoA;n%{v{Q8C4M&MUuNuq*&rn&s;`<;S56i@$dcHTmN+kSra zwPpC#_j_2|$Kls`{TApJtM9khw&mAs{BwSpZ0~!t_{`S-j;^q6j4ZcL?7sNp zOk(iLJ|Wt>B$`-)u8N!*{R1&XrPAGgo2nFk#J>5|MLE1(8p(|H*)-mM{tFX_^K%?q zLHPtd*udgt@wNC{ye(drj;n;Xt537MybRv1bc*{M$V(8fFN3#>m)Fl};#$J+b|AL< z_wTgzqF0Ph68)onP!F$v4_@>0xbdm3&-$7zu6p5X?Q`}*>wWO`75L7}#=+0D+s4@p zb=Hq=Y#YPR=(4{-ws@|CYbcIda(ZOyk1`D$Ns{Z%gw z`K!bOF26S7tM&Pu%(`r)|6P|)hx}FkcZd6{%(|<=|E|l2L;foF-QoP^_stIHvHpif z;<5a+;BVLe-L8F$W7iVPmCG}e^YM(EZ+Xv!IXpw0>%}h5c>J>5oHv(^7r~BR-+&z* z9P3=Hn6=X+ zwghs(dK9(>vRbhg%XQ8!e#j&;x`y>?Q?YYs z6Y;jy#MswBQ!V%-MNidy`p*Mw6ph`oXrM7%6KgEyZybMR{6+X{)^D3TwFMezJR>}m zJEb$%yfXz&yR>mU`cnSYWEADI^3+>%2J4^KEQj=j0*^`P?xox=Vx)PPg1m^3yY@@|K6eB}3; zNbGrH5^uP+qr zobh(keKP`0_s$47tp|8!y6jNw=^pyoJ;vF$bH zla#Zj9eM41#ejS|3EE9ER^_eya=w@MVDF7=f7$!Qc zUHR=k*?b3-=ji6(DyLw69(mMFNTPMAapU5%iTtU~ut?U!@`E%G< zmn-*zIl({E--}*Z?1Ve7;E#CD&b3F^t}AnjTIIjDb-rv2x1S#kzU`jc4&zfk2H(T= zjK;4zkgDhCZ)fCr_1;%3OE6YH0>19c!I$>L{Qf@q7q24s!e2iuiQTE%1>Ke44H=-C z1u1MZ4{w{nTODh(IQUZB{Tf#W5YMvjS# zt;m4Yhc9nk&G$9PfNpq(Soh9dv&dn^=hlS`(0;FSJX5mwn5#9!=BD9`+A(YTtMHG_ zqun&`T><|SAO9kGe&V|1+nr!*qf^k@gWPZ6FNr*O`snTJCUafS z?c&_7D*9~UUF8aP!>i&^#b|1NT^n?VY*0IAZrvZ|(d_M*_z`>Uc+dOa-AinLj}uyV zC7;EC@VXwSIJS3L*&N0C??P^jAkjYI%gP9S~;!w*6g|K)?YLHInDWB(yk|4lbenwTjgI3nwateWb9UCtoF#H zr~PuH2;Yfu!WLydvC%DqcV8y8_Uf=jC@kvM~zyFJGwFRIh)wS(G_9(ug z7g?ZM{mO+@KD}L!d2?WMD}>)c@c21&eF|C~H^OtW8PxWR%-J=>8D1S2{o;$*5B`4C zukL^L?ZJ!cX;;3+Ue?A_0wHu#xN|8w>1m^rih((@GY#xv;4Xh#XHNUqqh8)eDE5m> za^%89Z~;CGefU(JBCkF}0KQf&6z}|SX2GVlhHU>@aFxF%i`^>|ZCT!Nf6Lc2*5YE%`7UjZwdV?W zx>KK8*N7$^;BtUVWANYi#?x--FIzv(s~K9;p#81!W<0FX7Q~Th(!FX|x;8+&<+S_n zteu+48BSt5M!>)9lqxbllcU0h$IwUuLQjik_(8k>p985*Ofqr5Ta|D6Vh z8=zU zvv~IU^v>$Gzt4akC;Dm9or4D79OOHHJGZ`%^ukZi7;H=MetbNC@Yf6cPBMp;uCF^W z-tw;Wz!<}q#D1V3;?(Z(%h9RuTp@qTw-Y}r->w!sd?-)8o%T~@uZo8*a$){;9(km? z8SjkE%A*9bNHR%ssCz!P7rx12eDKBP7ex=?W84i+d!gfQaH(_XyNp~aCeKJR)AF{? zYM(Q7zL(46(2^(X(luFGw_ADb$l5Ze@>fHCIodMo804C4t~m1Mhn!VxapAV-_rbdU zq$A{Od9qjbxNL{#+%b#(57pT7=S$2QbmCCHzT#?<*E8mYjCmDs6Ohf0960$P^?bmk z;y{$IP{y?qt|j??C46%gwW{@+%)UW0ddoVa8az>SQzj*KXfKF4{W!#l!3#Z@hJkw~9P``R}0R_2n0OXX_ZhpUpKl zYYcZSSOnhy_vwPW=vaLpmsPpLER&}XH8kQcvs#CfUi=kqe(zw@m&*~_aK1A2dM zWrwq}obTTKx!fNz7yfi~rmY-5jrIu>=;$~yIfAd$d1z*I)9B`xlPPoy zc8X~8#oLYymov~y*1zS-9(Qa9-fPG9Q|7@N&sAnTS^UdRNsyQMKVhp#zV1Z-T3WGq z_U32c-* zl~ddWZqw6{pR9%UQqSW7at|BH*Gy5fO8%+(4ksFEP;B2=#gIlvvA&2GRb%7SP=|6} zdpFN?ghTC5j|sOwGohe8&ibk2d@py?`fTj@kNxiXhyT$X)6aAG<4{ZCzRKXZ{=2GF z-=TQlH{Ysk-w<@7s>v|ebQ<+6PUml8``{kpESo0r{Y?JOY9D-qeK_WE(_GGTmd$e^ zpDtfj5sRyuO7a^w&a!^v&C}qqi2+kXIysJKsYSV2pJl4cC;kh>o>-KX7H6?WY2)|pn-sD~voVxxdzi;LG&F*#Je$eetKJczL`GW_# zZsl_{pEvV4mVSM-5FcH|*dmOLdqq{5^aIHAHspDzD${!p>y`V6e;FixvX%JBwZyj_ z;T-FhNahbs(8%2K`^7VTGZ(h^U+}5+*Dn2Zd*95{_C56~OC=x2}m31E{1;oTB+(I^|++EQ%n;y&=v)X68k2aa_IDdB$r#z#)GTPT8dN>Oh-W{F<@FerXgAYM=uc@(N;Se2MA$;ed zgNTdoAv!pR`GpP=(12*cql1h6&xsCZ{eMfR|x*Lb%N8q0tN5Q{z9? zo}TpS_QdGZ_0vf{J$fSClOjo~?N&msgbi-GPcY#N; zZY0@~Z`_B;r&^V@2VO6~(~aeNmwx`Y=HVsa$!nkd@4~YqmoDPQj~9-WDHhMzc24Xp z^IiVEaO|&r*C+D56knWYS2WJD_TFo6yZJaRA!AQmRVjO-V3<7-e@Z%|82h1wzftWr zU*TlZdB^fMu6^(x>nnP00`gySy%M^(luu}1c0dQ$rPGYQMJ~%9*e$t?%vK(T^3$)M zgPzp-iMIN9_MB6&^-Hkz@$ns`y~!u>ob(0bJRiS8-y23alPIf%f`n?_l2c^66*WuJ%%p z>CuB4XB)6FHsy<5&Aw|5ew-He<+Y~1lvtelEfK~?yw>=^wo>e+S;UmX`}n}lj9viE z`C<;%mp|yn9JGF-)p~Y{V!Zo*zS7^iBqYbUmW}KaEqfu>0$El55hqv*duZV0f01W>%iT9gC$IcUjsqoyvE%4Uhgm(4o*+(ywI}0|be?HB-yw^bA@l-gv zO8sMt==nzAY+%1#@dagdipLp4t-D}s`dRRH3(r7vskMBz+UK<|JPY3O=J4NuwW`pr zgLf-W`1L9O-^}3(XqCB0-h>Z{@o8-(p3xYWGe*U$jXK>~(7+rhM?B1!tKpqWC)}?X z#Q1C{la&3|!u|WetvjDfL=&`C9uBmYzy6i|TA;a|W!(r$VwybGRm zuZzEUV?pS_Vjb=H7lHI4rqJlXxt zg4mxG2g>u>!&m?ESId`&-;8ltJb89(C-E_7gQoyvlO0=#9ShIR4PeU(pF?$yZX~Z9 zn0N8K@S5Pa{0WnVTiW&J?oH)3(Whu)96aN1LwW0J-t4mLdO7j{i+D zXAZLHC#Md!{ruUo`*-6L(K?y>R>TbzMc0ArVe>RzaSYCc2=kQUdj<1N%@KSn))olK z|AsD>AJp#$l8ztt8`_Zn?P3>JokQ)xs!zW^e1`GyWc}fx^COu(*cFc-L2k~ZKWJU~ zOetiBV%^iogYFuxkG>q;c?G(2etV)dfKCmfQ$y|2p9y%YXUNxB1iYSK(e=Z^SHs8Q z`Daz1$3H&zx;vhrJDyyBRRA3SPx#m-kFX!8IjWl!nH#4@jcCEp19Y^C>*aMp_6;}O z>ECnn=;1Dd+wA@!a`dJ8rI(vM-pX<4E9gbn8X7M*GE}~@7G$XQ&~_0Eq50plgm@`u zcC==kk;B>dCpd@tkVSgG&V64pV-@cQs6X`>@0aub?j`sGJI;*;CU|}{ySKQ}X@0o@ zI*W(Cy0eZ?jY%}qJ|okXi(hX%>dzm~WPEwVzx@aKilXavlgjRIRt&3rtI{uXWv@zV*G=RJkPz40f#oJ+EE;*N=AE^EIxl?La_1Xe&A|obs}plXW+Zi)7{7-t*=xcaU8N&>xd6S=frOA)BQ?xehGZ6 z=k_jJJZJDiXXQq066ErP?E6lv2>VO>;k7(pL+n@2BxuIOJr%_ER8#Zr^)rY;Y})y+ zhmN$R)$b&oT~OHHLSH?+*F$XCL;NX5<+-DGuIr`0P@u3iJrs-L?Nuw5svx!&{?_ML z6f?!=3O>!4eK7;yJEZFR&?IiC=3Q_~*! zli=)=)bljCQNSv>tvzhjWK?Xad4_S>`L(c@gCoU2+|8I5FRP!UedGhp&dLaT*axOK zD;+*-vH9*2{+CUeL#$l%4dB+bE#O>hbbovL{Q)z68+&+89vpnhhl8hG99aEl*Y7j5 zeyM?#(NCPQf5b;c6?fHh^saS9PEo7s zk15tb?=-sbEdqA^UJRU%{^>~DlBv$cz08lT9m<|9u-G_L&O1~Lz1DPFunBI$Cb*GU z5sklTKKxSH-wFLsqhG;Mae=eoc_+|X90+v2z?{Nw$V; z4z*W*>wI{~+7IUm2hfwT?YDsUo51^x@DXzpztz@c6b=jDD6+T!mU3Vay`|m@?a=0X zir|M0*k5(far0%-bI9XFx9{+5?bHTqf5nNJ(0A!y`Da41vuQg)KjQJOZx6Jk9?<&M z*z`NRwa>43Pd54@>=CVf7*{3^oU+-Iz?@`!^1JWFeqV}xL`<5gB`N>PUTiLndFhSw zGlS4jiuJgDFI!>fW%*6>GfC!l8nJFY$cP@|mK4*LpsrjGYqmkwD54|5X=*n&(cks?)Mbo*Jvef?fce{tF{G+2pE_{NboU0=fe=b1OJ-Hpgm za}FlYqc4X`ICqLWRX6aQKyhb(XjJFuw_De#jT@L7;qhyMVC!qVvm$U3 zd@!az2K@F+P2$<9*D#f~LS=ScSR5GB`d-@k{Wa`8gih|f=k0sesr|%!C)3M0@u~+< zOB;%DlRg^H*bde@ng08n%&QAEf7CK${=NxLH~HAWc(9iJsQcKDTF8DBF#Y}- z@F&`8jAU*nS5M$?{i1d(U5|==c?4K;`&VrNy?-^eB=r3tdKz3^?8ntBzZ%r}Lb^Q)6V+_nX4b z`vS<~ilf#08^fX2DdEVytHa^e)dNlY8^^3}l@6T3y%w&eD&Q-VGpRFABp(B@mx=vV zOko!^--7+xf(`^{xGsKQFL*7CeKczt(&nmUO&<% zzii@q`nZ{X(TCELmvCKpk?%(Q_wu&}+7igmIC4}lHX;{N$R{If?%|#5i5KG;(V_HE ze4+GjNmOTmoL7hM1lgiBp>V3TLnC#OyO1+`;G4&Zz0mh5$RnMg17Ozb1(`RzyEw<tgC37KukxwTKUJAh7Y9pf*YxZU6Q9NB>&KliBjCNNk^KgRr zGd8o43trr|jqmYjLa_qb+ST@+#{3W7IN@!L@!vJZq7l}Mdu;uy;OFSaoDJj3pCtD;w7uCT`5))|_xRq0tm-0equD`rhmkMvUGSrv zQ`8YO@l|b$-fY|W&frt{8QFh0Guru2)c4H#(($8sF?1%T%;utNPj^q)>^B)1RXaZ; zKYxmNh%_>AEBHq@8#{ZEYsW6Ze%-^hZfH$;e9vJct#S%mU9_ut9pVYiEANWVH^CR$*H^CLBJ}GT+K@h0{=hEiM-kYrwIQp=#q&;6p#$BK&)_;lowFYu4tS z8~q%3m;MM$v3jEcz0rW)kbNrOV>$6t`aT)G5yy54PPaO_{#NuDday(BTh7GjLfY|c zXM9c}fqXDB2pv_){BMCzy?L7K&i`W9eqDmynmhlS-1*lW?q+`S;b$b8 zSoO&9X(C@+`L9`>^smA%G?AFi{9{|hYXft|Lp}e@{MJ^@mEJY;do4ZzcxpTQooV<< zaksmskgJS6wwLe4SAYHG-p@Vy$A{Ov_{ZsEfB(lp#b={y_LfEF4&EPFS#R_X`4`B# za`dz0|7PAzqf6oo19Q8t;S-&d!j=qUx2>ku#WzmRw52bguWLmA(EY-yxl_RJ(sAL| zGvbsjc^dd70$?dW^SJu|Ed|nW{{y&ej_3*s*!AFh2S6%Sj+K3bF z;u+aU@)g}Joxpf|;O8V`NX}>Mj3;&8uyMa6yX_9&SXGlkI&-9PR=mqNIX5IP9m6L( z>aDKc;p*xg($yZnc(QEOf&A~={gKkxADG)A9XggVp-lue9$>MZBa zvpbuyo2*^n#v3COt!(vji0$O2pdOjEaLwa%fHN?h<}KNAB)(;VWX# z74tWazcT(J{59)$$16SXb2mPoXWiUg>0$IQb@lCBKtFT&eX&CwV(Dqows=;0dLFcO z2mLMaJ->Q{=RXHs%;VV;ef~A%>^$_@i9Ro%#jfJWA0xa+T>FlO$7>Y-zN7J}8f3KH zqqOvX%|J(}_E)M&pjdYKw7onBFNg837$-K?df8ZCV2j3ZM zKJyCCbn}es4;&iDGkNH6BX+C${#V8UojiFWbmE;aVQT|;`TTZ{|`KR2iV{pg&TH`1W?DKhW*L`i4xBR?!1GFw*R#6T;Ji?rcu9Dj~ zd}H#FqKm(z`I?rcxfFO34er+UO3|ddW@T>uykXY*zOx^{G}+Zz?wJ((&|5~{hV1^? z3{#UUdw!GRma%cH+&ayfT?j3D^JDzW!2O&{XN9g@=|-+><17S^-@WJV$n)F*#`rn- zJT7^7vomzYMG9G{z5}8maJm$H;9Gr4{BOtS*22UNR~`a7@k!}C>6{?_@cZI`3r_-g zD(UB2!Zma$p1W>@_68f_TWEf8a8!GWXHDExV=yXT=~szcs2k%vA-dg58@==^-|_!V zF8v^KZlkeHbH;@%8BDo)ZLpY{@M?8Bkv(g1_uk<i#NrWZ%YqyFL5)x%_(d@M)@|R&3-{Wu1(&`9S1)owypYWSb>}{p z7IJ=Dxoc|HQF~!xw7S@5!})k(hjR0LwM#C8r+n^^q529X(CIs4v*%4>7rSTN+Vdb~ zQ+<=R4v+M{;Vs|(qVkimgUiudk^w(+fMb$laKbu#NA-@fXlgWZTJCdy{vjHr=Z`yva^eJ6#o^rzS8yb zKd+%3`9&Ag&Q!0R2o`t3RsME9 z|JV83>9y^ATkRBmbqF3me$I38GmkaZ>ItFz?S#t>z8}oNkH4L>+;$9}JM!XrM|GKP zXI;*?{Oyc(+cEfYO7p{WnQiA5Gp;P2{q1Ck3o!Fu&AdNRnXjGKtAAnVYYFYlgVwxx zS3B5)7l}S}Mo)nGe~tFanSWiwH>CZCmm2ot{}}CLCL5Z3pK3yz>-GDcVf)#l|Nkn> zw9U&y|A#n(S@~w|Q}MTj3WvpqCpw|ky~r?lz_Z_^Bdb}bYj5Tx?9-`EuyY$WnD$d= zR3OLE4_m_pty_sV+*;@CE5xT-uuS$bHd&+gzMMlRv1Uqdr)}D`eo@x<@JC}Lge?`> z`H^kxC1C5Mx9c70P`kGs-;3Po#NWVs!;g|LCO z0$4rxQnm2;7RGfCaNdWkZ6p8rHss|a%-d2kH#-`cGs$3N0JdidZFuYZaBSY+$ybSw z0bG?+i_h#+Y|!%-|7Scn*w#pVaThW_^$2#xLhRaBU?e9{`z2aCryd7}r+}fQ06(6M zHC=b>kv6l(v)1_d);mt6sRbszJpNSnzOLupwZLrlL{#UcG&TqP%Fc|pKws>m$=*b6 z^RD*Ig0TYLGqx%AQ&)@Lwfh39)hpeRye^W7?+-+4wlkNtF1*0Kwc6RS75l!MHDV9X zsRpRQ?H20%g3I;LXu-0x=g1dSU2N-i+)Z7THN;_TJ9FOt`8DLx{P5Cf_p&8(YQv%a zYUZYJ+2lD_@H~Fjd(*_e9N>D2cT8LhaQsX$I@-J7dnezM?9YgPzs1_%j%5vV4miP; zpGDWtrwyGeto_B*tB@-07^W)3dyT9ZOt^b4d4|XZ|Pa z{_D=lSAp&MNAcqnI4h;=4!r8De35H92l2oF@ALh@=L0Ku)6Q0dvjXEoQ{0XAbF?1E zceZ{t^WJ$1K2PSlyR8{m;W6NsjVkybCjR;^a*a!Fnf|@v;^NlA0_XcW3uY^LQH>1w z<+5!Wf1GLayT@yj@fOma+TBcBhBkmJeqA8?j7J--;B+Cd;6K~ygrJScF|={_)`7MX z-q)Odk~tLZ`S;7Vmb$jWSn9sGKA&OsGjS&V^G{{hPKDRbhS#(|fUJrVZ?f+I_a!NDiGSyQCpvxj+BHmu*qEk@3$#*bvgN#u0&T)-ax^-iW_Mx=f8`>NXe9w{Q1 zrMSK16!JshrQi+7^JVZha;apI-RpXqIWu+f81pma9j?Y_-2gt*@XF>JoXoA{6fQv@ zY{L#%MvPDyI$#^`o?YZ*HZBru%;juk;swYn=FrsB<=wzCCv#45p!MoQU)g{4CTCwc zd;V%`Ic*WQbfNK)E63dxHO+Mn-FbL$!NE)E_dF-FNoSrlkB?q@%Zh=z zQ0cEq>MX7_zIJeR7PvYGT$Oyv<}Z%=l#{t1`YHL_;m?ito?GBPw}ALip3~YzXB5{n zSEHGG`K5#SR}`NiTQ4)tog?-N{Btxo&7C9BmgWeZ?BVDbyq-rq$ECz`NFQj0qEcKM8fTERLCSf{(NPB|9VpLwv( z8V>6(JXm?hz&hnGfR+80y^jC`sP?y4t#VttZx&)VPrM$ z7+A0T3t;`w@nP+z?OZwVX<(H;l&zmso*3)q2-kAg%ZFO5Km4jwqz_Ne`os5Q^Biz8 z-TmyJvG%6N6G_;{!(NwSl{aCh$p4p4DP}p)|5NNK#iOL=W5c2g!()Q2 zT{Z0gA)A*X+k5}O*-FS<)oQrQmE)g9)?y1@bge9ht@S?rP{m7N>U*od@*5q$2J%N)2 zsr`1X7w1#@^s+Go5z-Tlrw z_B*wQYHb%gk6%NtZ3v9&mmT@Jf4pJfXSduia3F9}e}vfPwZN$P)p;ZFqH)wcIfc3> zr?z*Oj&JYX0zRR!t3+c(ALZWPaPMQ>yN-LtW*VY7Ykw7(_2u$%tuKp)tuIqO*nQwO z%{*v7aLH)pjoi}Uy%ys9{lzS^oxANICgn`!+Kh|R}eui7MC zlc*n2T4mc^;kJ9D+wM*I+ufYgF8Zo1MU9ZIv9vYbZ3}x#ur6gyqt9iH`P;fDr>%0e zRY6xousLzpa{_wth)l zee~%gd*z{NJeKl2?gZw`DbNIE>v2#%Awpn98mt2~^?O8c(r)mn#+Fg4BKTtoF zzJ4yH4}K5p=UTU)>&)l+CD-Kd=hWl$vq`wQo;h1sl~Ej(cruL~kUZ^q9GqeI**J#+ z>in}`Prco)$DwV>#>eo%JObY#BkPMJ?TaQVlOe=*UO(UExO@r z*zw3uWRS_tOkg*fHP;s68lxNQkDf#peITov(InmiC<3Eu7N_&3UME&Phv)_Px+Ggd`OOj8Q4-8&- zG4Ws0jb1#4;ytYor^xtlBwyY~uIuah^w%CYAAkf#0=`l`*M;VKQa|GStM9!C!G?%ukuWX9_UH^(XV2jL}OFWh_p{Dt0F)0ROn%R`&4L4e!BDn=u`3l>shO+CeJqX z=K<=qCD8xd(4z;)@mrly6$3E^-KAH?EnCv)Q*dGEl}|stwwgHr z_q2B+^s4ypb;OhS=~cWd{2QMVJd|V(ABKjlZ$mjK;n*^Mi;kN(TjXPWmmMa3sC+P+ zPng|rNL}D$3ja2e3A0u$sEa_iq8aTQif#&H@89)Sn?p>!)!%M@m12e6n9(Kl;q8<3 zxP2YlUp8KJ{rE`cd}3M3s8uL`qxSN&-j)2h^(`;9!p5eYck`Rp*HQ$%FrI7FR}r=$ z{hSgcCXiT;4Z&0TH(}EqMpv`RN6oD4cn{%ImVdbfTkLRXcs(=0K~4E5=1KRN_z|9gPv3-3tt_$is|NpJIQ)}b`2W*`zoOW{ zpMWMk_<#F91pn7h0RA;O@IOv`x*z_Z=fK}jE}QUw!tmD=8T{WxEaKssl416j@c(&Y z7!wx+h>Zwjdaemj7P@ebVlEC=1gy;DIsaUI%zfq{^7o*z%lve#I;`1x zNIm3$^iuciH>xYCn9!OMBm3|3#_Q5|S6h%8sUiIGVY9Y*MC14E33}(#J?qV9V~Ls1 zdVKrdd_M2ar|RJ;=U9BJwagGdnt1BJ%C3bfwMQFj9~=zxSJ2MBwY%RPjJ3RpANb?! z*L2By&8}62Lx-}<-Zl~{O@B-9{hdqmOmdrzJL(@h2Zac`s;XvSSsxq9zF1U zBlTew4?GH;g`7089PA}ds0Vi8rOffpMYVEfiBqudIpQgwD|4c2mn|8%gBaC8WUPaX zZ$uUsadvHTl9T!LZN$Y)lB{)N;{QGL+smg1_Xk|Kwf>Q8(!ak5{*M1$_|JV8_)j_x z{Otz+S^7!TFz?V%1#7j&qcyD!N2~5rzF?_**3gdKLn)0tLCsHNk6ZxWuw@mmc{%m4 z6qnJ1-2Z%&_A10f=&Mj5`ufI!wuYc$sjU8&JyXx#U-|u)MOSSYaBFV5^y2yg4*Zqn zmtXqmr6h;mPZZue-v!=zIq*IMywyH@T}C z6I>nGSAAw=f9)b?CY+OrAuy3dSrR;r)c8vJ{D!spd$kG&kPPlU^Y&=c9;CFF|N(ng%VD|xo|u(Pt5??W&E zXNlnBdI#+jL^dIGH2eOY%xxvM+1F@SG3cfpey`%X+TAFa*gq0JgoAoM6WH@1^>x%) zsk-m7KZG~^R&0mCAvWG7_3H#|8?edJ;azSn$hnP-0M40}d2VxKRK%>ahVa%W`{n3j*x_)Gdj?6EcRx$I(R zLCLblTfRN-j+ZL~C$HGV86qVm)I|QJrJ3b!JGJoRCegbKtH!8&*gjx2?K8%Qfwd1< zbx(bZANzoF*nQyi?h8iyy)-6%-b-6O(9Pfki}Oy}D(0EJv@z^DZHN~7p@}7oXXz;? zK@)}jTh7y%3j2%sgcfdTXG{m25_1N1A!9o53-}sd>!uIw_lg%JzfF!j{=o$LoSfFS zL?i2jrO5e9k@Lv=^vzXsd#_{fPO`lg`}({zj`}OD8pnr$J4s(!^UOSfHtK<~2^(bkWXTid zTSj)C<$uo!<%P2gd*@k)7;oU046y4dI|i=~VtF{+i5(Q(`Y<`L%vp-LQM`r5tU1Cy zjTG=o?>H>4Wpue3nkrxw-unqp*EBZqxi5|B>kI#u#TzcH* z(&IMhaoBa29z_!lvPONrK%eSwJ8kyTMkzd@Hn-={_;$C=?Kw2Q-EC9xGwE@KG1()E zIc9J9i5|v$02#KCxp>UbVldi`9i!{r*J8_EgAI(&xOYBld~jb4&B?||-%4H(b71`v z*sdSf9`TUtVjdw?~;JoEtTE?||6vh^7X znD;DPq2&x&nNyb;92w+z_W}qumz9c5 z1XI5GoOJ^8IhpxPH|3wp4~_s=y2&?}F0Q<})ETJ>=0W*GUEosZfho^edLK#&0RQjU-h|vIdr`w_OyAvF!nw3Srq%O`3%LL;8Szpk4qUOSIw+f$8x@a zuNIrbKfk@Q9Ns<=dqwtw^4`cDj7o2KdWF~-@{u?@2^%v7Pnmp9Y?t^hXRgNjKKu#} zXX2!GMdmiSaY+f}n(VXP%!%~UBH9%HXx*lJDZVe}n$9^%x!25@CtN?k?}r@c$u;~9 zm!qtkskt=RRKQgu!|49+l6iwoh>x{XwS`({NBoVR4eIj?2a_D zNiwboIj!?MN>|x48>D9wzxI|>-nfkYKp)!k6ihnPAtnA|+-o$~J{TI{=N|e`(|;lTn^;NYu-dTo zI6^VCAzb}{cBJ3DSjJpevUaQAf|2? zG$y*L1&5otwwS)w5U2NN`qKBqIepH}>C^aDY5M?e+qlFp@9g4xE`Lq)@z*Tc6kmD& zHX>8}z8kGK>^SXut%Lg^{5Ao6AHino=Fy-38PSh^d+mAt3cKFVo;Shz?g{BF&zGup zHdD8*So?Iy#YMCohW8TF(1-Yg>gZGc7CkeleT8Y_HEM5lD3?fQkvY^ea^oUrMl!Jn zy!p6dzz?70JNH_VWBjwJ)0nHGNXEb3UrwB3ZoZ(#CVued?OgP2A@eq5FE3)f!Cvr? zoy_lc_VM>(d-Py?$e!sFkD#l;^MV6USlj-<_ppJP@9MYl3o#D6-(h1)t^D=uF6&=D zzk9E(Ne;?Rv3a$_;W!akPvjXd24j`x0YBviA5D7nQ^I=aov~Se zk?bh>U_{&4Os`i*im+c^x3+X~_cRA(BxGCJ!5 z>M3&ea2-Be#XTrzp`#XE+8m7jD>&T*y$PqAh`}wtzrx}anGvut3#Pu*Dq<9*zEoavq`47jwpU z)w!b2tbCJf(|SqrLOx&F89FaMjLzABoY%T@!_mM>VjLEDJpA@*&iO{pi{7eqmimJC zTY6KSPxy8?tymdG9O~Qzz8Ce!n)b;cGSh3XPwnA1RC@vWJTG(43OG)CkwxrxH;;?H z!n^X*t2Ui{VhQAvk;~+xZFtyOxk|s`w-E7WdrTg}2cse4#fIa~!l?Ho-;srF-Qqvs zVefMNQuemDvsc)}e3ii~s(mmGUO~rXrj$ERrl5r+G&252tSfo1%6(7ukhbvNO832a zyr(&i@SfyBoH?(<#*)lJxlITm*SesGI`-Fh18aG+>RLv2MlU4qo3*W;SNnQizLL23 zk84j$uJEkJ`45jDX)6T}UGnw0&rcy|T)Jo8qQG2mOwE8m{}$G;+N)L@W{(^G_P3+! zZ41clp}!VlEQJRz2I&KgXEJzLbH0sxy8V1R9&Caq3OK8AD>`HsK1BI5L|5{~NsfvC zr-q%`YuG<1U|(>Rl}+nCJWX@))PfGJ08h=xBAW+d^AG$wF`25G+c2K>K5^yMbylXX z0AAtMj01fueEjuwZ?;9o4Sd(bmByp~7XxdW`=1 zC(jl+7wdUs?SgXR^Q8;ed!~jH=RP}4_d3vl*<WBF)eKG=ggdo1zK=!nh4X>LMKKZ5AAcin zOiubwTR2nLm0$Hb2jTEpMt<$qnsfyD<-Pl3-u2lpJIW7--u2zA{Y^bGb4HzoQ}{m{ znpchg3;7g1P3BX0ksMDpa;6ab@{7k?S)Oc+%>B9>H)Gb9H8$RJ2EM9y#%Aj^Bv?taE~`zkx19vvGdw z`Cs$&ujh+Z(-}|yJVK7H*c=IdfPT`M|s~i zpL+Ox`R}#Pc#Up%i4a#H>B9V1vd3RWM|g^`+3x`!Cy9roqHFt z4DzYz`wV@@<~9C1Vp(>vcQOlov1>JcUw&_2&%No`!isIdmW}Z#UpjuLl|O;UcO7AXfm5AHbq zvMu#D=!K$zr_6oL5o7n?pN8y9Vt=Nvy|f;Aj5ACp7hqe$|8Z4Uvq@(n#N zx?U@|`7XExZ|QA;_EKO>Kr^b3=h3a@*%PBzON-&y`N&SKb3e$Z$Is&BFOXX&yKJ0q z?cngw@UvSFpk%7}Ia?1v`Alj`f1>I-!b;U zcRJWV(%B5s{m++Mo(I3C7G8WQ`WRhNfldxDTQp|_v~KJsXe51&Bj3?J)z_d7?@&Fn z=bVDpZsd$~N&*=4xz~I~c0S9efuT;m`pC{70Yh1M;Hj|W4lu}9Si@eJ`+^1-B>tzKl?L+CpB!TNw{2DOZ5P|J8mpt!Zqg=wt| zllGisL&?VRc=5x~MZLQQtr9QBFSGV5V|aR4O%hKQ+1z*hMMlRP@kG*Vmjn6 za>R?H(8~tL!G6_cjKfQMR(6AM{BzE^oy^)Ug?^Hq*90DV*;hzNcFt!#Z1ztAX8%O{ z5~?wjq&EI;-g{cS2_H+w$`>VBtu|Va*F(?J&v*4KbmH-lrCk?((KNIzdtgXDYX0UE zE8m9f+T`E?M=x@x51n_AwscORu_=M=>fOX%vR@;8A{_n$ye*ph zBA>EfKR~}vXNqQ99LY}|iY@yKaCG^*;7Dg%XiP7{D|_+tXunYQ>y?a2`pV`rgkz60 zrWA6zi!r6IVO)%5C{NeLbC0VJm%C$8e1^uN^B6`m4!0EzQ zU^+fA2l@p!TK76rWQ#_2&c>e5yvR1)&3Z7zbv>&!nC^#|?*?dDbzx58J$)`Jv+|>k z@re%A9=0Rx*;w2w-bcL#o@)-WUZR}<&pX`L+OP`UjvsGs6YD}`)`AY~YA5nRVr;#$ z*R799eUHnDm8=7{dSJ7>VW0EjpWY^?Nq)Iq;7GDu|2%&}E*KZe*Uc z?!Fs;acVq%7wjCxukRv;W0~v`;!L!+BD-WGemecG<5RM27kiTq-~T}0vPTq8atARj zX1_6PX;RnY*fT|X9$TeZwhsD3HqI{MTpT{_Ix84^&zpm79a?LGL;0X&Po>6V`_aDe zJ#73rcr!NZSdHsFvF`~d&_;4>#MJ!t@G%3QdoFzp;l#`#emv@LtOgDvD}ke)96PN~ zly}3v#D(7^c1Y`zMRV+Wx{iE8y|V>dK=8`04ZsVAwiv_i^WWs`0O|nJR_#37me!mt zv{e&fJxF`^i&@DnPL1<+4x@7eF@CV;U{3w_#5#_5924U>siB3+&>ST9>Y(U z<>4pr>haSTz@2arQOyFz5#nBecf2;Q0O$U()zN1?efqC?d~$)yCoeEgWAC)s`bT|# zE1EcUC`NOzX*BywW7>mZ{9yRfSqDB*jV?4klDew7jqvtnGfG36*K>9BPf_TAIGrCrFK6@*B@UL!U z?Q}Eac7TVrQ^j`eT8d4UUg+*y^PIPDeRmL_2fvkD-pyxnDe|_FeI0D3-dbqTDe8Y3 zKGnXq_Rmyv$?DFc7<=sNwa5M+0qdJh*PwThk*Y-?J=nuLvgvzy#|ac*AB18V;uodY zQ;lkm&!v3wY^v5VcB9}-0p}KQA-I(9-;6x@j1Nx1*bR)kkwtL>BRSE)DErNW>2Y96 z(srD7)lP!`&c<$=Pkpx{_RtKD@ZFd>!*{KI^Wo=GU%!6*YzOCl{G=GGY{Pu`SugxB zX6a`?ev-V?lY^h{2tUG$@FP6=@N-$fnV{OATcM`{=wh)xp`&L{!wOuhx-MLSG1tMP5c7%n8LS| zS~m3-&4cEphj|g5>lwofC9(rUv8&)w%|#L#fNu;9)VehAGapPI4RCJ8&^#o8NBgJ= z?CvROaxzIT>S$|C^_MzjNbX#RT!ETz5>i~d7<+Js{~_fj>GmC35J{Vz>p7T^1&o7$d9wQlY=vC z%LKNWpMG<3Hi+ICiH^m48ppq>20k{oeC?ay!2;|Z`C=Vxi!{${W1NL9Z)$wq&;+#n zL=W$JF+!IxKDE`2{L*!gE}la+SpF<@<8Bn6rJSX#jEFI=AsIn`dSCmUCMM{5#(1gZ zjFX|QeSP@gN{9_AfMx}oXjh-+oknVJ;;Tqr>+JCSyKj7C$iMrNSJQj*hw=Z1tPe!v z$tQ0DzWLI)G#<%g@tt4R8F}pEIaI@<{Ycum)J3G&{@;ukh%yVsGo@=M(xpq>XYsGo4h4Nf`=Z#~>mdSJN zFxNEap6$Gd+(xZ2-|ssw#5-T`F0)3+p1)UzeE$>qM!7k6uTk?~Id}4hZz8T`GO;TS z#5YaG{z*<`ZwLF<-J@rpq&V9075t|Y;ZOXhS_gS&RLLJK|LJVvbM(DD-EVnXyom%rJjT5HcZ_=bn|Vb^6r#v0+Tif4wcReWo+BK7aC zVdK8FnZrL1o<8)dKR+uz4Sr#)UD!+FxfJ@JTweUq7e~(%K4%|`PsNN2pNj9%_bK30 z@f}>tc;iV-V~*fS#XkJa71>&nI?q6J;D%bOdGmAExCM|P~)SOMjkb}{!_ zvv-bh$E!NE%==#7n7#4NF#erv{DABX+38)#mVEPYHn1xHRCBQkouRs!wfLYLSf6We zQ+|i6-k|>fJIEr&x!E0;S08I5<0%6#o87T&1UFrhm*^eQXBqNx)i|d$iR_xpZ->0L zVKj@Z5?;P8yzpH#d;7Aw0pVrUvNG15wFB=Ix%-Er0Uuu0gQW_cc7Hb)$UemY&>P5T9)9AYagvji2Lr>(2?AeB>GB^14kx52?Nqz0TssvLE8BJYVNZv}5nPNteOTB;ptD7WyNJsGF@z0t&;Q1sqH=l)Tm zM^C0Jzqo~Z0@xH?H$y`aVw#y>WX--x=-^!RMFLupe@Fc%8}aiXi&FkMZHr_&YS0(l zSKUp?D#>p{D~-?!I2En59(LDO(4DDi2tQN+OX9{zCcc7az~3-?#|K-4@i+cvpzRC% zC83QT_@Q?#u;ke8cc4>K;;|c{Z)hcT6Q67OT)}56{%^)7yK6DylP|yfdirJ!CLg2d z{E8~WQ?kBSuNQe8bzP-1yIk((D!B0nb3Cl`=To}`7}NYtyKr`c^WE~P892#TVH|#({f^om9?lZ>t&yR_|QOG?zJoPT&u}*?Sots?mWBp+oP;qo3|cJjT_%$a zjK+2=(z#Wf`{z3^`-jLt*|>G$b?*H$x!(j-55BQgC-Gz_H%2a#4q&+JmD_4Jc#D{-mLTWzq z&AC{nfAD8~YsdwiE7HT9q`f&=K6Q>CE?^$=tq}7!p&MEdEWO~PBoJslXkaNZzCG2t zm5jHr_~mIy>^s1tdbE<|ee_R`o~d!F{tu$R`*>I9mDc3Q)Sttfsz+^P>2-WUQ>k0| zgszM}=l!H_e8y+QxU`SHfw@`5d_NDrlzyN6OulbW?mPPZIp+6y=9hDvR|NR2F?TZ$ zcQD=q__?J!W@!!>Z<6t9{x`X_FJ1~l`+k}Hk3M{Bensc3DfShSCly6JeRf_!jZYk#}~W}^s}0GwZ79{jkSMNM@ajE*jGNjr~%$j{^vm3a{hAV z>+63w_F8|QYu#MiN`G6Ofv0-OeJcGCa1gt#ehWC8Lq16DsR(Y#1<40}*IzHRsePqB zaCDHdT}@7CKjW>Wmf+KjPyV2|&M-D~q4SZmG&;+Nvte^s39n(V^elwVXkYr*tBGsq z1>9bR4R8=VQ}cEXJop{U*O8qU0JC_gm^G*1%g(7iulro?3tq{yKHz=CDQSHbcn>(E z4GoJ9We+5P*~+wnA-liL&tvlb@|Ufb~9eaC3&HB>XmtP>6e)=TX(xKwnedFMuwKgcJO^Z^zf_y08aiM zbZfGs7lvv>9U!O9*x;vHO;1+e*K|Hg}KjR$Z2{sQy(&e-=1?X{X%z=^_>UB7(< zJ7W|5iXW~1s~(WdPJo~I#7Kr18Dcj4@!0mhfom*y!H@8L53aHBGh=r6=kpnPwOQw_WVv_S>$&Kaj&At`d$pL@=gWs zVCOwq!QM%uKG_G{gAE~^RkNq=t)m9Rlq4r_zlraYOM=J2;?;+-|0zY~SXC>9} zIS+q&h?sr#;f?R3-uSp@#z)M41%B-m@w_#B&YQzK#98>?sqx<7o_U8ji<)^n8{ye` z!=IhwJAJfU-4L-+^Phl#0R>=(P^);e0gm>{^A%(#Q#VKVeY z-IdJb@!$i0&`7wbVP59(e27?dKm6l8n7C(PB2K-A_VtVxOEQXQ6#Eh8`V{(C-jihW zPyWnWuM~S?62GCL=lLz0O14|P6kR(BeCN#fjd|uaJbo)N{<`7(R>*v8 zV?GMNc`0)B0D5#LdUHED3q6-b_V=>a#aW&!Rsox0Fai#+!1LtK4COK2b~ozI8}jcIL90vIcPe6R+u@%g##*d#(zYi9O&{d4 zsEssox0|&}J$;2}Uwe&`qkcZ{?D7ZQu|J)I-{t6Izq}J&X|GpvT#78SZMibc#p7LW zTZ*ZY?9x9EpY6wKk9hR^J=-;3yEnP*zUG^s7fh|@;q#+8nSu_N{E_YO5W2j87+A%i zd%8S~E|=`Y=J-y8xl>GSXspg`33qmf3Oer~FS3X|#;MG+YRxDYa}}`5*PB4z%0@^- z-+I3uL|P0)?nLIVqdjDV`tN^_H-4) zyOkK;0``mauIziQ1!SjdT+g6eiilzEIg>n7V$gcr7-rS2SV|1wBIK*|i{f>=p!;rM zOal|LZJ%n2KvV0>>+nlJAJ^Mc}c%9*`JxuS6IxDX|ef$$*mz2ly?}}mKx#!Jq>CABKN%LJX zm<9b9c*n$G+B^mMXbNH<`!#W;@Nyb>yMbGKZf0K>xaE`VapNzQry%@41g&VSI$uM+ z@)&&ykDgrlU7?jLH~47PPp`HfSk_;^86HKylfP?YeYI9o+^hCctUuoBcGrjUl46mb z9MGCFXxD1MEIAmTiA-m1G)Kv4l0RJYp25x)uJ$8aV?9OfT-P-D}xdB^6`j?Y&6qB~DXY&9?bP5ym5 zKiT*`GY^89d0BznJNWuwTNOI=Pr&p8?4e2Uj;G@)(4W!~iO^}_+mT&_k9u76m$ISI z6?!Lk5Aap!M|P2wxt@*Z#VT4G(9Vy0%{PV`-xw4RYy_kGpEqB3O_01jBWvHyXTGil z#%rkGiT_kSHLZzEJP~rJmNnDEtdrs`oS6rmi`I)ZcjmYD^~@TBdAlS!UUbO&3Fu9- zFUh=2b>-L@r`-L* zCl-U_d^wC-^Cy|}kEh>in@w&DBlp^r5C0i2UGuoeBh*yU&W z#kcT&hn17Bm!o?HSKw@$!{hPoX5=huEF%N-P6h9{vUTX4!&8U96D0mqwk`Vk^+wv2 zem3$J9Q+;QHg?iXW5*jBJp3hS5MDhzf5?s>vUl~KYsZ^sXNX?mUp<>^$46XxRXl?7 z98Z^yqYnog)A|YX3^UYfjC&#I2=!Ujg^Ep9>GF&Q?D9J)!ty#{Q{S zeeuaQ^U9A@PfnNCmDM)^q2x(>Yt-i$UWqoVO#{#YMPC_2}rb;+*)yxmc!I-ujD7jT{5oP+rRlV2pctr!aQ??uM1kB-qk zqU4?GhwEB7b0*!RwUF*ruoem+PlBv}w03$68CDhIoO=A#dVVsn)MCFQUl#O`BZDt8 z(*qy%FbBP~Q&51c0N;TCFvFjr68fA5E%4rU-+A;_MwZ6D`~4$r((MUwEm|GUXJ6gf zUF`br-F3~6!tS48q?p4goc6jnP3T`ETH`A8z zD*4-k{8dbyiFc}GyfxqnJE0p~KaD)BI3?Ix&-W_3*ScOjwi$l>s@vA&<@F|Zplo^h zfaaY!1r{%lWd4AaONFs-V&5fM>-MoDxK~vj3r4-n+3Yz1qqBJ{UaxeWLv@%IW{ioc`zhcl$T= zlC@Vg{`JMI3D6}e=DdR#T@!1f`3E0m4dTxU#1eQhK;hV3A2`mwJUrmVoL~>`kX`XM z^#y$~C+j`B3FV=iE@(!&TRb^J%*pzpI4NjK`|^i~y%2qgw?~RO`AMxif3Cfyb(&;W zcPOi~v~KwB(0m5Wd{(jF>&<6A`Fxk5r>uMyK3{^KWM|evQzPN9?t{bQRUY!gH`c)(+@0ak+b+9g!KKMQUG%Ir~UEksLD|rY$HmgtQ zT6;czx(<*7<>6u2`Wm_6kIymuOxBPwV?keqIcDxN_s;l<#L~u)^|U{XiC99V6hY-PDK5@}u8gsv>7t z{^77|FYTtbm-0BK@Mr8Ne#-}~{3ZR~P3~|-8Nc~6_w{=^zxgxwv28-+uuM_TloNij zkvb(6CFEJ+hnvEmcddoI<_i39VgB?UzSad5_=Lm!>Gvx9I~DWz&7Zl??_4{scQSQW z3iI1>3GUSuxc9Krj6KI^1LJswd(C0@9`>@i$7cg$+Rwd>#HSkDaEg16&j!Z#6Yh0* zcH{Z(Jw6*4!?WCr%WlMmsh{KCzW^O(D zzskfWe7Ax0d+BTDyEgz2jb+Vr~sW#h=a5TBrt4}xF*Bntlu6^N`2QTE{L%t#D8jZ0s z;?@hVb8EIYJBI?mQ)lY3Oph-80&)QRUu&1tv`FUhlgsYU>UAgP5EJHfoEi1YG|9L> z{Z4ymCU<{*b@K{CN7Z16eEmBz#4WgRg(i!Pl=o zJ=`w)Bl$?e+mOC=WyeVR@+y23x$(u4tKHbZrL1oU&%}>`+~}(b&XtVSJ;~lUc;5}Y zWn(&CImDVdaI|iJ`E9Gl2XAX0AFrvNyAfYT7jiQVo`tI#WTXH0IDW^G(OYg=GT`kE z>TKoD(3b2F{L97jl4Ke$lcV8678|^;*Rs(zkrDAM$;_ zO5gF9Y`JCmFxXYUP5$B&f&H`Sm@t*EqRxh^{kF7@uP$z9RWF z{~(@l;u0Tm)uzLL7r2|8&t|!-f59fTnym0pR<=5VD=mxGc zef`22_s!YfYNhR6KK-kQCUbA3FC#qMxmWw0+YU`)9krb^qFWZu+Fr|ZLF~cM{?MK8 zoLRDJ3hzwu4G2%XZ}#@7w0k4h-}hyQ>+YMseYP)c?^N2oiF;4^0^ui|d*f+$D(%kq zjSbJdZ{~KjRc-nA`m0O!vL3hUCHk63TWPfU82wG8jiJtWz1zG{?*#V_;hkXr>H*S; zvv_a9eY3XD=DnrPv$J_`lk>fj_bTtJ+^%Pft-xN*v!s8-!_wUr{3YJI1KyEN(7KVH zA+8o4$A0R4$c2zEr~L#9*<))MF}9cb2ODdH{>HYC%HYq8Mw?b+!$--fUU>_PqbSL$!H()@aQ`YZ~h3ms_m; znTxLtXR-h5io#ddoEQ+=cBhY6rC{>;PENjh-I|fwza;;)HSJbb;}P`YeEeCj4)=X@ z_n{%Xti8p%e0%+@(G^?1y*~c@k#z_Ck)5XsEdPp@++7D-awDf|E#Hb-XfyPq+YUX- zebIP)c>sF(_BKa19Bht8Pmx=@B5>Ky4hAm!!>LNX&teRgTs400_^a&a{N>9I`pY+; z@|W-7ugyGPb4m5VnoHK7s<~trf04v{7xUi5_Ir;ut~mH;W8iME~x1ZQ!{LJXg$f#XOg9Su2Lr7Vj;t_3h>R-cQ^Ax#HIht(u{gp#wAwK*K^S zU}z<}ZR9)k;m}Qd=G!|2`j_nT?VY*HzZc)=kbd*xBY)szjh(MJ&&0qJ=dVU**t)s^ z`KgRt7_R*2$b&UL>kF#WY%W7z^Lrk@S^QRUJ9alTCOminI^kC05;L%eWp;eJ44s(8 zdSO0#T{`y+_m$ol+=*w#qFP}m`l<4uec=rYhiq>qcSv$H6*=nc z^wFQ6Kl?nUiaSHA+;A{EUlIP3<3US6}!!J?dGK=8N)E#!4>wg^B{?v5d>ZH-ujDIjVl|_3P4;{5sno)!b5T z$md~yCt^WE!oRr-{~!Aw#fCOJbHj_-8w3B5-}Ay|%?`S2UhkdvS?2x0;g@;8f*fqc zcs5KRe)}VPe?algqsZrY_6Y3mV>-UEXU@OSr8Pe0ZjDReyXH(B*(&{W=MVP$IT7zt zoJ;YoozP(_vGp=O=i^hu()`Ku>#6?#r-$-PQqv>%EcB>L z#vOVrOTGs^7WYDrcc^!BWik~#UN!O1#C**wFEP$^8CRZ=muC;3yS(f&d*odh?&Fme zcvNwen{=)WesZ409v{e1eja(}+%L(q4m9)3#IE0i_V3iBnBPP8?_cJ3BWt^I&nj!j z|B-zWGrMGsy3xX}z1YrG)_&^J5Lw&i_{(RKw~^$?c;{2n8=5ys-s*_WNZy{%-ffOf zQLc;hk>sPsl{;jy3I8&N3{B+TPM(=b>_uzLi=8=__}gL-=_c*nwidZe zV@|Y`S}o0!(#XHB!1|>z?$!w=T(a~ z@?X%;#YuC!WWDoDOHaM?Wb(age|QV`&ZKt+x;*01JBu7%@#^Erz3|5q4u9qM0A4{^c0DOZUnvCmKJ?*}wH#A92M= zwHNJ6{2|XsrewQIRNv>&Bfq@%;D)15p2}bFn^PO&AD>bT zefPSx2a5+idusO&_ns}*{K%>2nrCFJdp(ye^Exkv9K&qRS7Cp| zjX(JQ!HvV#pJERGqVj%bS)mteGk1N1`2LHtg3k9$zGph$`|`c7^S!_IqW0?>XZcP( zNZfqrSJBgV`%cb9Z>xRf zum`HS{4BZd1~&R?Wly0EA{J={3*S@=|jne+5CJ&11 zWEg%63}*jH^+P-?QbPYcuiUpK!)w-0(;EMsezg{A$6Xai4K!{-PY=tp4osXoti#RW z^S)#Aj9oML;dkH>=y12gH*S9JbJUQDuibc-mmhTYS*rc3Co=D=f@Z&v{k;`G-_Se_ z`=xz@zt;u-4>VrDukmWuoLTW-XtEjp*$n>-n>%FtCfZ7ef86${i+wS2iRUIbd_60bT=9OFTp^!ju3W+U zMy_a2vK`@Ca^=D#+4ciV3-5Qyw&Y6k&GW8Yg)FOXJN#?piuR*C-|Whj=embnA)Asb zw?D6pw7d-skWtaV_P72#xhh1iw7-I6>&N6V<)V|_n6h;9@2O{UZP!S2v}>=j@H@Qg z-&%_)BM!O`Jyd`^Jcf)shKy8M!TAy7j5#oCvV+6HI}>MoyROmULpi%z*X$SmqShGm zfW=)GbN3<;?*GZSnEHzX)^0-+JI14%N{AV&AO98PH<1%3pICOp3!jVE>+_l0Q(rFI z1n;fP|MeBU;^n1rjfcjMdwfT)|EP5iFTL|Bpr`ej@K*X2jDL>Zl#JvlW?}ie(OTnO z4lG))SKs;4oDhH6Ka2Rwg!98nYvpCC>*bQ-rlR9%EhTQ1gG{(D)ad`zh$2n{4-~HeUV*PbxteH&Ox_nK04(oo* zkE$KJqud*S-wG{3iXTK8%h7zL!`# zlw7F4+O5mhjDx=|@M)o6@wRf)GaY*9UFA6nZ#%!lTWe>>Wn5m)5idJ&s>M3T;+uJf zmp90tJHt5^qJI?Fenftj_|ePX`#wzQ5Y^m@kKBL8UI*;`T1T1~USfZG?avvz2fn$> ziYwOir+}}=-c!@jS$5vJFFaCfe08CQXm+3>dY9ywJuU9he&~MNKbjwko0 z9(uHp{CRLJ#2;fltG)&NmLe}h$qP~pzZ$(BS!BIfjSh}f@rmw@)bNSU1#kW)HAI$Y z@n?T}{kQebUJu0lSceFP4@NrbyWO)c2>*(EhIb?z=%O!+e*IXl_wbB-y=XRc=l*!) zV@QSd+}9bK;K0zx^ufg=zyCmJ^;7)4&fmNIjj*a;JjQ3v!;h5Cc>CYKU2ElJ*IJp` zBZAd0j`XEZ8R<*w!Z)28g<`8{7+HsB$i z-(zKDAO4>om+lz7{o9*(ev_W>ujey(KAq=-Q#SGZrV&dA2=+}@diLo*EiPUA^nWJc zAJ{wmGhY5t>FM_#Pr!fiS>XT0gQYp?&nMs?+&lbZ*RLu){P@lU{CT~@pOdq?H0P?P z67U!H4*%&t{j7BD+-DN-kLVr#!w)@jVHfSM=pFXMAFL@|JL;JP>{s;;`;5XRr8(dB zzc;VTd3E0P+1@;9GmX3YnxdiRM)I0oRgYd$24GH++@!ohxye>XE&fknD zYfBF|dH4vvn1T$vYK`nO#g}#Yt2|R{^~v6=&pT@eNEUMD{!3|2=Jo_W(02-Q(BQn& zz_abV)2PpHE*~Iy7(1n|^zc59JOJYqWZ@y_oridK5AUqd=MBpSNG4|d=|`o9ulsod zFL-uTa9pSO*s-*)Y7dx_-l%9UsBiHcB+3;DkVoB-R8`dZAf!=4uXa7%1 z#}3?)7$fBMZ208dx2|;2hyRhl2cAD0K8OF~$E9Px^jJbp;GMJKbNIvR($lwl#s}SV zHhfNRU0k|j&3`8FL4MDM&yJriDV_1e;|Y9_gR|kYBk!lBi@x-H0w46~+3?A!dZhI9 zPd)O3E;<`NV`o5vx1UVlgG`?dpBdqYN@r~H=mEo{z4O}$cv3PlW5n{(8J#;5ctJl~ z2GeX?a(At<4U(U+`+rtC_MNQ>elz+>wkK%Yk?G5gU69<&DExluj%S}r;L)W!GHe?X zT4rp5!W2cr(beX*M62GXG(AUV)8R+}%HKm8|_V@vY zk5j{2YxTu{J`bP!eEjr&+4;o8clv!NcCYK4&N;)(349~H@e4Oz(O~k46YCox@{+CJ zjtWOPzw0pbNakT%%kT2V&HZbyF!z7s-oM8eujYI&E3Z#@1NqHwxcBe%#Uq@PY)xPf zvyAU;d)2+a$h5Q7`u;`X-L&82-mmgG^#S8M1f%9W)(0K+Iupk`KURKqgV}E*k;Y2&kya`Lx?(^1A98^JNSEpKQj*`W+IyGp#DztK5srpmWhWY z@)z#+S&x9{bKPTfPW}vWmVaeF8v%Chfub7rKZtgMiUwy&gZXsR`xMNe?PFENC?583C7+L31dY}zY7OL-xj2fX=1Xl&=k zo4wAUuUT6mru{b?KCFN6?^YbVVg9qHGT(psRA&9rQ<)Fkur~AKZ?4Y#xO!h!=*I^q z-?Qb^$iDjBmna@x5^x5W#hls!D z_0}J``EGx~Jod1(Hk>kN|C&D28mm(Dsj>T<(_ecE{6;4AM-9)`J;bLKTeJC8e66(~ z)-32p`QTb_>4uxbBLf^BIYvJ&f23?b)O-6kouU2H)DepR&)WX3oL=Go!Wr6+ooo9R z( zWaM|3+SmA6jREvT06pOyWAW&B=)+Ro^Ec6B$b0$h59${u)@`=t-xp$b=x}4 z?!#RNa`c?Ti~Su~|0_wq9W(rxsOK_kP{5iYJB+;?f_*CDPkV6{6Q4CU6uTAVUX**e zmhZ%CR#nwA> zeMOzX(pi<>a5edftOISOh9n#lT-eN5347M_Tuk<#XZd|)Wr+MmU=nQI`BUo=zQ%p5 zLs;z11COp0kG?RAHB;jET3alh0A9cUyx~#xOFaEO@o5w~$|n>&AF`HQ98jJmdk-_7 zs&mrb4>r#@dz&~gyU&Ms-s>{A~3a_b|GnKkJ|eT3FeI;ZkCjxl09REto7 zFD!o0dcNu-BIL@E&rE$^Ho2x;Lr3M*H}jr+wr1W{tpq%}a!++G`;u8F+u8fFeJuBl zU#GkV`^;(ib*``Q4UHjn;PMC6Z)9w7(JpG^td6Qx5!%##8(lP)-zOiQakJ@Q=j;2K zV~oG{{IJ$d$1`teE}^YD!|V89@OsP_zU}KD)C)IqTDOiDzrzFCALrBb_up~G_zbYP zw(7S!QwAA-)I)#czx6V{ffVDrnRd=~eAT|K?-TmVj0btZz4;^Y6CL$==!_wvK zkkCnVg!d!lt)Me(ItF~Q#^_hx)_5yn@=d4o0%y}lE_=V6=xx>52U5tW<_|(-8PgepvI!*e4 zd23glyX0Q;uS#;H^gTbod+>*koI166k=hi`^L-6+Ao>20KCk4Q14pm)&>IddHkdPj}-pE$~_@!Ccytp{`N!A!0w~FjUDau;q@o&`Fs+8P?OOc ze=MMVY|8UXnEQ`^q>s%XI!9W%F^NCEH{IA2@)?tDip?Y4?McEmiYD0(kNgIjxc2y1 zl0CHfxp#U@bl`Qz{c4RnHA@=z4XUgDiES5bSja193@fn>_TD1ycsaHX9FJ+wPxwf= z>UO`_E>x8kGqEElWLs!w=?N_chYt8^RFlU{!-HQ zrljkiC0#$Abp2@3bz{&Of-$A(z z`RLvNF}*_m$Z?v#fgCK0dI8n*{piBp_a2y~F+`sy&&L}~d?g`Ive#SjN!DZ2{6TmF z{_)dafIf_`!#r6&WaR6%54n-Ey3XW71{S(VJ?I+y2}8VB~xD z4f#Woewl3GP52k&Ca>(uSMJ-Due{R9S2j9wG5aq0*b^g%oG0nVV)=~g$ya7SEL-o` z{s{VP+v_}|n3Uvs5b$~Z+mmiSM~eJoavZQRcK&g5#-eR6#X9OM&;P-}f-63K{_!kw z+DyLkKys1E?HEV?kI6+YCl|Te&P7&VZZ5LE%daGVaI2e({9nMKJVZBN(al3vPO?Qi zmE_tK#k&Dbe z9hxUSiafZv$Zmg{$JlYlw8nb+{Y!F@-<)UXBH!fjgv+;K&LENPORoQL{nN>VHK$Mb zr^f%pN1f=+M=rx28@ea*kzE|-Y0OMaid@$++jofE8j9ZzKMjMQQsyJyMPAMs+WR`~ zwcVAJ?@N2${M=2-Z}#RR&p&f}#cFTfx{N~j8+(wSl)E@cV-SV50=;udf%8<_<`OWx&&6C`*Hu=q_O>chl+s*JPK4MpX z^Q6R>YcIhV@3)mW`OV0ya{l^CR)8U;tRgpE`OUP|mESzo$#15;DD6eKPSzKDfko$E z8C+>6LjSEiuQ`b~zqwlZqx7#F=_t=P)0SBS5bWI3bq`rZ=Q#Pz4h<5r`lM)peE<3R z&GsDXt+|Q(<_hx3q{B6r(K&q5<&V8*+du8yd6CCId+03r&9jiXLS)X9-)!dUud!cU zF?H4Q$$ZM4yvojfpp)<1zxRCSC5)4a zF%=Mdf=9dMJF|y>fc)IABC`Oc~E^wNBihvttt zcHH$C-8^RIC@k2!Q%8sPx-#``%}gDcbxL= zvO012{DDNg%`*AYe-obN>?inX`_VY&%~AcbuSf3m1;Q%{pK9it-u1@_ z_S1Xa1#gP{=^X0Uz4_BIWKFREHEVBq#VsEt_p^DB^hU6;iGGyZ+&ai^vxPQQ z|NRpA*|j{^J{;J|(|(!u1&@ov%i8A-x~Tn)TWiRl4x0Sw82#A!qx@>Yar%%IF3+$UA|=Hg5op!C2>RlWl;L|-st)ZQ6E7R6&l>n2 z|7E58&Y~!IR00z)G|vF8dlhpG)J17;3D5n#XkBTy)jY$Eh27L4dGYFx(H?s2N|HCp zQ_fP z{u{;yUGNxtrTf8U6`$RnA?E$}JR{zU43J!2*7z&d>mtk>*Ludt9v_=uUp4vu34ZnR zs>%0<=aToCzs=!IbDoLAm!p*XK;FOjvLf4Rh{BhOkwxLJA<}#BXIBjXJZWkG_;hOk zyga&+9CX{)KpuHt{HnclVvM7y0iX}@>Nemw7he6oXn@SfztDaiuD&1n8S$nkKFIz! zoh4aayg6&2HM$dBC;k-wNZ)9!s1@GZ+}F2nS>c{F?J;U(ILAGo^`dck*2x0)pbEk} zOC#2S&4WX$jgEqES#w}7G|lHS8;7&6O{e8s;Kx3Wu!8$CFAc3emiu_)NS}X2A80j- z-*22Zf6VtUeQ?D{U*E>b^G1!iVeo@1IwRJC0(ARu+HU8Wx9EHMyg6gq2QOPO+{fNl zJg0Sb-PgXXk!k4a!&Xt-Xy|vuD)P~`?3QY+MBl$9U!$`s*wEP&?1)UmM;yrbP4iLb zU^N7Hg*sY@OSK#h71a)&v|9CT!bNrAZ9MY|``mE0MK~+VS9dx4VzHk|_{J;Z*J_;kx-H1T&x2O ztb|Upz;7Ki`UUu|1Mf%CX}ULLZs8ckDn9@}UEdBZv}ch$4!4gP#_#X(n~US6;Mf9g zOE0!@o1J4d)VjEVll-f}^ce-GAq&g52fzjYI=ng4s(Xd==#J(-#=a{4#y%C3SCC)b z_=;r}-41+PICrH_@#Gbgp!=4&!^Yg6Y2VArpKQiL_bU5Z;mva^$M_l7@m6}{qjL+! zm_5wEyH5MdWlTUHWHv;aCUivLyX0$cY&TiXD}UWx&JVFRCpn)C?%p+Ptx0uuS`FU) znAjKh#Wd!V>FBKt^i?K$N^3Ff6?WhqYN}rUxN7z5zWY~^dsw&0>RU&ScwM`dU6<)Q zuP)y@zfSeZ*qM`485`|6a}n)z%3!TsljR-NRXtM0#h`@6pWb+7Z@Ro6Ux@T*^a;*_qpW-c9|HB4&PSmW!* zo^3i4vVY?d+MW;J6#&~C=UE5drJeU^r{Dc|Z9kB29k}}Z(5egWUqG7|>^)G_{rVYT z`6I9_@L$ll8d&(OyV{>wcZfCy-ha>bhyDHbzWd#W2lTuDn(bEtr(n7on7#%~x_%}l zOcyjB`5LmozJx>00uybdf@$wb>w>-K49|CddhqJQPxTJZ2I@$Gr|>NBq@vLQXfXi# z-PJ{ltG7e9Mqpg=Ec8pJolB?itOpN<2mdQ$cfr0h(&;3!a}IP$1s5>vQ%I`}6kL zL{qD{-l{$r$+k?LVibFBeC-@N_pcS(+J+C#-f)jdX9l|R5fbYj?)>^S)-@c$MbxpANs`neUd4iw&f;I~Q!KYH_m z^x)04nR)-XiN8Jkwe$Dw^u9N*tbOL@$F55M))1@zw<;8f&0TopCHn4$hv$AbJUsWi(aCea8=XA&&xXSg5B#Ey_j-TQ z^?OOzvH@1@qc=aYY{ShP-|c+fTDT70uzsFuzC15^Jp{i;z7O%36FzK10Kch_Kh=B_ z=byf$5Btsa?R_mI-{I9%`GODqSpHffp1>aC%=L1^U;U=m;F#;Nrn&){@o6oNHAI~& zXx8RfOUUKyKm8^@f5H^&ksVKR_T;^RxISkt3dEU@?AQJ&yIGI;h`fiqfMtHGyr;yR z>!at&?+GZUbbn>%MDsZ-aJ~7QeR^ViEo&W>`~r|eCpZR?#X&QIW2a()8Gn)4GlHl5!S z$C!)bBzqhO*q^hrC)qd#{N{63hQG%+{*xES&J;L?`gh@Yoc*D@#I=JYe8!98B>$)5 z)f)Cqb$PYv!UT?i0SO#S2K2=79tX!O9UQN5a2(~}xZ1(7z9)_WFOCnVz;V~WE*uwn zaeVkw;@C7Wfn(sJ1db&aC2*{{s3(p)9300vIF>j#j&*Q6?BIB$Cysl`dFawPZ>GSJ zy{28AGtP_So1YTLz@P+>AqUttTobj}V9EP-RmWeFVFw;?f(mnCp)x-@}fK+n7OQO~>fQO`T}G3MZS*uk;P z;nhlqS7$i9dfLIUvnP&iY;Pb!Bn5T4=1@qcTD@kInGNG97~4w#PL}N z$A=vpS35Y?IXE72aD1~Tj$^$zzL5gQUBkL?-0H>gjZcYV)35}Nf#C@pONJ+KtQp=D z$I}ju>l_?6IykO%aLh@wc{Mk!2e10QI1ZZFlUK>_b>;D1FOGxKJ{_+HMka798JWPb zW@G}#rjb2yEJ?HF@o5LgXB`}$aB!@2aGcW<$5+XR>C!o6DR2yp>ca6WUL4ClC5|Pd z5;)e3O5oTuDuH9*ik>*uIXLcgaBOmL+~MH(goESLJ#k#=#c@jt9NGVpab#{42&XwX zE@I!z*;@>b%&h`uZ3Z34yeSZ#*^m8v^c}rw_WaRz^s4s!(R+((K4;e6%=f0x@w{c< z4}9Ll&dvRj&-1*|t1HXVtGZWy$l$oOe5aXjY^`XrKWFZk6rVvK<@*BWv*Hb7JGPcH zf851<^fvGt!rak3^GZoPFT?&m^A%%@wwAx)w0Fp9Z=cg1wo30*9O>TP1aEt9dfI!_ zY43>BUd(Clu+!cNr@eQ(w|AAdy>?G~?M{2|I_>?@Y43#79=6iJXWPmyd327N{i><&OT^p!yfcnm=Ox6o-TfOa@{sd0*_VwNm(|x- z_u2l5nwl7LFpGCuk%OJY1ZNTxWN+WN<|nm%)9PybhFGIk9lG)^g5CCXG-qgY?^obz z=T7es$ZJ%sk{%WeD$HSk(PjWIqm!K0b@y{T8ho@m{A+i&^( z7W;Sdf!V{@dal-KPxW(ld!u<)xj4Cvm#aN;_9ErVN6rfmx%Gp3$*tzI8#%`?hWxZ3 zORdOHCNTYh91GnmK=cXB+9IH%y9wLVl7TyGUs z0MGjy{oQg)jzdS$!Ns?k->UwH)`97Ep-p00k$M^wGxz&!f8lD>dnxVSW7 ze7+C`@5795J+#pGd}!gP4V~?%S`Oh_0qv7aow0_+Ad@J~DfDVs}$AM!b-yh?< z%Ojt81sd?o$ET~vD+rpk&IoWzF6XrI8|yG%2M3dn5wQ6+>vQmHpgX^Y0@icn-o&GI zjInUP3ZCFBM3;`@ujQ9%{1}r(@BnbMk}uJ=JY?3l-7yi5>)fiN{Au0xIDaSjdy7Av z2ju1&N*)c&_&?GOZ!_Lcv5xr;dih;+T{G*b?euwq^O@f==aKYlRA0wf_dU+KZ)@Ou z`cVGpd5v$)vEs+Y7w|}IKJ_k@_BqeFh2AQqBw9c=!2LBLi`b3^@W1KeiO|RR8o>@$u zSvz{Qjqwmq#^#HEp%47mS_$mPkAQ;Kdhh6K#qnGpd3mg3 zh@O3*m-QdT@#rs$4Lx$xKd2WRt#^gY^U6_-+)E88XJfX}-)?dS)b|l5KTG|yb~iA> zr|2mjEBqF<0o7N9_rFQLt4+cK4-~;j5CBPN~ zzvfAH{?uHEyJ! z=3Bbw4l2({xr1)|qtw3hyxLdpyV@T{KHVh#w1;W?M^&p^`=_n&(Vp9nXsxqTV(`g9 z^~u9Jbem}D0m7-uU1nPFN_XyIj|O0m zR$t$6`WpM07~?NH*JYc?QTkyn=iQQ{X!XdpO2JLmGZ$%-x7TBJe z58cq`%7ut%{|D>JaD=)}?CaLb>Wr{_8n6A=`|?Xxli#H8@`dClBo3a z{@i+SiD5S@@OujJqm^e^yWTqBBUf7Q%|gEi(eIKs{0i2KKNoJU@rMtwzk+yL@U#q? z!hXY38wv+n4Z{Ze8d{LGLi|AaT7t6$+Y8@-|Chtf(v#r&!lkUk^IH%&gok_w;V~0D z#IuqC;Zyr{Yd_~rhDQk>c<@o%KkLHhY6qW3d0#%+ddAPLbxmvZX`HZE(nz3NNC4czm}-6akm-vS@Y*Vn&LhUCi51(&~K z_`AkFuW_Ww>G#xo&9~xB;+;9r9UgDN&TDV$DEED~eA#@0ulH~GRN|wU_y}F%$Y0m* zAHrwd_y|4Q%y`TdkHg>cd74Yq4>V`|lxwYeA+>cbJoGxbysbQ&%tOB>N8(fQ&}a`2 zHTlBh#Y5;RjTQ^Q{U<*8xwj-J{{-N$a`$V>Z&?i=>tii2FwFXp;-M5t)pK;MEWwm*o>CeJf< z9XV25qJrVjtKj<@yH28$x_(`oxiDMuEzk~qSO%<}Rp()A&Tr^k1ia{!8i<0yN z`mW2?fUA7h!Gn9TH8a3H$=0kCJ~MjiiGOkM*@)~EFh1*(Y)t_+Mssq`#yhZdVL?YX zKE;-O20m?pU)7&?PM)kc`o5a5Ic^T+B5EMr9Lf%SK4W;C|J-=lF=X3&{$NQqv9Ju| zzpShcu?Ivya2>$74uZEhCwL<~7|CJWE3NRLY3$jU6N)P?=h`w`x7qtAN^gBpb(rAb z_LpVibBX;I)nAPE%ArpMGN+hT3H__TEkmqF#QTah)hMnq2tK60EPSg84qbImKC0}v zek&23v$5gGK-ouDLmBi=hUp?;`aLkEq6hO(=#kjJK=Gk+bX9;p+?bnSb9Iy*ck?y= z{*dkWE5=mGv(3OIn#d1)92oGA!uS*H0~9#XhghU?`JWD+WH6e?- zVr78_>8NhHkZ0~d&ZP@uA7_kC?kj@)b?e8OmuwQZqKd$ zk~vB(^~#<(%1X^qUig}DLw=~o;?wx_k|oCM3+^1{4*17AN3nX&QEcClIY_QUtC};+ zQ7W-3-RuT>O>>k3f(={SV_tGEa*p0U*ZIk4WK1!pWSjA2aQIX<1E0e?KY0Qk`b*{~ z4}Z27n=z@U%?JpeNj+^wmV-~Pz9ly5T;?asi05{*70gc-bI<4j__-PVE?w{*^=rmf z^y9o;bck$#tJ9O`C$A2Yj!eu?g@2SohHdh6s6t~X|; z)yb!<=^Lnn2cH+OsHU#6|E}M)P~TN!1@={5Y=s{yeCXhWRgax2oP6+9ZQ-#~H4l`m zt^BBX^@L38fNFGWiP_Xz53C9@-yF(4!Kpae4C)aobBg2ooRwP~mpt1z5F4&3>-Z$Y z_PM2po2VZhM?AL=x^~&ZijLbAKLj2Mj|S}lo_64Av(oqN0iG?uGYNQx1J82cX?x)M zwR?c)9iG)*1}*TB@nNwQHm#j~Tkxg-_8{_gtNdTqk1~UGT92sg%P0M{I{43~Kb_B{ zI^#|Bx0(K~r@vwJw~YQ?eqiF-P4pML#xj0_Vuh}48G+xBF?Ylm`42+_9WQXM_P%!3 zspb~GvPO7zQuCC-`Rqq84y|gB+_!C~#XfZXA6%mt;}G`6(^+%vWxgUezR29!)ZBhk za5L}G9t!Pc#YKwe%C;yD)(+2VZAdzQJbmbFtrgHwJoWg(nH|LYox~+%5;V72r1cyOY+B`smL3Cl)-$@~rO+cUMf~RaH?Nxgxf1@3_Ff|{Q`Cu%V?I0m z4W0N?@}I7G<&*kd#M`3SE%`9e^1v^A9WUg=Bl*xVKUmzDpUGc;{_^+>@mHZcS0X6-e=R%+1r}&>2~e-1n(R{ z4+E#^R^U|aN`k*QFK=Ni#lgGpPj^}(EaAjyh?xgfA@S+ zZ?UeS_$KzV-UrSRbb9j~Y{C3c{IlTF%I607N^uFrcaW9o5q@W{vw`}Q-f;PJ+kuXH z`Ovx4Dcbnh=V@upA&t7q7C!CyR**Fwt?y`FnAVt|*71UTJIR#RNTcu`&+VJZdT?iq zeIJo&^J(g9fj{O8M}hgje*H4`1yBC)#aA`%>^zMG1kuMbMf|+@_(P7ScVMe!Ejem2@qsyJWNxrKw zbZUoJIpgT^XM^F-#QwM1$4{}g7&K@_2Gax9BbxurvV3*o`!akt(O>(?n7!W%pj9sP zFtFQe;OQh=VyW&XwUs{Lw41~#I1?X`1_MWFE?v32fq^547f8#l2- zw#UdFxV6;#&E6{$J^1O2`d7ix#SgvE!+$@(J`WqvNzz$v`|dvWQQ(rDuz&M4y0{D$ zF7S$3g8+|ajl(G51D6)?XhyExv9Z@F>~r(JD13&4H@Gx|yW5{VcAh#n$L?O};?ge^ zf5RCo$(@Ujy`OU;pTWQ@`U7*u?b=VuUL%Rn7q-;dx82UAaOo!d-tmV7PaJdTb+RUC z@(o_SjCfH^diQ*TH^K1;V|`e7+PYpb-!kSe{{Y_?QX{<1@-Mgp-k1&lOJ{pyNMCvy z*p4vv&`o>)MBaoZhePpYyQ~983ateV)UvMIZY?P1bLx_uc?%n27**BN>stM+r+Un9`yeXbABDK@NlcnkI9;$6wSp6`sI zr{+t}`Rwd#;^+4Lw4%;^y3c3l#nhTh{{3P3hRyIo3H#MOf*z~rYh4$KrG=xD?6KDU zA98!{xt8`^DfuT zO}xKa?*n^fFdTOJZhm3i8sclC1H2zYH+IGXMeG}EK1K7`a%jhOY$JOU*Esz%zRj^f z_|9Ljr_3$zi@8n2ve z`zf31>dGkVrTgEo&oLGqwFi&RRd)5d_TFjBfp2Js*g-e_{|@JcnCDXJ%hdY+WfvFr z#*qI1l?R`!6#74v?l*daaZRQBe+n+CbidL0;3EB>O84&&E`NsZU+v<-n8@Bs@4Nq8 z{Xg0GT8Z(AUSm-cYCUhuk!{cNqXtreVQua^i%WW(4ubfNO)qQraTZ%vpxYfP;*X0+RP zK5%*A)cqhe4>&$+2j<0x#dtO^Q)EzhY?_Zp8 zbH^(SdGXf!MnpgOY#e=;%a0Wepo?v{1C3w#_mw*8Rt9d<0uf8uT6En{zw5TEIDXO39{54rT&#rv<| z&$bRuYt%e%*(c*h3wE`qxw342+oBM2%JdU$Z?0P-|J?m8;Q77`o3b_&cm;112^THVS!E+sO{(yGo5evC};p`5*W8vc<+ynJnB6ewy!5*jYw|VA>#(_`4 z@+!2-WIUALbd3D8aX$ZoYW9%GVqQD^(hM^mBN&h0i8q1MJFY#iZJRY*`Frs6P(E|> z@T-z|?XKVRyEAVPug!6ITRKVneX=CY_=_WN)%s#acYpC+bj%`jL=$$eb0B-ST+|RL zz`wxOzkTQFdaaFBu~$|nx~RDcy|E}{bg$&k)fb}u7WPOw%Cn-Y_MK@ZSC6^YiJNX@ z>?;+kAWpCjdol@~RAR*^&n+KwtkPFBIepCNJ>-80uj5-n@kVsg3HmSdWuI6NFD&z0 z1CMikd<*$``g}GNf9vT`{QKkxzWoIA9ADoPLm0P~jo>jy>!He_>5HxFgRLV+f^&$q z7ujcC$FF@BJfBG5(XtU=p@e)c{J{1yV)g5YA5<0>sh_v7gKx{Xs6*d&(&J-dH4zQZPbhg0Mt$ah%IJHzoEs_`$@DNhvm z+;KS*E`l)%E!5|RLTmKpim_Zuf2YQcj?VWL4I6AdfBar6UdH|+P3(iIvCv;DZ1R@{ffO)?@7@4_`RXH z=z9!0%kL;D_8pkAXX(MldBYYSgVwE#)!U3!1R1h*eMaL1{IK7Tv(FnBY|!PoHpW1D zOuTZ^haTg)6&Q8D88};kbGVgOcT~JWysH^q)C!!@TWEW=-M)MxmrtVDo;qM{1=gd$ z*Dil(H9T+&*E`^2-c`&b;3JQX-;7^~eQiWG6_1YryW-+8;E(O#6C8HHADhshOVOW8 z(Vt7vpPL@oyLRJ86Avj*H5tc^z2Nxl8F1W!-{-|qG5g3`=m@-OKN-i;WE|ImBYv}s zpKwjaaX~LQ<~lqRV_Y^eE*gg_>3+s#u?J?2iFju>IwE4m#CM{ZXS}jH3fNp(jfxlM zGuFhQ+u)fd*4BpNv+RMV)8`Hy6G3JTe;~i&kLkV8?i(IB&dMLtpj&-v+69tnR}T!+ zdgqTJz0mF&_`}NsF?5%3$?pZ1A%6}oQ^Dim)VS<_Es5732A8Sm6!^yQdkS8Ew-sI& zkBisE^B!JrM<2CmY>}hr{Nf^4H%YI#I@Z;d$_f7`*0*aMJ-8G-C|_0c6vbxRvP0YM zZ2P3Xop+MYL#*F?v8QZdMO^oZv5q{^M;wA=mWWRZ1dU)=^PwJzzneQ8OT}-w>_tD|9 z87=T!>$;F>_owusc*1USm~%b)Gg(JH&2y=A)CP2EyCV-XrqdG|-u`xkDF9P9!t!=$in0-^8l0=LO(-$o`ak#omBET*sLA$M%7%a4AR+|MBO< z0P4tl=WL8-aFSnHgG@%jZ6o{G7+;L<8~Ef6#ZyzN%=$(bdcoR+h?Kr zoMYS22>LZT7QDw<@s{NdKJbrnF0O}1Bfu0J%QMU2=W%x4zs4q&?U;}}E@ia0jxj)A zwWF_&68}8L`0TVYjSZ2W)EJp;pSMjWCLr(7l#u?J3_!H1r_Kp1u8%57!;3S=V z6uHXtWne=BjXAx@lX&iSBTw)$_-J0>@?AoX{H8|YC@@Ig?6@ZULEG}ze)2IfX>gFf zRXmg!7UzZ9G`Dk8GEB@agx-Fwp`-pVf93d1+7Fa`N%EQcg=g;SdGGI2+`BEsy=f`# z-JIgy+ld?m00BRTi+_RNgBjPo+~Y28=xBD-DU zpYW0NMXgy=41_10L%XI;^snT7Dd&8pg6|7S?YOYCq2KVQ&HD4B=sv}zl3^H@^se4< z-_O8z%%JaNd{uj-nCu$nLz=J2Pdrom=hMDRH?^xcm~aw3U%}tVTsXYLZZEwtxt}G@ zT+ZeP`@BqhUT5#E>&3@=-^;6?sJ>5gIC%Be=Z)5a8;GIp zyvkaT2Mu@LU@g#GS~igDf%@HtZ*OcOW27|#H$E>N^u648eaJ^#oaYtq*BZe8lxdy9 zj#YW%le<*A$e!@$O=eGc=6ybBALaa){Ln=v?@@G^sq@L!7ZCH89%7!Wx-@5PVCPqX zF$)-PyJn-s$am%)!GfPDgVFEp_!>kG;u7|QpF*nP#iTF|3QJ}N#W zn`i5)uNWDfyO(i9XSc-QbMR=}Vaw?~;OxSE@2stxtb%as zD>ltH-@+NP*2UqMS+{S+o`yK9(7JYDxI$-2VOJ$Xsz;eK>@;-LxnImBMBgNO=-v`& z9oY#TWyiTzuAJ^aaE39Ed`O4?in(u)c*8npO=lu}uDR*n$BFA2+e4o_p~2JS1b^gP za1*gJt&M!+`HuRT2%xYvKXa7*h_L5x)lqA~dVRjndYwK$Lf-WGIKLBJoA>lG;oaj%$rq4*Y0j;-+znw)(6JoIf-_xjifK4Ekt{Ims`VGYmt&>0VGYrea) zei!FG?z&Am@WaA;z(etc3vIn)WMnt@^0ika`Z6C~kslgvaI27yg|0O61uc!PY_jWN zee()B~LY`}T*2a876wednb+x|{bUQ&Z`;bv1bn_}yFZzuV!t z#}#u`3^l13_P)ZVC6Qo%U2?G%MbD?N?|oKS0j=yvmM3+S`NN zxjb<1r=XMTi+O3+mV0Bv(cw2WY#wYiJYMK)Q2c4LYSslWvhK$6%~^Q(dWs1tuW#c2 zc0Sj6FLbWz*T8e(=*B>}nK7ORoy*U+uIsE~%~|>M_rL@E#@cnb?H@bq*JtzFG>s3r zGs+XuZ#AqJm$B|D`Cq^@nT!*;B8nF@-^!TI2*op4yVP1wtc*O{XFKYdM=%y&47V^x zP~Bq$zb(Z10Ikq_1LN2Xt-JD4pt0A*)DQ!6 z$MgCRIJ$_gx?P2QGT;J_Ik1nzJ zXU{imebT@g0IBweh^|JK>KXect6PrsT4Y3aCwaete|GLiD$ze1{ozUQ9yN;By|X$L zf2R*RVybwMvoCfkKFl*E@Ze6J2b0?vf(P@0Ji9Yg^v)bB{?1hD?BSjF;Kz3sS@CzP ztoVEI!=Hd9x!*sz{pP?Ix$tiRJU1L)YZPNojHC^|G;<92<=8mty-Pyz6UdWl{@>=$ z$R<3YH7s}B9?+O4bmG?hFMZL_K2`s}ar!rFnDif`f7Mj!Y_~T0Z>RsRT5bA2LH}>j zzlq};-m`0qbcRd|eBO%gYa>q8&V21C^Y~-L-Hr#c*=wM0iz^O>03lex0tzb6r-B?}EK@`Q^Qd_y-QZ6iZgOUutNhdJ>a|HUOS5 z`aRHC$r$Q9RC~^4=TAm!tnj=4fUWjhqun+S(`Ix)Xq)7}qQu&of5YW}cAJ+=1~q@8 z|1MbIdHIUo{@p(RQ+;}Ut=Al1>m2cLYeDW7%`>oTN%S6R&RR+2pJ_c?xf9BTAkG

6!fdYSc&pdbtTi$u4 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%0A=%W4GdMN~{2U5A2R9vVwCiFG;O-;v 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�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

r=jhxINWAPI?8|v&tH+(Mr(2Z^1 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

|(2T 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