From 3d47833555863ce4be0b42fe317916f3ccc0fb51 Mon Sep 17 00:00:00 2001 From: Yuval Siev Date: Sat, 24 Feb 2024 18:47:34 +0200 Subject: [PATCH 1/2] Add pagination for get all task definitions --- controllers/task_definitions_controller.go | 5 ++++- controllers/utils.go | 18 +++++++++++++++--- dao/definitions_dao.go | 12 ++++++++++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/controllers/task_definitions_controller.go b/controllers/task_definitions_controller.go index 4bd6542..4e06948 100644 --- a/controllers/task_definitions_controller.go +++ b/controllers/task_definitions_controller.go @@ -73,7 +73,10 @@ func GetAllTaskDefinitions(c *gin.Context) { return } - tasks := dao.GetAllTaskDefinitions(apiKey.OrganizationId) + offset := ParseIntQueryParameter(c, "offset", 0) + limit := ParseIntQueryParameter(c, "limit", 10) + + tasks := dao.GetAllTaskDefinitions(apiKey.OrganizationId, offset, limit) c.IndentedJSON(http.StatusOK, tasks) } diff --git a/controllers/utils.go b/controllers/utils.go index f797676..060b18d 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -2,6 +2,7 @@ package controllers import ( "errors" + "strconv" "github.com/drorivry/rego/dao" "github.com/drorivry/rego/models" @@ -9,16 +10,27 @@ import ( "github.com/rs/zerolog/log" ) -func AuthRequest(c *gin.Context) (*models.ApiKeys, error){ +func AuthRequest(c *gin.Context) (*models.ApiKeys, error) { token := c.GetHeader("X-Rego-Api-Key") apiKey, authErr := dao.AuthApiKey(token) if authErr != nil { log.Error().Err(authErr).Msg("Invalid token") - return nil, errors.New("Invalid token"); + return nil, errors.New("Invalid token") } return &apiKey, nil -} \ No newline at end of file +} + +func ParseIntQueryParameter(c *gin.Context, paramName string, defaultValue int) int { + param_str := c.DefaultQuery(paramName, strconv.Itoa(defaultValue)) + param, err := strconv.Atoi(param_str) + + if err != nil { + param = 0 + } + + return param +} diff --git a/dao/definitions_dao.go b/dao/definitions_dao.go index ff038de..c76a88f 100644 --- a/dao/definitions_dao.go +++ b/dao/definitions_dao.go @@ -65,12 +65,20 @@ func CreateTaskDefinition(taskDef *models.TaskDefinition) error { return nil } -func GetAllTaskDefinitions(OrganizationId string) []models.TaskDefinition { +func GetAllTaskDefinitions(OrganizationId string, offset int, limit int) []models.TaskDefinition { var tasks []models.TaskDefinition initializers.GetTaskDefinitionsTable().Where( "organization_id = ?", OrganizationId, - ).Find(&tasks) + ).Order( + "created_at desc", + ).Offset( + offset, + ).Limit( + limit, + ).Find( + &tasks, + ) return tasks } From 68bb59b6a5fd871701e1ea32a2b47a1e08f2e567 Mon Sep 17 00:00:00 2001 From: Yuval Siev Date: Tue, 27 Feb 2024 14:49:28 +0200 Subject: [PATCH 2/2] Add task definitions count controller --- controllers/task_definitions_controller.go | 26 ++++++++++++++++++++++ dao/definitions_dao.go | 23 +++++++++++++++++++ tasker/tasker.go | 1 + 3 files changed, 50 insertions(+) diff --git a/controllers/task_definitions_controller.go b/controllers/task_definitions_controller.go index 4e06948..d128232 100644 --- a/controllers/task_definitions_controller.go +++ b/controllers/task_definitions_controller.go @@ -266,3 +266,29 @@ func DeleteTaskDefinition(c *gin.Context) { "message": "deleted", }) } + +// CountTaskDefinitions godoc +// @Summary Counts the number of task definitions for an account +// @Description Counts the number of task definitions for an account +// @Tags definition +// @Produce application/json +// @Success 200 +// @Router /api/v1/task/count [get] +func CountTaskDefinitions(c *gin.Context) { + apiKey, authErr := AuthRequest(c) + + if authErr != nil { + c.AbortWithStatus(http.StatusUnauthorized) + return + } + + count, err := dao.CountTaskDefinitions(apiKey.OrganizationId) + if err != nil { + c.JSON(http.StatusBadRequest, c.Error(err)) + return + } + + c.JSON(http.StatusOK, gin.H{ + "count": count, + }) +} diff --git a/dao/definitions_dao.go b/dao/definitions_dao.go index c76a88f..72b2fef 100644 --- a/dao/definitions_dao.go +++ b/dao/definitions_dao.go @@ -184,3 +184,26 @@ func UpdateDefinitionStatus(definitionId uuid.UUID, status models.Status, Organi return } } + +func CountTaskDefinitions(organizationId string) (int64, error) { + var count int64 + result := initializers.GetTaskDefinitionsTable().Where( + "organization_id = ?", + organizationId, + ).Count( + &count, + ) + + if result.Error != nil { + log.Error().Err( + result.Error, + ).Str( + "organization_id", + organizationId, + ).Msg( + "Couldn't count task definitions", + ) + } + + return count, result.Error +} diff --git a/tasker/tasker.go b/tasker/tasker.go index 20301b9..d704ba6 100644 --- a/tasker/tasker.go +++ b/tasker/tasker.go @@ -30,6 +30,7 @@ func GetServer(port int) *http.Server { { // Definitions v1.GET("/task", ginZerologger, controllers.GetAllTaskDefinitions) + v1.GET("/task/count", ginZerologger, controllers.CountTaskDefinitions) v1.POST("/task", ginZerologger, controllers.CreateTaskDefinition) v1.POST("/task/:definitionId/rerun", ginZerologger, controllers.RerunTask) v1.GET("/task/:definitionId/latest", ginZerologger, controllers.GetLatestExecution)