From c714d818486038ac1a260a920b83cb64fde4cd68 Mon Sep 17 00:00:00 2001 From: davidabram Date: Wed, 2 Jul 2025 01:31:46 +0200 Subject: [PATCH 1/3] Create Generic OSS handlers --- cmd/oss-api/main.go | 3 +- internal/data/aggregated_statistics.go | 11 ++++ internal/data/aggregated_values.go | 11 ++++ internal/data/db.go | 24 ++++++++- internal/data/detailed_cycle_time.go | 15 +++++- internal/oss-api/handler/code_chage.go | 40 +------------- internal/oss-api/handler/coding_time.go | 42 +-------------- internal/oss-api/handler/commits.go | 42 +-------------- .../oss-api/handler/oss_metric_handler.go | 54 +++++++++++++++++++ 9 files changed, 119 insertions(+), 123 deletions(-) create mode 100644 internal/oss-api/handler/oss_metric_handler.go diff --git a/cmd/oss-api/main.go b/cmd/oss-api/main.go index ecd2b926..0915e1b2 100644 --- a/cmd/oss-api/main.go +++ b/cmd/oss-api/main.go @@ -157,7 +157,8 @@ func main() { r.Get("/small-mrs/{org}/{repo}", handler.SmallMRsHandler) // New endpoints - r.Get("/{org}/{repo}/code-change", handler.CodeChangeHandler) + r.Get( + "/{org}/{repo}/code-change", handler.CodeChangeHandler) r.Get("/{org}/{repo}/code-change.md", handler.CodeChangeMarkdownHandler) r.Get("/{org}/{repo}/coding-time", handler.CodingTimeHandler) r.Get("/{org}/{repo}/commits", handler.CommitsHandler) diff --git a/internal/data/aggregated_statistics.go b/internal/data/aggregated_statistics.go index 7d46e5a3..b8579d97 100644 --- a/internal/data/aggregated_statistics.go +++ b/internal/data/aggregated_statistics.go @@ -12,6 +12,17 @@ type AggregatedStatistics = OverallWeeklyData[Statistics] type WeeklyStatisticsData = WeeklyData[Statistics] type AggregatedStatisticsQuery = Query[AggregatedStatisticsKey] +func (AggregatedStatisticsKey) Execute( + ctx context.Context, + db *DB, + q AggregatedStatisticsQuery, + org, repo string, + weeks []string, + team *int64, +) (any, error) { + return db.GetAggregatedStatistics(ctx, q, org, repo, weeks, team) +} + func (d DB) GetAggregatedStatistics( ctx context.Context, query AggregatedStatisticsQuery, diff --git a/internal/data/aggregated_values.go b/internal/data/aggregated_values.go index 0fb0d9b7..ac922c07 100644 --- a/internal/data/aggregated_values.go +++ b/internal/data/aggregated_values.go @@ -11,6 +11,17 @@ type AggregatedValues = OverallWeeklyData[Value] type WeeklyValueData = WeeklyData[Value] type AggregatedValuesQuery = Query[AggregatedValuesKey] +func (AggregatedValuesKey) Execute( + ctx context.Context, + db *DB, + q AggregatedValuesQuery, + org, repo string, + weeks []string, + team *int64, +) (any, error) { + return db.GetAggregatedValues(ctx, q, org, repo, weeks, team) +} + func (d DB) GetAggregatedValues( ctx context.Context, query AggregatedValuesQuery, diff --git a/internal/data/db.go b/internal/data/db.go index c03fe41e..8f7d9ee9 100644 --- a/internal/data/db.go +++ b/internal/data/db.go @@ -14,15 +14,37 @@ type DB struct { db *sql.DB } -type Query[T any] struct { +type QueryKeys interface { + AggregatedStatisticsKey | AggregatedValuesKey | CycleTimeStatisticsKey +} + +type Query[T QueryKeys] struct { value string _ T } +func NewQuery[T QueryKeys](query string) Query[T] { + return Query[T]{ + value: query, + } +} + func (q *Query[T]) Get() string { return q.value } +type Executable[T QueryKeys] interface { + QueryKeys + Execute(ctx context.Context, + db *DB, + q Query[T], + org string, + repo string, + weeks []string, + team *int64, + ) (any, error) +} + var dbPool sync.Map func NewDB(ctx context.Context, tenantRepo TenantRepo) (DB, error) { diff --git a/internal/data/detailed_cycle_time.go b/internal/data/detailed_cycle_time.go index 4b4468c8..ffede149 100644 --- a/internal/data/detailed_cycle_time.go +++ b/internal/data/detailed_cycle_time.go @@ -16,9 +16,20 @@ type CycleTimeStatistics struct { type AggregatedCycleTimeStatistics = OverallWeeklyData[CycleTimeStatistics] type WeeklyCycleTimeStatistics = WeeklyData[CycleTimeStatistics] -type CycleTimeStatisticsKey struct {} +type CycleTimeStatisticsKey struct{} type CycleTimeStatisticsQuery = Query[CycleTimeStatisticsKey] +func (CycleTimeStatisticsKey) Execute( + ctx context.Context, + db *DB, + q CycleTimeStatisticsQuery, + org, repo string, + weeks []string, + team *int64, +) (any, error) { + return db.GetDetailedCycleTime(ctx, q, org, repo, weeks, team) +} + func BuildDetailedCycleTimeQuery(weeks []string, team *int64) CycleTimeStatisticsQuery { teamQuery := "" @@ -28,7 +39,7 @@ func BuildDetailedCycleTimeQuery(weeks []string, team *int64) CycleTimeStatistic weeksPlaceholder := getWeeksPlaceholder(len(weeks)) - return CycleTimeStatisticsQuery{ value :fmt.Sprintf(` + return CycleTimeStatisticsQuery{value: fmt.Sprintf(` WITH has_deployment AS ( SELECT DISTINCT repository_external_id, forge_type FROM tenant_deployment_environments diff --git a/internal/oss-api/handler/code_chage.go b/internal/oss-api/handler/code_chage.go index 542add79..b6ea231b 100644 --- a/internal/oss-api/handler/code_chage.go +++ b/internal/oss-api/handler/code_chage.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "net/http" "github.com/dxta-dev/app/internal/data" @@ -10,6 +9,8 @@ import ( "github.com/dxta-dev/app/internal/util" ) +var CodeChangeHandler = OSSMetricHandler(data.BuildCodeChangeQuery) + func CodeChangeMarkdownHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -64,40 +65,3 @@ func CodeChangeMarkdownHandler(w http.ResponseWriter, r *http.Request) { return } } - -func CodeChangeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - weekParam := r.URL.Query().Get("weeks") - - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildCodeChangeQuery(weeksSorted, apiState.TeamId) - - result, err := apiState.DB.GetAggregatedValues( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} diff --git a/internal/oss-api/handler/coding_time.go b/internal/oss-api/handler/coding_time.go index 7f5c3b23..ceef305c 100644 --- a/internal/oss-api/handler/coding_time.go +++ b/internal/oss-api/handler/coding_time.go @@ -1,47 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func CodingTimeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildCodingTimeQuery(weeksSorted, apiState.TeamId) - - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var CodeTimeHandler = OSSMetricHandler(data.BuildCodingTimeQuery) diff --git a/internal/oss-api/handler/commits.go b/internal/oss-api/handler/commits.go index 9ac201c4..de94084f 100644 --- a/internal/oss-api/handler/commits.go +++ b/internal/oss-api/handler/commits.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "net/http" "github.com/dxta-dev/app/internal/data" @@ -10,6 +9,8 @@ import ( "github.com/dxta-dev/app/internal/util" ) +var CommitsHandler = OSSMetricHandler(data.BuildCommitsQuery) + func CommitsMarkdownHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -57,42 +58,3 @@ func CommitsMarkdownHandler(w http.ResponseWriter, r *http.Request) { return } } - -func CommitsHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - - weeksArray := util.GetWeeksArray(weekParam) - - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildCommitsQuery(weeksSorted, apiState.TeamId) - - result, err := apiState.DB.GetAggregatedValues( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} diff --git a/internal/oss-api/handler/oss_metric_handler.go b/internal/oss-api/handler/oss_metric_handler.go new file mode 100644 index 00000000..b8827b47 --- /dev/null +++ b/internal/oss-api/handler/oss_metric_handler.go @@ -0,0 +1,54 @@ +package handler + +import ( + "encoding/json" + "net/http" + + "github.com/dxta-dev/app/internal/data" + api "github.com/dxta-dev/app/internal/oss-api" + "github.com/dxta-dev/app/internal/util" +) + +type OSSMetricQueryBuilder[T data.QueryKeys] func(weeks []string, team *int64) data.Query[T] + +func OSSMetricHandler[T data.Executable[T]]( + queryBuilder OSSMetricQueryBuilder[T], +) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + apiState, err := api.NewAPIState(r) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + weekParam := r.URL.Query().Get("weeks") + + weeksArray := util.GetWeeksArray(weekParam) + weeksSorted := util.SortISOWeeks(weeksArray) + + query := queryBuilder(weeksSorted, apiState.TeamId) + + var key T + result, err := key.Execute( + ctx, + &apiState.DB, + query, + apiState.Org, + apiState.Repo, + weeksSorted, + apiState.TeamId, + ) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + if err := json.NewEncoder(w).Encode(result); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } +} From e56c06cbc6420162d405d4a20a599013c26388b3 Mon Sep 17 00:00:00 2001 From: davidabram Date: Wed, 2 Jul 2025 01:38:44 +0200 Subject: [PATCH 2/3] fix --- internal/oss-api/handler/coding_time.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/oss-api/handler/coding_time.go b/internal/oss-api/handler/coding_time.go index ceef305c..32d2388d 100644 --- a/internal/oss-api/handler/coding_time.go +++ b/internal/oss-api/handler/coding_time.go @@ -4,4 +4,4 @@ import ( "github.com/dxta-dev/app/internal/data" ) -var CodeTimeHandler = OSSMetricHandler(data.BuildCodingTimeQuery) +var CodingTimeHandler = OSSMetricHandler(data.BuildCodingTimeQuery) From 81e38ee3508630326848c90dd9be98c96ecff3fd Mon Sep 17 00:00:00 2001 From: davidabram Date: Sat, 5 Jul 2025 12:42:34 +0200 Subject: [PATCH 3/3] refactor --- internal/data/deploy_freq.go | 2 +- internal/oss-api/handler/cycle_time.go | 40 +------------------ internal/oss-api/handler/deploy_freq.go | 39 ++---------------- internal/oss-api/handler/deploy_time.go | 40 +------------------ .../oss-api/handler/detailed_cycle_time.go | 40 +------------------ internal/oss-api/handler/handover.go | 39 +----------------- internal/oss-api/handler/merge_freq.go | 38 +----------------- .../oss-api/handler/mr_merged_wo_review.go | 40 +------------------ internal/oss-api/handler/mr_opened.go | 38 +----------------- internal/oss-api/handler/mr_pickup_time.go | 40 +------------------ internal/oss-api/handler/mr_size.go | 40 +------------------ internal/oss-api/handler/review.go | 38 +----------------- internal/oss-api/handler/review_depth.go | 40 +------------------ internal/oss-api/handler/review_time.go | 40 +------------------ internal/oss-api/handler/small_mrs.go | 38 +----------------- internal/oss-api/handler/time_to_merge.go | 40 +------------------ 16 files changed, 22 insertions(+), 570 deletions(-) diff --git a/internal/data/deploy_freq.go b/internal/data/deploy_freq.go index 71829b81..f0f7a31a 100644 --- a/internal/data/deploy_freq.go +++ b/internal/data/deploy_freq.go @@ -4,7 +4,7 @@ import ( "fmt" ) -func BuildDeployFrequencyQuery(weeks []string) AggregatedValuesQuery { +func BuildDeployFrequencyQuery(weeks []string, _ *int64) AggregatedValuesQuery { weeksPlaceholder := getWeeksPlaceholder(len(weeks)) diff --git a/internal/oss-api/handler/cycle_time.go b/internal/oss-api/handler/cycle_time.go index ca370032..790fe24b 100644 --- a/internal/oss-api/handler/cycle_time.go +++ b/internal/oss-api/handler/cycle_time.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func CycleTimeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildCycleTimeQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var CycleTimeHandler = OSSMetricHandler(data.BuildCycleTimeQuery) diff --git a/internal/oss-api/handler/deploy_freq.go b/internal/oss-api/handler/deploy_freq.go index c3ef9edd..f98d985c 100644 --- a/internal/oss-api/handler/deploy_freq.go +++ b/internal/oss-api/handler/deploy_freq.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "net/http" "github.com/dxta-dev/app/internal/data" @@ -10,6 +9,8 @@ import ( "github.com/dxta-dev/app/internal/util" ) +var DeployFrequencyHandler = OSSMetricHandler(data.BuildDeployFrequencyQuery) + func DeployFrequencyMarkdownHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -24,7 +25,7 @@ func DeployFrequencyMarkdownHandler(w http.ResponseWriter, r *http.Request) { weeksArray := util.GetWeeksArray(weekParam) weeksSorted := util.SortISOWeeks(weeksArray) - query := data.BuildDeployFrequencyQuery(weeksSorted) + query := data.BuildDeployFrequencyQuery(weeksSorted, apiState.TeamId) result, err := apiState.DB.GetAggregatedValues( ctx, @@ -58,37 +59,3 @@ func DeployFrequencyMarkdownHandler(w http.ResponseWriter, r *http.Request) { } } -func DeployFrequencyHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildDeployFrequencyQuery(weeksSorted) - result, err := apiState.DB.GetAggregatedValues( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - nil, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} diff --git a/internal/oss-api/handler/deploy_time.go b/internal/oss-api/handler/deploy_time.go index d4bd465e..1a8c7e2e 100644 --- a/internal/oss-api/handler/deploy_time.go +++ b/internal/oss-api/handler/deploy_time.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func DeployTimeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildDeployTimeQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var DeployTimeHandler = OSSMetricHandler(data.BuildDeployTimeQuery) diff --git a/internal/oss-api/handler/detailed_cycle_time.go b/internal/oss-api/handler/detailed_cycle_time.go index 40059a3d..0aa9d5fd 100644 --- a/internal/oss-api/handler/detailed_cycle_time.go +++ b/internal/oss-api/handler/detailed_cycle_time.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func DetailedCycleTimeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildDetailedCycleTimeQuery(weeksSorted, apiState.TeamId) - cycleTimes, err := apiState.DB.GetDetailedCycleTime( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(cycleTimes); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var DetailedCycleTimeHandler = OSSMetricHandler(data.BuildDetailedCycleTimeQuery) diff --git a/internal/oss-api/handler/handover.go b/internal/oss-api/handler/handover.go index 89b8fb3e..5b8b1d80 100644 --- a/internal/oss-api/handler/handover.go +++ b/internal/oss-api/handler/handover.go @@ -1,45 +1,8 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func HandoverHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildHandoverQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var HandoverHandler = OSSMetricHandler(data.BuildHandoverQuery) diff --git a/internal/oss-api/handler/merge_freq.go b/internal/oss-api/handler/merge_freq.go index a5f65d61..6304fb70 100644 --- a/internal/oss-api/handler/merge_freq.go +++ b/internal/oss-api/handler/merge_freq.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "net/http" "github.com/dxta-dev/app/internal/data" @@ -10,6 +9,8 @@ import ( "github.com/dxta-dev/app/internal/util" ) +var MergeFrequencyHandler = OSSMetricHandler(data.BuildMergeFrequencyQuery) + func MergeFrequencyMarkdownHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -57,38 +58,3 @@ func MergeFrequencyMarkdownHandler(w http.ResponseWriter, r *http.Request) { return } } - -func MergeFrequencyHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildMergeFrequencyQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedValues( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} diff --git a/internal/oss-api/handler/mr_merged_wo_review.go b/internal/oss-api/handler/mr_merged_wo_review.go index 46af90df..e7ee38ed 100644 --- a/internal/oss-api/handler/mr_merged_wo_review.go +++ b/internal/oss-api/handler/mr_merged_wo_review.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func MRsMergedWithoutReviewHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildMRsMergedWithoutReviewQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedValues( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var MRsMergedWithoutReviewHandler = OSSMetricHandler(data.BuildMRsMergedWithoutReviewQuery) diff --git a/internal/oss-api/handler/mr_opened.go b/internal/oss-api/handler/mr_opened.go index eb8972ae..a6cd227c 100644 --- a/internal/oss-api/handler/mr_opened.go +++ b/internal/oss-api/handler/mr_opened.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "net/http" "github.com/dxta-dev/app/internal/data" @@ -10,6 +9,8 @@ import ( "github.com/dxta-dev/app/internal/util" ) +var MRsOpenedHandler = OSSMetricHandler(data.BuildMRsOpenedQuery) + func MRsOpenedMarkdownHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -57,38 +58,3 @@ func MRsOpenedMarkdownHandler(w http.ResponseWriter, r *http.Request) { return } } - -func MRsOpenedHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildMRsOpenedQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedValues( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} diff --git a/internal/oss-api/handler/mr_pickup_time.go b/internal/oss-api/handler/mr_pickup_time.go index 71d308ca..d2ccdad3 100644 --- a/internal/oss-api/handler/mr_pickup_time.go +++ b/internal/oss-api/handler/mr_pickup_time.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func MRPickupTimeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildPickupTimeQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var MRPickupTimeHandler = OSSMetricHandler(data.BuildPickupTimeQuery) diff --git a/internal/oss-api/handler/mr_size.go b/internal/oss-api/handler/mr_size.go index 90b5ffb0..6ed0b507 100644 --- a/internal/oss-api/handler/mr_size.go +++ b/internal/oss-api/handler/mr_size.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func MRSizeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildMRSizeQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var MRSizeHandler = OSSMetricHandler(data.BuildMRSizeQuery) diff --git a/internal/oss-api/handler/review.go b/internal/oss-api/handler/review.go index ef2f7dd5..2e2c81d9 100644 --- a/internal/oss-api/handler/review.go +++ b/internal/oss-api/handler/review.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "net/http" "github.com/dxta-dev/app/internal/data" @@ -10,6 +9,8 @@ import ( "github.com/dxta-dev/app/internal/util" ) +var ReviewHandler = OSSMetricHandler(data.BuildReviewQuery) + func ReviewMarkdownHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -57,38 +58,3 @@ func ReviewMarkdownHandler(w http.ResponseWriter, r *http.Request) { return } } - -func ReviewHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildReviewQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedValues( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} diff --git a/internal/oss-api/handler/review_depth.go b/internal/oss-api/handler/review_depth.go index 9aa0c7f9..5b6a355f 100644 --- a/internal/oss-api/handler/review_depth.go +++ b/internal/oss-api/handler/review_depth.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func ReviewDepthHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildReviewDepthQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var ReviewDepthHandler = OSSMetricHandler(data.BuildReviewDepthQuery) diff --git a/internal/oss-api/handler/review_time.go b/internal/oss-api/handler/review_time.go index a4878c75..c5895a26 100644 --- a/internal/oss-api/handler/review_time.go +++ b/internal/oss-api/handler/review_time.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func ReviewTimeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildReviewTimeQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var ReviewTimeHandler = OSSMetricHandler(data.BuildReviewTimeQuery) diff --git a/internal/oss-api/handler/small_mrs.go b/internal/oss-api/handler/small_mrs.go index aa7aa993..3ec51855 100644 --- a/internal/oss-api/handler/small_mrs.go +++ b/internal/oss-api/handler/small_mrs.go @@ -1,7 +1,6 @@ package handler import ( - "encoding/json" "net/http" "github.com/dxta-dev/app/internal/data" @@ -10,6 +9,8 @@ import ( "github.com/dxta-dev/app/internal/util" ) +var SmallMRsHandler = OSSMetricHandler(data.BuildSmallMRsQuery) + func SmallMRsMarkdownHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -56,38 +57,3 @@ func SmallMRsMarkdownHandler(w http.ResponseWriter, r *http.Request) { return } } - -func SmallMRsHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildSmallMRsQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedValues( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} diff --git a/internal/oss-api/handler/time_to_merge.go b/internal/oss-api/handler/time_to_merge.go index 765901e5..2b83504f 100644 --- a/internal/oss-api/handler/time_to_merge.go +++ b/internal/oss-api/handler/time_to_merge.go @@ -1,45 +1,7 @@ package handler import ( - "encoding/json" - "net/http" - "github.com/dxta-dev/app/internal/data" - api "github.com/dxta-dev/app/internal/oss-api" - "github.com/dxta-dev/app/internal/util" ) -func TimeToMergeHandler(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - apiState, err := api.NewAPIState(r) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - weekParam := r.URL.Query().Get("weeks") - weeksArray := util.GetWeeksArray(weekParam) - weeksSorted := util.SortISOWeeks(weeksArray) - - query := data.BuildTimeToMergeQuery(weeksSorted, apiState.TeamId) - result, err := apiState.DB.GetAggregatedStatistics( - ctx, - query, - apiState.Org, - apiState.Repo, - weeksSorted, - apiState.TeamId, - ) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - if err := json.NewEncoder(w).Encode(result); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } -} +var TimeToMergeHandler = OSSMetricHandler(data.BuildTimeToMergeQuery)