diff --git a/controllers/task_definitions_controller.go b/controllers/task_definitions_controller.go index 4bd6542..d128232 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) } @@ -263,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/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..72b2fef 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 } @@ -176,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)