From b88245e7d9cd5f7a9a7a5fc0c4f6591900e1b758 Mon Sep 17 00:00:00 2001 From: "zero@thinky" Date: Sun, 5 Apr 2026 04:14:38 +0300 Subject: [PATCH] feat(backend/jobs): add agent_id parameter --- backend/docs/docs.go | 6 +++++ backend/docs/swagger.json | 6 +++++ backend/docs/swagger.yaml | 4 +++ backend/internal/handlers/jobs.go | 4 ++- backend/internal/repository/job_repository.go | 26 +++++++++++-------- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/backend/docs/docs.go b/backend/docs/docs.go index 2aebc8c..744ef85 100644 --- a/backend/docs/docs.go +++ b/backend/docs/docs.go @@ -1059,6 +1059,12 @@ const docTemplate = `{ "description": "Time period (e.g. 1h, 24h, 7d)", "name": "period", "in": "query" + }, + { + "type": "string", + "description": "Filter by agent ID", + "name": "agent_id", + "in": "query" } ], "responses": { diff --git a/backend/docs/swagger.json b/backend/docs/swagger.json index f5bc8cb..5fdfced 100644 --- a/backend/docs/swagger.json +++ b/backend/docs/swagger.json @@ -1048,6 +1048,12 @@ "description": "Time period (e.g. 1h, 24h, 7d)", "name": "period", "in": "query" + }, + { + "type": "string", + "description": "Filter by agent ID", + "name": "agent_id", + "in": "query" } ], "responses": { diff --git a/backend/docs/swagger.yaml b/backend/docs/swagger.yaml index 73c2279..c8ee460 100644 --- a/backend/docs/swagger.yaml +++ b/backend/docs/swagger.yaml @@ -1229,6 +1229,10 @@ paths: in: query name: period type: string + - description: Filter by agent ID + in: query + name: agent_id + type: string produces: - application/json responses: diff --git a/backend/internal/handlers/jobs.go b/backend/internal/handlers/jobs.go index bc1f883..d710864 100644 --- a/backend/internal/handlers/jobs.go +++ b/backend/internal/handlers/jobs.go @@ -230,6 +230,7 @@ type JobMetricsOut struct { // @Tags jobs // @Produce json // @Param period query string false "Time period (e.g. 1h, 24h, 7d)" default(24h) +// @Param agent_id query string false "Filter by agent ID" // @Success 200 {object} JobMetricsOut // @Failure 400 {object} map[string]string // @Security Bearer @@ -242,8 +243,9 @@ func (h *JobsHandlers) GetJobMetrics(c *gin.Context) { return } + agentID := c.Query("agent_id") since := time.Now().Add(-period) - metrics, err := h.jobRepo.GetJobMetrics(c.Request.Context(), since) + metrics, err := h.jobRepo.GetJobMetrics(c.Request.Context(), since, agentID) if err != nil { c.Error(err) return diff --git a/backend/internal/repository/job_repository.go b/backend/internal/repository/job_repository.go index 20ac2ea..eeb3946 100644 --- a/backend/internal/repository/job_repository.go +++ b/backend/internal/repository/job_repository.go @@ -113,18 +113,22 @@ type JobMetrics struct { } // GetJobMetrics returns job success metrics for jobs updated since the given time. -// A successful job has status == 0, failed has status != 0, pending has status == 0 with empty stdout/stderr. -func (r *JobRepository) GetJobMetrics(ctx context.Context, since time.Time) (JobMetrics, error) { +// If agentID is non-empty, results are filtered to that agent only. +func (r *JobRepository) GetJobMetrics(ctx context.Context, since time.Time, agentID string) (JobMetrics, error) { var m JobMetrics - err := r.DB.QueryRowContext(ctx, - `SELECT - COUNT(*), - SUM(CASE WHEN status = 0 AND (stdout != '' OR stderr != '') THEN 1 ELSE 0 END), - SUM(CASE WHEN status != 0 THEN 1 ELSE 0 END), - SUM(CASE WHEN status = 0 AND stdout = '' AND stderr = '' THEN 1 ELSE 0 END) - FROM jobs WHERE updated_at >= ?`, - since, - ).Scan(&m.Total, &m.Success, &m.Failed, &m.Pending) + query := `SELECT + COUNT(*), + SUM(CASE WHEN status = 0 AND (stdout != '' OR stderr != '') THEN 1 ELSE 0 END), + SUM(CASE WHEN status != 0 THEN 1 ELSE 0 END), + SUM(CASE WHEN status = 0 AND stdout = '' AND stderr = '' THEN 1 ELSE 0 END) + FROM jobs WHERE updated_at >= ?` + args := []any{since} + if agentID != "" { + query += " AND agent_id = ?" + args = append(args, agentID) + } + + err := r.DB.QueryRowContext(ctx, query, args...).Scan(&m.Total, &m.Success, &m.Failed, &m.Pending) if err != nil { return JobMetrics{}, err }