diff --git a/cmd/task/main.go b/cmd/task/main.go index d7853699eacdd6406531057c77fe0b3c8670c9c7..d65bbc215762363852ff9b0e50f28c81a478e1e6 100644 --- a/cmd/task/main.go +++ b/cmd/task/main.go @@ -107,7 +107,7 @@ func main() { ) { taskSvc = task.New(storage, storage, cache, logger) - taskListSvc = tasklist.New(storage, storage, logger) + taskListSvc = tasklist.New(storage, storage, cache, logger) healthSvc = health.New() } diff --git a/design/design.go b/design/design.go index f45c623c174bc345c7962ee523d1fefb796895fe..5d00d67e622e655271d7c4e1bb42298d64077604 100644 --- a/design/design.go +++ b/design/design.go @@ -72,12 +72,12 @@ var _ = Service("taskList", func() { }) }) - Method("TaskListResult", func() { - Description("TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service.") - Payload(TaskListResultRequest) - Result(TaskListStatus) + Method("TaskListStatus", func() { + Description("TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service.") + Payload(TaskListStatusRequest) + Result(TaskListStatusResponse) HTTP(func() { - GET("/v1/taskListResult/{taskListID}") + GET("/v1/taskListStatus/{taskListID}") Response(StatusOK) Response(StatusCreated, func() { Tag("status", "created") diff --git a/design/types.go b/design/types.go index d8ee8780c205483ce9efa38dab5c5517c17cc5aa..963958847a65f58e0ee6773e3f452cfec2ada48d 100644 --- a/design/types.go +++ b/design/types.go @@ -34,12 +34,12 @@ var CreateTaskListResult = Type("CreateTaskListResult", func() { Required("taskListID") }) -var TaskListResultRequest = Type("TaskListResultRequest", func() { +var TaskListStatusRequest = Type("TaskListStatusRequest", func() { Field(1, "taskListID", String, "Unique taskList identifier.") Required("taskListID") }) -var TaskListStatus = Type("TaskListStatus", func() { +var TaskListStatusResponse = Type("TaskListStatusResponse", func() { Field(1, "id", String, "Unique taskList identifier.", func() { Example("9cc9f504-2b7f-4e24-ac59-653e9533840a") }) diff --git a/docs/task-list.md b/docs/task-list.md index 5b2b4fcf9e170d9923132004f31ebbb840d56376..93fc8a0b8475373535265df05c3bc5fe28b05000 100644 --- a/docs/task-list.md +++ b/docs/task-list.md @@ -55,9 +55,70 @@ an input to the next. If one task fails to execute, all following tasks are mark - Parallel group execution: tasks within the group are executed in parallel and the results are dependant. If a task fails to execute, this does not affect the other tasks but the group is marked with failed status. +### Task list State + The state of the task list asynchronous execution is available later on the `result` endpoint: ```shell -curl -v -X GET http://localhost:8082/v1/taskListResult/{taskListID} +curl -v -X GET http://localhost:8082/v1/taskListStatus/{taskListID} +``` +The state is returned as an HTTP status code. +- Status code `200` for `Done` state; +- Status code `201` for `Created` state; +- Status code `202` for `Pending` state (the task list is being executed); +- Status code `207` for `Failed` state (at least one task within the task list has failed). + +Example responses: + +HTTP Response code `200`: Done +```json +{ + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "done", + "groups": [ + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "type": "sequential", + "status": "done", + "tasks": [ + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "done" + }, + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "done" + } + ] + } + ] +} + +``` + +HTTP Response code `207`: Failed +```json +{ + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "failed", + "groups": [ + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "type": "sequential", + "status": "failed", + "tasks": [ + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "done" + }, + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "failed" + } + ] + } + ] +} + ``` ### Task list Executor Configuration diff --git a/gen/http/cli/task/cli.go b/gen/http/cli/task/cli.go index 6b3a3f3d5d37ba1cb804e2c2ac470f682bb05d76..7d8da6e65411a28f6f6ea2a9baa0b2e99fae75d0 100644 --- a/gen/http/cli/task/cli.go +++ b/gen/http/cli/task/cli.go @@ -27,7 +27,7 @@ import ( func UsageCommands() string { return `health (liveness|readiness) task (create|task-result) -task-list (create|task-list-result) +task-list (create|task-list-status) ` } @@ -74,8 +74,8 @@ func ParseEndpoint( taskListCreateCacheNamespaceFlag = taskListCreateFlags.String("cache-namespace", "", "") taskListCreateCacheScopeFlag = taskListCreateFlags.String("cache-scope", "", "") - taskListTaskListResultFlags = flag.NewFlagSet("task-list-result", flag.ExitOnError) - taskListTaskListResultTaskListIDFlag = taskListTaskListResultFlags.String("task-list-id", "REQUIRED", "Unique taskList identifier.") + taskListTaskListStatusFlags = flag.NewFlagSet("task-list-status", flag.ExitOnError) + taskListTaskListStatusTaskListIDFlag = taskListTaskListStatusFlags.String("task-list-id", "REQUIRED", "Unique taskList identifier.") ) healthFlags.Usage = healthUsage healthLivenessFlags.Usage = healthLivenessUsage @@ -87,7 +87,7 @@ func ParseEndpoint( taskListFlags.Usage = taskListUsage taskListCreateFlags.Usage = taskListCreateUsage - taskListTaskListResultFlags.Usage = taskListTaskListResultUsage + taskListTaskListStatusFlags.Usage = taskListTaskListStatusUsage if err := flag.CommandLine.Parse(os.Args[1:]); err != nil { return nil, nil, err @@ -150,8 +150,8 @@ func ParseEndpoint( case "create": epf = taskListCreateFlags - case "task-list-result": - epf = taskListTaskListResultFlags + case "task-list-status": + epf = taskListTaskListStatusFlags } @@ -201,9 +201,9 @@ func ParseEndpoint( case "create": endpoint = c.Create() data, err = tasklistc.BuildCreatePayload(*taskListCreateBodyFlag, *taskListCreateTaskListNameFlag, *taskListCreateCacheNamespaceFlag, *taskListCreateCacheScopeFlag) - case "task-list-result": - endpoint = c.TaskListResult() - data, err = tasklistc.BuildTaskListResultPayload(*taskListTaskListResultTaskListIDFlag) + case "task-list-status": + endpoint = c.TaskListStatus() + data, err = tasklistc.BuildTaskListStatusPayload(*taskListTaskListStatusTaskListIDFlag) } } } @@ -296,7 +296,7 @@ Usage: COMMAND: create: Create a task list and corresponding tasks and put them in respective queues for execution. - task-list-result: TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service. + task-list-status: TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service. Additional help: %[1]s task-list COMMAND --help @@ -316,13 +316,13 @@ Example: `, os.Args[0]) } -func taskListTaskListResultUsage() { - fmt.Fprintf(os.Stderr, `%[1]s [flags] task-list task-list-result -task-list-id STRING +func taskListTaskListStatusUsage() { + fmt.Fprintf(os.Stderr, `%[1]s [flags] task-list task-list-status -task-list-id STRING -TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service. +TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service. -task-list-id STRING: Unique taskList identifier. Example: - %[1]s task-list task-list-result --task-list-id "Deserunt dolor et autem quidem fugiat sint." + %[1]s task-list task-list-status --task-list-id "Deserunt dolor et autem quidem fugiat sint." `, os.Args[0]) } diff --git a/gen/http/openapi.json b/gen/http/openapi.json index 43127d6b53da9be51a4b015bc4a72d551923e9f9..601af302016673200a7a0a9579f49f0f789ffbf7 100644 --- a/gen/http/openapi.json +++ b/gen/http/openapi.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"title":"Task Service","description":"The task service is executing tasks created from policies.","version":""},"host":"localhost:8082","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/v1/task/{taskName}":{"post":{"tags":["task"],"summary":"Create task","description":"Create a task and put it in a queue for execution.","operationId":"task#Create","parameters":[{"name":"taskName","in":"path","description":"Task name.","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","required":false,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","required":false,"type":"string"},{"name":"any","in":"body","description":"Data contains JSON payload that will be used for task execution.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskCreateResponseBody","required":["taskID"]}}},"schemes":["http"]}},"/v1/taskList/{taskListName}":{"post":{"tags":["taskList"],"summary":"Create taskList","description":"Create a task list and corresponding tasks and put them in respective queues for execution.","operationId":"taskList#Create","parameters":[{"name":"taskListName","in":"path","description":"TaskList name.","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","required":false,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","required":false,"type":"string"},{"name":"any","in":"body","description":"Data contains JSON payload that will be used for taskList execution.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskListCreateResponseBody","required":["taskListID"]}}},"schemes":["http"]}},"/v1/taskListResult/{taskListID}":{"get":{"tags":["taskList"],"summary":"TaskListResult taskList","description":"TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service.","operationId":"taskList#TaskListResult","parameters":[{"name":"taskListID","in":"path","description":"Unique taskList identifier.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskListTaskListResultOKResponseBody","required":["id","status"]}},"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TaskListTaskListResultCreatedResponseBody","required":["id","status"]}},"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/TaskListTaskListResultAcceptedResponseBody","required":["id","status"]}},"207":{"description":"Multi-Status response.","schema":{"$ref":"#/definitions/TaskListTaskListResultMultiStatusResponseBody","required":["id","status"]}}},"schemes":["http"]}},"/v1/taskResult/{taskID}":{"get":{"tags":["task"],"summary":"TaskResult task","description":"TaskResult retrieves task result from the Cache service.","operationId":"task#TaskResult","parameters":[{"name":"taskID","in":"path","description":"Unique task identifier.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"}}},"schemes":["http"]}}},"definitions":{"GroupStatusResponseBody":{"title":"GroupStatusResponseBody","type":"object","properties":{"id":{"type":"string","description":"Unique group identifier.","example":"a7d1349d-34b5-4c65-b671-d1aa362fc446"},"status":{"type":"string","description":"Current status of the group","example":"done"},"tasks":{"type":"array","items":{"$ref":"#/definitions/TaskStatusResponseBody"},"description":"Array of TaskStatus","example":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"example":{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"TaskCreateResponseBody":{"title":"TaskCreateResponseBody","type":"object","properties":{"taskID":{"type":"string","description":"Unique task identifier.","example":"Sit asperiores."}},"example":{"taskID":"Iste suscipit exercitationem facilis distinctio asperiores ut."},"required":["taskID"]},"TaskListCreateResponseBody":{"title":"TaskListCreateResponseBody","type":"object","properties":{"taskListID":{"type":"string","description":"Unique taskList identifier.","example":"Ducimus velit."}},"example":{"taskListID":"Et occaecati placeat."},"required":["taskListID"]},"TaskListTaskListResultAcceptedResponseBody":{"title":"TaskListTaskListResultAcceptedResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListResultCreatedResponseBody":{"title":"TaskListTaskListResultCreatedResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListResultMultiStatusResponseBody":{"title":"TaskListTaskListResultMultiStatusResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListResultOKResponseBody":{"title":"TaskListTaskListResultOKResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskStatusResponseBody":{"title":"TaskStatusResponseBody","type":"object","properties":{"id":{"type":"string","description":"Unique task identifier.","example":"d16996cd-1977-42a9-90b2-b4548a35c1b4"},"status":{"type":"string","description":"Current status of the task","example":"done"}},"example":{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}}}} \ No newline at end of file +{"swagger":"2.0","info":{"title":"Task Service","description":"The task service is executing tasks created from policies.","version":""},"host":"localhost:8082","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/v1/task/{taskName}":{"post":{"tags":["task"],"summary":"Create task","description":"Create a task and put it in a queue for execution.","operationId":"task#Create","parameters":[{"name":"taskName","in":"path","description":"Task name.","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","required":false,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","required":false,"type":"string"},{"name":"any","in":"body","description":"Data contains JSON payload that will be used for task execution.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskCreateResponseBody","required":["taskID"]}}},"schemes":["http"]}},"/v1/taskList/{taskListName}":{"post":{"tags":["taskList"],"summary":"Create taskList","description":"Create a task list and corresponding tasks and put them in respective queues for execution.","operationId":"taskList#Create","parameters":[{"name":"taskListName","in":"path","description":"TaskList name.","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","required":false,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","required":false,"type":"string"},{"name":"any","in":"body","description":"Data contains JSON payload that will be used for taskList execution.","required":true,"schema":{"type":"string","format":"binary"}}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskListCreateResponseBody","required":["taskListID"]}}},"schemes":["http"]}},"/v1/taskListStatus/{taskListID}":{"get":{"tags":["taskList"],"summary":"TaskListStatus taskList","description":"TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service.","operationId":"taskList#TaskListStatus","parameters":[{"name":"taskListID","in":"path","description":"Unique taskList identifier.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"$ref":"#/definitions/TaskListTaskListStatusOKResponseBody","required":["id","status"]}},"201":{"description":"Created response.","schema":{"$ref":"#/definitions/TaskListTaskListStatusCreatedResponseBody","required":["id","status"]}},"202":{"description":"Accepted response.","schema":{"$ref":"#/definitions/TaskListTaskListStatusAcceptedResponseBody","required":["id","status"]}},"207":{"description":"Multi-Status response.","schema":{"$ref":"#/definitions/TaskListTaskListStatusMultiStatusResponseBody","required":["id","status"]}}},"schemes":["http"]}},"/v1/taskResult/{taskID}":{"get":{"tags":["task"],"summary":"TaskResult task","description":"TaskResult retrieves task result from the Cache service.","operationId":"task#TaskResult","parameters":[{"name":"taskID","in":"path","description":"Unique task identifier.","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"binary"}}},"schemes":["http"]}}},"definitions":{"GroupStatusResponseBody":{"title":"GroupStatusResponseBody","type":"object","properties":{"id":{"type":"string","description":"Unique group identifier.","example":"a7d1349d-34b5-4c65-b671-d1aa362fc446"},"status":{"type":"string","description":"Current status of the group","example":"done"},"tasks":{"type":"array","items":{"$ref":"#/definitions/TaskStatusResponseBody"},"description":"Array of TaskStatus","example":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"example":{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"TaskCreateResponseBody":{"title":"TaskCreateResponseBody","type":"object","properties":{"taskID":{"type":"string","description":"Unique task identifier.","example":"Sit asperiores."}},"example":{"taskID":"Iste suscipit exercitationem facilis distinctio asperiores ut."},"required":["taskID"]},"TaskListCreateResponseBody":{"title":"TaskListCreateResponseBody","type":"object","properties":{"taskListID":{"type":"string","description":"Unique taskList identifier.","example":"Ducimus velit."}},"example":{"taskListID":"Et occaecati placeat."},"required":["taskListID"]},"TaskListTaskListStatusAcceptedResponseBody":{"title":"TaskListTaskListStatusAcceptedResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListStatusCreatedResponseBody":{"title":"TaskListTaskListStatusCreatedResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListStatusMultiStatusResponseBody":{"title":"TaskListTaskListStatusMultiStatusResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskListTaskListStatusOKResponseBody":{"title":"TaskListTaskListStatusOKResponseBody","type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/GroupStatusResponseBody"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskStatusResponseBody":{"title":"TaskStatusResponseBody","type":"object","properties":{"id":{"type":"string","description":"Unique task identifier.","example":"d16996cd-1977-42a9-90b2-b4548a35c1b4"},"status":{"type":"string","description":"Current status of the task","example":"done"}},"example":{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}}}} \ No newline at end of file diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml index 2a2676a5ee016aff4baa7de4b048349146d199a9..146c123cfe4b87233e515dd22263e68a0fbc2e3b 100644 --- a/gen/http/openapi.yaml +++ b/gen/http/openapi.yaml @@ -114,14 +114,14 @@ paths: - taskListID schemes: - http - /v1/taskListResult/{taskListID}: + /v1/taskListStatus/{taskListID}: get: tags: - taskList - summary: TaskListResult taskList - description: TaskListResult retrieves a taskList result containing all tasks' + summary: TaskListStatus taskList + description: TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service. - operationId: taskList#TaskListResult + operationId: taskList#TaskListStatus parameters: - name: taskListID in: path @@ -132,28 +132,28 @@ paths: "200": description: OK response. schema: - $ref: '#/definitions/TaskListTaskListResultOKResponseBody' + $ref: '#/definitions/TaskListTaskListStatusOKResponseBody' required: - id - status "201": description: Created response. schema: - $ref: '#/definitions/TaskListTaskListResultCreatedResponseBody' + $ref: '#/definitions/TaskListTaskListStatusCreatedResponseBody' required: - id - status "202": description: Accepted response. schema: - $ref: '#/definitions/TaskListTaskListResultAcceptedResponseBody' + $ref: '#/definitions/TaskListTaskListStatusAcceptedResponseBody' required: - id - status "207": description: Multi-Status response. schema: - $ref: '#/definitions/TaskListTaskListResultMultiStatusResponseBody' + $ref: '#/definitions/TaskListTaskListStatusMultiStatusResponseBody' required: - id - status @@ -239,8 +239,8 @@ definitions: taskListID: Et occaecati placeat. required: - taskListID - TaskListTaskListResultAcceptedResponseBody: - title: TaskListTaskListResultAcceptedResponseBody + TaskListTaskListStatusAcceptedResponseBody: + title: TaskListTaskListStatusAcceptedResponseBody type: object properties: groups: @@ -300,8 +300,8 @@ definitions: required: - id - status - TaskListTaskListResultCreatedResponseBody: - title: TaskListTaskListResultCreatedResponseBody + TaskListTaskListStatusCreatedResponseBody: + title: TaskListTaskListStatusCreatedResponseBody type: object properties: groups: @@ -370,8 +370,8 @@ definitions: required: - id - status - TaskListTaskListResultMultiStatusResponseBody: - title: TaskListTaskListResultMultiStatusResponseBody + TaskListTaskListStatusMultiStatusResponseBody: + title: TaskListTaskListStatusMultiStatusResponseBody type: object properties: groups: @@ -440,8 +440,8 @@ definitions: required: - id - status - TaskListTaskListResultOKResponseBody: - title: TaskListTaskListResultOKResponseBody + TaskListTaskListStatusOKResponseBody: + title: TaskListTaskListStatusOKResponseBody type: object properties: groups: diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json index 5ab27ada65fefff93d33a6ca0cbc68755f771907..8f5099289b24b762f05dc73a122416f2638d3d9e 100644 --- a/gen/http/openapi3.json +++ b/gen/http/openapi3.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"Task Service","description":"The task service is executing tasks created from policies.","version":"1.0"},"servers":[{"url":"http://localhost:8082","description":"Task Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}},"/v1/task/{taskName}":{"post":{"tags":["task"],"summary":"Create task","description":"Create a task and put it in a queue for execution.","operationId":"task#Create","parameters":[{"name":"taskName","in":"path","description":"Task name.","required":true,"schema":{"type":"string","description":"Task name.","example":"Voluptas laudantium incidunt autem eaque."},"example":"Fugit ut eius sint earum."},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key namespace","example":"login"},"example":"login"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key scope","example":"user"},"example":"user"}],"requestBody":{"description":"Data contains JSON payload that will be used for task execution.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Data contains JSON payload that will be used for task execution.","example":"Quos aut tempore enim porro.","format":"binary"},"example":"Consequatur nulla praesentium totam."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskResult"},"example":{"taskID":"Harum aut autem aliquam dolorem non soluta."}}}}}}},"/v1/taskList/{taskListName}":{"post":{"tags":["taskList"],"summary":"Create taskList","description":"Create a task list and corresponding tasks and put them in respective queues for execution.","operationId":"taskList#Create","parameters":[{"name":"taskListName","in":"path","description":"TaskList name.","required":true,"schema":{"type":"string","description":"TaskList name.","example":"Earum laborum accusamus id nihil."},"example":"Est eveniet dolores."},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key namespace","example":"login"},"example":"login"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key scope","example":"user"},"example":"user"}],"requestBody":{"description":"Data contains JSON payload that will be used for taskList execution.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Data contains JSON payload that will be used for taskList execution.","example":"Excepturi non.","format":"binary"},"example":"Laboriosam cumque."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskListResult"},"example":{"taskListID":"Et officiis aut."}}}}}}},"/v1/taskListResult/{taskListID}":{"get":{"tags":["taskList"],"summary":"TaskListResult taskList","description":"TaskListResult retrieves a taskList result containing all tasks' unique IDs and statuses from the Cache service.","operationId":"taskList#TaskListResult","parameters":[{"name":"taskListID","in":"path","description":"Unique taskList identifier.","required":true,"schema":{"type":"string","description":"Unique taskList identifier.","example":"Omnis optio magni sunt aliquid et."},"example":"Dignissimos doloribus rerum occaecati quia ut."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatus"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"201":{"description":"Created response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatus"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatus"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"207":{"description":"Multi-Status response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatus"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}}}}},"/v1/taskResult/{taskID}":{"get":{"tags":["task"],"summary":"TaskResult task","description":"TaskResult retrieves task result from the Cache service.","operationId":"task#TaskResult","parameters":[{"name":"taskID","in":"path","description":"Unique task identifier.","required":true,"schema":{"type":"string","description":"Unique task identifier.","example":"Doloremque earum aliquid ipsa."},"example":"Voluptas odit voluptate nobis nam quia quae."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"Voluptatem iure qui facilis aut.","format":"binary"},"example":"Maxime facilis."}}}}}}},"components":{"schemas":{"CreateTaskListResult":{"type":"object","properties":{"taskListID":{"type":"string","description":"Unique taskList identifier.","example":"Ut et est aut quae magnam."}},"example":{"taskListID":"Amet sapiente qui non."},"required":["taskListID"]},"CreateTaskResult":{"type":"object","properties":{"taskID":{"type":"string","description":"Unique task identifier.","example":"Qui vitae."}},"example":{"taskID":"Eligendi officiis repudiandae excepturi in ex ratione."},"required":["taskID"]},"GroupStatus":{"type":"object","properties":{"id":{"type":"string","description":"Unique group identifier.","example":"a7d1349d-34b5-4c65-b671-d1aa362fc446"},"status":{"type":"string","description":"Current status of the group","example":"done"},"tasks":{"type":"array","items":{"$ref":"#/components/schemas/TaskStatus"},"description":"Array of TaskStatus","example":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"example":{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"TaskListStatus":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupStatus"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskStatus":{"type":"object","properties":{"id":{"type":"string","description":"Unique task identifier.","example":"d16996cd-1977-42a9-90b2-b4548a35c1b4"},"status":{"type":"string","description":"Current status of the task","example":"done"}},"example":{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}}}},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"task","description":"Task service provides endpoints to work with tasks."},{"name":"taskList","description":"TaskList service provides endpoints to work with task lists."}]} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"Task Service","description":"The task service is executing tasks created from policies.","version":"1.0"},"servers":[{"url":"http://localhost:8082","description":"Task Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}},"/v1/task/{taskName}":{"post":{"tags":["task"],"summary":"Create task","description":"Create a task and put it in a queue for execution.","operationId":"task#Create","parameters":[{"name":"taskName","in":"path","description":"Task name.","required":true,"schema":{"type":"string","description":"Task name.","example":"Voluptas laudantium incidunt autem eaque."},"example":"Fugit ut eius sint earum."},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key namespace","example":"login"},"example":"login"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key scope","example":"user"},"example":"user"}],"requestBody":{"description":"Data contains JSON payload that will be used for task execution.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Data contains JSON payload that will be used for task execution.","example":"Quos aut tempore enim porro.","format":"binary"},"example":"Consequatur nulla praesentium totam."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskResult"},"example":{"taskID":"Harum aut autem aliquam dolorem non soluta."}}}}}}},"/v1/taskList/{taskListName}":{"post":{"tags":["taskList"],"summary":"Create taskList","description":"Create a task list and corresponding tasks and put them in respective queues for execution.","operationId":"taskList#Create","parameters":[{"name":"taskListName","in":"path","description":"TaskList name.","required":true,"schema":{"type":"string","description":"TaskList name.","example":"Earum laborum accusamus id nihil."},"example":"Est eveniet dolores."},{"name":"x-cache-namespace","in":"header","description":"Cache key namespace","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key namespace","example":"login"},"example":"login"},{"name":"x-cache-scope","in":"header","description":"Cache key scope","allowEmptyValue":true,"schema":{"type":"string","description":"Cache key scope","example":"user"},"example":"user"}],"requestBody":{"description":"Data contains JSON payload that will be used for taskList execution.","required":true,"content":{"application/json":{"schema":{"type":"string","description":"Data contains JSON payload that will be used for taskList execution.","example":"Excepturi non.","format":"binary"},"example":"Laboriosam cumque."}}},"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaskListResult"},"example":{"taskListID":"Et officiis aut."}}}}}}},"/v1/taskListStatus/{taskListID}":{"get":{"tags":["taskList"],"summary":"TaskListStatus taskList","description":"TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service.","operationId":"taskList#TaskListStatus","parameters":[{"name":"taskListID","in":"path","description":"Unique taskList identifier.","required":true,"schema":{"type":"string","description":"Unique taskList identifier.","example":"Omnis optio magni sunt aliquid et."},"example":"Dignissimos doloribus rerum occaecati quia ut."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatusResponse"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"201":{"description":"Created response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatusResponse"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"202":{"description":"Accepted response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatusResponse"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}},"207":{"description":"Multi-Status response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListStatusResponse"},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"}}}}}}},"/v1/taskResult/{taskID}":{"get":{"tags":["task"],"summary":"TaskResult task","description":"TaskResult retrieves task result from the Cache service.","operationId":"task#TaskResult","parameters":[{"name":"taskID","in":"path","description":"Unique task identifier.","required":true,"schema":{"type":"string","description":"Unique task identifier.","example":"Doloremque earum aliquid ipsa."},"example":"Voluptas odit voluptate nobis nam quia quae."}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"Voluptatem iure qui facilis aut.","format":"binary"},"example":"Maxime facilis."}}}}}}},"components":{"schemas":{"CreateTaskListResult":{"type":"object","properties":{"taskListID":{"type":"string","description":"Unique taskList identifier.","example":"Ut et est aut quae magnam."}},"example":{"taskListID":"Amet sapiente qui non."},"required":["taskListID"]},"CreateTaskResult":{"type":"object","properties":{"taskID":{"type":"string","description":"Unique task identifier.","example":"Qui vitae."}},"example":{"taskID":"Eligendi officiis repudiandae excepturi in ex ratione."},"required":["taskID"]},"GroupStatus":{"type":"object","properties":{"id":{"type":"string","description":"Unique group identifier.","example":"a7d1349d-34b5-4c65-b671-d1aa362fc446"},"status":{"type":"string","description":"Current status of the group","example":"done"},"tasks":{"type":"array","items":{"$ref":"#/components/schemas/TaskStatus"},"description":"Array of TaskStatus","example":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"example":{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}},"TaskListStatusResponse":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/GroupStatus"},"description":"Array of GroupStatus","example":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}]},"id":{"type":"string","description":"Unique taskList identifier.","example":"9cc9f504-2b7f-4e24-ac59-653e9533840a"},"status":{"type":"string","description":"Current status of the taskList","example":"done"}},"example":{"groups":[{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]},{"id":"a7d1349d-34b5-4c65-b671-d1aa362fc446","status":"done","tasks":[{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"},{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}]}],"id":"9cc9f504-2b7f-4e24-ac59-653e9533840a","status":"done"},"required":["id","status"]},"TaskStatus":{"type":"object","properties":{"id":{"type":"string","description":"Unique task identifier.","example":"d16996cd-1977-42a9-90b2-b4548a35c1b4"},"status":{"type":"string","description":"Current status of the task","example":"done"}},"example":{"id":"d16996cd-1977-42a9-90b2-b4548a35c1b4","status":"done"}}}},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"task","description":"Task service provides endpoints to work with tasks."},{"name":"taskList","description":"TaskList service provides endpoints to work with task lists."}]} \ No newline at end of file diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml index 5f2410bff1140b90b9871ea7af5fd284be6f8cf1..d17d648965ac3f2296118f7339a9e6572e5acc30 100644 --- a/gen/http/openapi3.yaml +++ b/gen/http/openapi3.yaml @@ -137,14 +137,14 @@ paths: $ref: '#/components/schemas/CreateTaskListResult' example: taskListID: Et officiis aut. - /v1/taskListResult/{taskListID}: + /v1/taskListStatus/{taskListID}: get: tags: - taskList - summary: TaskListResult taskList - description: TaskListResult retrieves a taskList result containing all tasks' + summary: TaskListStatus taskList + description: TaskListStatus retrieves a taskList status containing all tasks' unique IDs and statuses from the Cache service. - operationId: taskList#TaskListResult + operationId: taskList#TaskListStatus parameters: - name: taskListID in: path @@ -161,7 +161,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TaskListStatus' + $ref: '#/components/schemas/TaskListStatusResponse' example: groups: - id: a7d1349d-34b5-4c65-b671-d1aa362fc446 @@ -189,7 +189,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TaskListStatus' + $ref: '#/components/schemas/TaskListStatusResponse' example: groups: - id: a7d1349d-34b5-4c65-b671-d1aa362fc446 @@ -217,7 +217,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TaskListStatus' + $ref: '#/components/schemas/TaskListStatusResponse' example: groups: - id: a7d1349d-34b5-4c65-b671-d1aa362fc446 @@ -263,7 +263,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TaskListStatus' + $ref: '#/components/schemas/TaskListStatusResponse' example: groups: - id: a7d1349d-34b5-4c65-b671-d1aa362fc446 @@ -390,7 +390,7 @@ components: status: done - id: d16996cd-1977-42a9-90b2-b4548a35c1b4 status: done - TaskListStatus: + TaskListStatusResponse: type: object properties: groups: diff --git a/gen/http/task_list/client/cli.go b/gen/http/task_list/client/cli.go index b3fea488aa37bcc93f8967c8c44a776705ab9787..b3449cf7f1e7114502127e44463c24429e85bbde 100644 --- a/gen/http/task_list/client/cli.go +++ b/gen/http/task_list/client/cli.go @@ -52,14 +52,14 @@ func BuildCreatePayload(taskListCreateBody string, taskListCreateTaskListName st return res, nil } -// BuildTaskListResultPayload builds the payload for the taskList -// TaskListResult endpoint from CLI flags. -func BuildTaskListResultPayload(taskListTaskListResultTaskListID string) (*tasklist.TaskListResultRequest, error) { +// BuildTaskListStatusPayload builds the payload for the taskList +// TaskListStatus endpoint from CLI flags. +func BuildTaskListStatusPayload(taskListTaskListStatusTaskListID string) (*tasklist.TaskListStatusRequest, error) { var taskListID string { - taskListID = taskListTaskListResultTaskListID + taskListID = taskListTaskListStatusTaskListID } - v := &tasklist.TaskListResultRequest{} + v := &tasklist.TaskListStatusRequest{} v.TaskListID = taskListID return v, nil diff --git a/gen/http/task_list/client/client.go b/gen/http/task_list/client/client.go index 85ce0ec093f453b75b89dbc8f0f51cc0a91893ad..4bc5df02bd6e9419c971ea460c57ca3f1d1d2324 100644 --- a/gen/http/task_list/client/client.go +++ b/gen/http/task_list/client/client.go @@ -20,9 +20,9 @@ type Client struct { // Create Doer is the HTTP client used to make requests to the Create endpoint. CreateDoer goahttp.Doer - // TaskListResult Doer is the HTTP client used to make requests to the - // TaskListResult endpoint. - TaskListResultDoer goahttp.Doer + // TaskListStatus Doer is the HTTP client used to make requests to the + // TaskListStatus endpoint. + TaskListStatusDoer goahttp.Doer // RestoreResponseBody controls whether the response bodies are reset after // decoding so they can be read again. @@ -45,7 +45,7 @@ func NewClient( ) *Client { return &Client{ CreateDoer: doer, - TaskListResultDoer: doer, + TaskListStatusDoer: doer, RestoreResponseBody: restoreBody, scheme: scheme, host: host, @@ -78,20 +78,20 @@ func (c *Client) Create() goa.Endpoint { } } -// TaskListResult returns an endpoint that makes HTTP requests to the taskList -// service TaskListResult server. -func (c *Client) TaskListResult() goa.Endpoint { +// TaskListStatus returns an endpoint that makes HTTP requests to the taskList +// service TaskListStatus server. +func (c *Client) TaskListStatus() goa.Endpoint { var ( - decodeResponse = DecodeTaskListResultResponse(c.decoder, c.RestoreResponseBody) + decodeResponse = DecodeTaskListStatusResponse(c.decoder, c.RestoreResponseBody) ) return func(ctx context.Context, v interface{}) (interface{}, error) { - req, err := c.BuildTaskListResultRequest(ctx, v) + req, err := c.BuildTaskListStatusRequest(ctx, v) if err != nil { return nil, err } - resp, err := c.TaskListResultDoer.Do(req) + resp, err := c.TaskListStatusDoer.Do(req) if err != nil { - return nil, goahttp.ErrRequestError("taskList", "TaskListResult", err) + return nil, goahttp.ErrRequestError("taskList", "TaskListStatus", err) } return decodeResponse(resp) } diff --git a/gen/http/task_list/client/encode_decode.go b/gen/http/task_list/client/encode_decode.go index 039233fa76cca534b124596950649d188223c455..7f5bc119a002da0c6476876d47d7020e3d26acee 100644 --- a/gen/http/task_list/client/encode_decode.go +++ b/gen/http/task_list/client/encode_decode.go @@ -107,23 +107,23 @@ func DecodeCreateResponse(decoder func(*http.Response) goahttp.Decoder, restoreB } } -// BuildTaskListResultRequest instantiates a HTTP request object with method -// and path set to call the "taskList" service "TaskListResult" endpoint -func (c *Client) BuildTaskListResultRequest(ctx context.Context, v interface{}) (*http.Request, error) { +// BuildTaskListStatusRequest instantiates a HTTP request object with method +// and path set to call the "taskList" service "TaskListStatus" endpoint +func (c *Client) BuildTaskListStatusRequest(ctx context.Context, v interface{}) (*http.Request, error) { var ( taskListID string ) { - p, ok := v.(*tasklist.TaskListResultRequest) + p, ok := v.(*tasklist.TaskListStatusRequest) if !ok { - return nil, goahttp.ErrInvalidType("taskList", "TaskListResult", "*tasklist.TaskListResultRequest", v) + return nil, goahttp.ErrInvalidType("taskList", "TaskListStatus", "*tasklist.TaskListStatusRequest", v) } taskListID = p.TaskListID } - u := &url.URL{Scheme: c.scheme, Host: c.host, Path: TaskListResultTaskListPath(taskListID)} + u := &url.URL{Scheme: c.scheme, Host: c.host, Path: TaskListStatusTaskListPath(taskListID)} req, err := http.NewRequest("GET", u.String(), nil) if err != nil { - return nil, goahttp.ErrInvalidURL("taskList", "TaskListResult", u.String(), err) + return nil, goahttp.ErrInvalidURL("taskList", "TaskListStatus", u.String(), err) } if ctx != nil { req = req.WithContext(ctx) @@ -132,10 +132,10 @@ func (c *Client) BuildTaskListResultRequest(ctx context.Context, v interface{}) return req, nil } -// DecodeTaskListResultResponse returns a decoder for responses returned by the -// taskList TaskListResult endpoint. restoreBody controls whether the response +// DecodeTaskListStatusResponse returns a decoder for responses returned by the +// taskList TaskListStatus endpoint. restoreBody controls whether the response // body should be restored after having been read. -func DecodeTaskListResultResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { +func DecodeTaskListStatusResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) { return func(resp *http.Response) (interface{}, error) { if restoreBody { b, err := ioutil.ReadAll(resp.Body) @@ -152,70 +152,70 @@ func DecodeTaskListResultResponse(decoder func(*http.Response) goahttp.Decoder, switch resp.StatusCode { case http.StatusMultiStatus: var ( - body TaskListResultMultiStatusResponseBody + body TaskListStatusMultiStatusResponseBody err error ) err = decoder(resp).Decode(&body) if err != nil { - return nil, goahttp.ErrDecodingError("taskList", "TaskListResult", err) + return nil, goahttp.ErrDecodingError("taskList", "TaskListStatus", err) } - err = ValidateTaskListResultMultiStatusResponseBody(&body) + err = ValidateTaskListStatusMultiStatusResponseBody(&body) if err != nil { - return nil, goahttp.ErrValidationError("taskList", "TaskListResult", err) + return nil, goahttp.ErrValidationError("taskList", "TaskListStatus", err) } - res := NewTaskListResultTaskListStatusMultiStatus(&body) + res := NewTaskListStatusResponseMultiStatus(&body) res.Status = "failed" return res, nil case http.StatusCreated: var ( - body TaskListResultCreatedResponseBody + body TaskListStatusCreatedResponseBody err error ) err = decoder(resp).Decode(&body) if err != nil { - return nil, goahttp.ErrDecodingError("taskList", "TaskListResult", err) + return nil, goahttp.ErrDecodingError("taskList", "TaskListStatus", err) } - err = ValidateTaskListResultCreatedResponseBody(&body) + err = ValidateTaskListStatusCreatedResponseBody(&body) if err != nil { - return nil, goahttp.ErrValidationError("taskList", "TaskListResult", err) + return nil, goahttp.ErrValidationError("taskList", "TaskListStatus", err) } - res := NewTaskListResultTaskListStatusCreated(&body) + res := NewTaskListStatusResponseCreated(&body) res.Status = "created" return res, nil case http.StatusAccepted: var ( - body TaskListResultAcceptedResponseBody + body TaskListStatusAcceptedResponseBody err error ) err = decoder(resp).Decode(&body) if err != nil { - return nil, goahttp.ErrDecodingError("taskList", "TaskListResult", err) + return nil, goahttp.ErrDecodingError("taskList", "TaskListStatus", err) } - err = ValidateTaskListResultAcceptedResponseBody(&body) + err = ValidateTaskListStatusAcceptedResponseBody(&body) if err != nil { - return nil, goahttp.ErrValidationError("taskList", "TaskListResult", err) + return nil, goahttp.ErrValidationError("taskList", "TaskListStatus", err) } - res := NewTaskListResultTaskListStatusAccepted(&body) + res := NewTaskListStatusResponseAccepted(&body) res.Status = "pending" return res, nil case http.StatusOK: var ( - body TaskListResultOKResponseBody + body TaskListStatusOKResponseBody err error ) err = decoder(resp).Decode(&body) if err != nil { - return nil, goahttp.ErrDecodingError("taskList", "TaskListResult", err) + return nil, goahttp.ErrDecodingError("taskList", "TaskListStatus", err) } - err = ValidateTaskListResultOKResponseBody(&body) + err = ValidateTaskListStatusOKResponseBody(&body) if err != nil { - return nil, goahttp.ErrValidationError("taskList", "TaskListResult", err) + return nil, goahttp.ErrValidationError("taskList", "TaskListStatus", err) } - res := NewTaskListResultTaskListStatusOK(&body) + res := NewTaskListStatusResponseOK(&body) return res, nil default: body, _ := ioutil.ReadAll(resp.Body) - return nil, goahttp.ErrInvalidResponse("taskList", "TaskListResult", resp.StatusCode, string(body)) + return nil, goahttp.ErrInvalidResponse("taskList", "TaskListStatus", resp.StatusCode, string(body)) } } } diff --git a/gen/http/task_list/client/paths.go b/gen/http/task_list/client/paths.go index ffe9998cace94691d4b97e2d7c5c8debd708cc1e..1409e86fb538f04ee09088fc8b2a9430b0ca2dcb 100644 --- a/gen/http/task_list/client/paths.go +++ b/gen/http/task_list/client/paths.go @@ -16,7 +16,7 @@ func CreateTaskListPath(taskListName string) string { return fmt.Sprintf("/v1/taskList/%v", taskListName) } -// TaskListResultTaskListPath returns the URL path to the taskList service TaskListResult HTTP endpoint. -func TaskListResultTaskListPath(taskListID string) string { - return fmt.Sprintf("/v1/taskListResult/%v", taskListID) +// TaskListStatusTaskListPath returns the URL path to the taskList service TaskListStatus HTTP endpoint. +func TaskListStatusTaskListPath(taskListID string) string { + return fmt.Sprintf("/v1/taskListStatus/%v", taskListID) } diff --git a/gen/http/task_list/client/types.go b/gen/http/task_list/client/types.go index 0aac928cea6267732c3a6ffb0cf3d481e38cdcfb..6233bd9199aa079cb82b1d931482e7931dd6eb24 100644 --- a/gen/http/task_list/client/types.go +++ b/gen/http/task_list/client/types.go @@ -19,9 +19,9 @@ type CreateResponseBody struct { TaskListID *string `form:"taskListID,omitempty" json:"taskListID,omitempty" xml:"taskListID,omitempty"` } -// TaskListResultMultiStatusResponseBody is the type of the "taskList" service -// "TaskListResult" endpoint HTTP response body. -type TaskListResultMultiStatusResponseBody struct { +// TaskListStatusMultiStatusResponseBody is the type of the "taskList" service +// "TaskListStatus" endpoint HTTP response body. +type TaskListStatusMultiStatusResponseBody struct { // Unique taskList identifier. ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` // Current status of the taskList @@ -30,9 +30,9 @@ type TaskListResultMultiStatusResponseBody struct { Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"` } -// TaskListResultCreatedResponseBody is the type of the "taskList" service -// "TaskListResult" endpoint HTTP response body. -type TaskListResultCreatedResponseBody struct { +// TaskListStatusCreatedResponseBody is the type of the "taskList" service +// "TaskListStatus" endpoint HTTP response body. +type TaskListStatusCreatedResponseBody struct { // Unique taskList identifier. ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` // Current status of the taskList @@ -41,9 +41,9 @@ type TaskListResultCreatedResponseBody struct { Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"` } -// TaskListResultAcceptedResponseBody is the type of the "taskList" service -// "TaskListResult" endpoint HTTP response body. -type TaskListResultAcceptedResponseBody struct { +// TaskListStatusAcceptedResponseBody is the type of the "taskList" service +// "TaskListStatus" endpoint HTTP response body. +type TaskListStatusAcceptedResponseBody struct { // Unique taskList identifier. ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` // Current status of the taskList @@ -52,9 +52,9 @@ type TaskListResultAcceptedResponseBody struct { Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"` } -// TaskListResultOKResponseBody is the type of the "taskList" service -// "TaskListResult" endpoint HTTP response body. -type TaskListResultOKResponseBody struct { +// TaskListStatusOKResponseBody is the type of the "taskList" service +// "TaskListStatus" endpoint HTTP response body. +type TaskListStatusOKResponseBody struct { // Unique taskList identifier. ID *string `form:"id,omitempty" json:"id,omitempty" xml:"id,omitempty"` // Current status of the taskList @@ -91,10 +91,10 @@ func NewCreateTaskListResultOK(body *CreateResponseBody) *tasklist.CreateTaskLis return v } -// NewTaskListResultTaskListStatusMultiStatus builds a "taskList" service -// "TaskListResult" endpoint result from a HTTP "MultiStatus" response. -func NewTaskListResultTaskListStatusMultiStatus(body *TaskListResultMultiStatusResponseBody) *tasklist.TaskListStatus { - v := &tasklist.TaskListStatus{ +// NewTaskListStatusResponseMultiStatus builds a "taskList" service +// "TaskListStatus" endpoint result from a HTTP "MultiStatus" response. +func NewTaskListStatusResponseMultiStatus(body *TaskListStatusMultiStatusResponseBody) *tasklist.TaskListStatusResponse { + v := &tasklist.TaskListStatusResponse{ ID: *body.ID, Status: *body.Status, } @@ -108,10 +108,10 @@ func NewTaskListResultTaskListStatusMultiStatus(body *TaskListResultMultiStatusR return v } -// NewTaskListResultTaskListStatusCreated builds a "taskList" service -// "TaskListResult" endpoint result from a HTTP "Created" response. -func NewTaskListResultTaskListStatusCreated(body *TaskListResultCreatedResponseBody) *tasklist.TaskListStatus { - v := &tasklist.TaskListStatus{ +// NewTaskListStatusResponseCreated builds a "taskList" service +// "TaskListStatus" endpoint result from a HTTP "Created" response. +func NewTaskListStatusResponseCreated(body *TaskListStatusCreatedResponseBody) *tasklist.TaskListStatusResponse { + v := &tasklist.TaskListStatusResponse{ ID: *body.ID, Status: *body.Status, } @@ -125,10 +125,10 @@ func NewTaskListResultTaskListStatusCreated(body *TaskListResultCreatedResponseB return v } -// NewTaskListResultTaskListStatusAccepted builds a "taskList" service -// "TaskListResult" endpoint result from a HTTP "Accepted" response. -func NewTaskListResultTaskListStatusAccepted(body *TaskListResultAcceptedResponseBody) *tasklist.TaskListStatus { - v := &tasklist.TaskListStatus{ +// NewTaskListStatusResponseAccepted builds a "taskList" service +// "TaskListStatus" endpoint result from a HTTP "Accepted" response. +func NewTaskListStatusResponseAccepted(body *TaskListStatusAcceptedResponseBody) *tasklist.TaskListStatusResponse { + v := &tasklist.TaskListStatusResponse{ ID: *body.ID, Status: *body.Status, } @@ -142,10 +142,10 @@ func NewTaskListResultTaskListStatusAccepted(body *TaskListResultAcceptedRespons return v } -// NewTaskListResultTaskListStatusOK builds a "taskList" service -// "TaskListResult" endpoint result from a HTTP "OK" response. -func NewTaskListResultTaskListStatusOK(body *TaskListResultOKResponseBody) *tasklist.TaskListStatus { - v := &tasklist.TaskListStatus{ +// NewTaskListStatusResponseOK builds a "taskList" service "TaskListStatus" +// endpoint result from a HTTP "OK" response. +func NewTaskListStatusResponseOK(body *TaskListStatusOKResponseBody) *tasklist.TaskListStatusResponse { + v := &tasklist.TaskListStatusResponse{ ID: *body.ID, Status: *body.Status, } @@ -167,9 +167,9 @@ func ValidateCreateResponseBody(body *CreateResponseBody) (err error) { return } -// ValidateTaskListResultMultiStatusResponseBody runs the validations defined -// on TaskListResultMulti-StatusResponseBody -func ValidateTaskListResultMultiStatusResponseBody(body *TaskListResultMultiStatusResponseBody) (err error) { +// ValidateTaskListStatusMultiStatusResponseBody runs the validations defined +// on TaskListStatusMulti-StatusResponseBody +func ValidateTaskListStatusMultiStatusResponseBody(body *TaskListStatusMultiStatusResponseBody) (err error) { if body.ID == nil { err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) } @@ -179,9 +179,9 @@ func ValidateTaskListResultMultiStatusResponseBody(body *TaskListResultMultiStat return } -// ValidateTaskListResultCreatedResponseBody runs the validations defined on -// TaskListResultCreatedResponseBody -func ValidateTaskListResultCreatedResponseBody(body *TaskListResultCreatedResponseBody) (err error) { +// ValidateTaskListStatusCreatedResponseBody runs the validations defined on +// TaskListStatusCreatedResponseBody +func ValidateTaskListStatusCreatedResponseBody(body *TaskListStatusCreatedResponseBody) (err error) { if body.ID == nil { err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) } @@ -191,9 +191,9 @@ func ValidateTaskListResultCreatedResponseBody(body *TaskListResultCreatedRespon return } -// ValidateTaskListResultAcceptedResponseBody runs the validations defined on -// TaskListResultAcceptedResponseBody -func ValidateTaskListResultAcceptedResponseBody(body *TaskListResultAcceptedResponseBody) (err error) { +// ValidateTaskListStatusAcceptedResponseBody runs the validations defined on +// TaskListStatusAcceptedResponseBody +func ValidateTaskListStatusAcceptedResponseBody(body *TaskListStatusAcceptedResponseBody) (err error) { if body.ID == nil { err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) } @@ -203,9 +203,9 @@ func ValidateTaskListResultAcceptedResponseBody(body *TaskListResultAcceptedResp return } -// ValidateTaskListResultOKResponseBody runs the validations defined on -// TaskListResultOKResponseBody -func ValidateTaskListResultOKResponseBody(body *TaskListResultOKResponseBody) (err error) { +// ValidateTaskListStatusOKResponseBody runs the validations defined on +// TaskListStatusOKResponseBody +func ValidateTaskListStatusOKResponseBody(body *TaskListStatusOKResponseBody) (err error) { if body.ID == nil { err = goa.MergeErrors(err, goa.MissingFieldError("id", "body")) } diff --git a/gen/http/task_list/server/encode_decode.go b/gen/http/task_list/server/encode_decode.go index 1766a79f08acf5abe52d05512c8746c6f98b2ec4..20ca784942a5b088f13f737d28571dc7bc7954ab 100644 --- a/gen/http/task_list/server/encode_decode.go +++ b/gen/http/task_list/server/encode_decode.go @@ -67,39 +67,39 @@ func DecodeCreateRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp. } } -// EncodeTaskListResultResponse returns an encoder for responses returned by -// the taskList TaskListResult endpoint. -func EncodeTaskListResultResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { +// EncodeTaskListStatusResponse returns an encoder for responses returned by +// the taskList TaskListStatus endpoint. +func EncodeTaskListStatusResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error { return func(ctx context.Context, w http.ResponseWriter, v interface{}) error { - res, _ := v.(*tasklist.TaskListStatus) + res, _ := v.(*tasklist.TaskListStatusResponse) if res.Status == "failed" { enc := encoder(ctx, w) - body := NewTaskListResultMultiStatusResponseBody(res) + body := NewTaskListStatusMultiStatusResponseBody(res) w.WriteHeader(http.StatusMultiStatus) return enc.Encode(body) } if res.Status == "created" { enc := encoder(ctx, w) - body := NewTaskListResultCreatedResponseBody(res) + body := NewTaskListStatusCreatedResponseBody(res) w.WriteHeader(http.StatusCreated) return enc.Encode(body) } if res.Status == "pending" { enc := encoder(ctx, w) - body := NewTaskListResultAcceptedResponseBody(res) + body := NewTaskListStatusAcceptedResponseBody(res) w.WriteHeader(http.StatusAccepted) return enc.Encode(body) } enc := encoder(ctx, w) - body := NewTaskListResultOKResponseBody(res) + body := NewTaskListStatusOKResponseBody(res) w.WriteHeader(http.StatusOK) return enc.Encode(body) } } -// DecodeTaskListResultRequest returns a decoder for requests sent to the -// taskList TaskListResult endpoint. -func DecodeTaskListResultRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) { +// DecodeTaskListStatusRequest returns a decoder for requests sent to the +// taskList TaskListStatus endpoint. +func DecodeTaskListStatusRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) { return func(r *http.Request) (interface{}, error) { var ( taskListID string @@ -107,7 +107,7 @@ func DecodeTaskListResultRequest(mux goahttp.Muxer, decoder func(*http.Request) params = mux.Vars(r) ) taskListID = params["taskListID"] - payload := NewTaskListResultRequest(taskListID) + payload := NewTaskListStatusRequest(taskListID) return payload, nil } diff --git a/gen/http/task_list/server/paths.go b/gen/http/task_list/server/paths.go index d00af8a7ef452988e0e7caec0e51d8035b499b5f..ccdd062b3b76273771d5a5cf5f2d0b68919884cf 100644 --- a/gen/http/task_list/server/paths.go +++ b/gen/http/task_list/server/paths.go @@ -16,7 +16,7 @@ func CreateTaskListPath(taskListName string) string { return fmt.Sprintf("/v1/taskList/%v", taskListName) } -// TaskListResultTaskListPath returns the URL path to the taskList service TaskListResult HTTP endpoint. -func TaskListResultTaskListPath(taskListID string) string { - return fmt.Sprintf("/v1/taskListResult/%v", taskListID) +// TaskListStatusTaskListPath returns the URL path to the taskList service TaskListStatus HTTP endpoint. +func TaskListStatusTaskListPath(taskListID string) string { + return fmt.Sprintf("/v1/taskListStatus/%v", taskListID) } diff --git a/gen/http/task_list/server/server.go b/gen/http/task_list/server/server.go index 0689f32a88bdad16b1000185e1998c02a1415558..648c3f3ead27c3fbba1576ad0868f9f49102529a 100644 --- a/gen/http/task_list/server/server.go +++ b/gen/http/task_list/server/server.go @@ -20,7 +20,7 @@ import ( type Server struct { Mounts []*MountPoint Create http.Handler - TaskListResult http.Handler + TaskListStatus http.Handler } // ErrorNamer is an interface implemented by generated error structs that @@ -57,10 +57,10 @@ func New( return &Server{ Mounts: []*MountPoint{ {"Create", "POST", "/v1/taskList/{taskListName}"}, - {"TaskListResult", "GET", "/v1/taskListResult/{taskListID}"}, + {"TaskListStatus", "GET", "/v1/taskListStatus/{taskListID}"}, }, Create: NewCreateHandler(e.Create, mux, decoder, encoder, errhandler, formatter), - TaskListResult: NewTaskListResultHandler(e.TaskListResult, mux, decoder, encoder, errhandler, formatter), + TaskListStatus: NewTaskListStatusHandler(e.TaskListStatus, mux, decoder, encoder, errhandler, formatter), } } @@ -70,13 +70,13 @@ func (s *Server) Service() string { return "taskList" } // Use wraps the server handlers with the given middleware. func (s *Server) Use(m func(http.Handler) http.Handler) { s.Create = m(s.Create) - s.TaskListResult = m(s.TaskListResult) + s.TaskListStatus = m(s.TaskListStatus) } // Mount configures the mux to serve the taskList endpoints. func Mount(mux goahttp.Muxer, h *Server) { MountCreateHandler(mux, h.Create) - MountTaskListResultHandler(mux, h.TaskListResult) + MountTaskListStatusHandler(mux, h.TaskListStatus) } // Mount configures the mux to serve the taskList endpoints. @@ -135,21 +135,21 @@ func NewCreateHandler( }) } -// MountTaskListResultHandler configures the mux to serve the "taskList" -// service "TaskListResult" endpoint. -func MountTaskListResultHandler(mux goahttp.Muxer, h http.Handler) { +// MountTaskListStatusHandler configures the mux to serve the "taskList" +// service "TaskListStatus" endpoint. +func MountTaskListStatusHandler(mux goahttp.Muxer, h http.Handler) { f, ok := h.(http.HandlerFunc) if !ok { f = func(w http.ResponseWriter, r *http.Request) { h.ServeHTTP(w, r) } } - mux.Handle("GET", "/v1/taskListResult/{taskListID}", f) + mux.Handle("GET", "/v1/taskListStatus/{taskListID}", f) } -// NewTaskListResultHandler creates a HTTP handler which loads the HTTP request -// and calls the "taskList" service "TaskListResult" endpoint. -func NewTaskListResultHandler( +// NewTaskListStatusHandler creates a HTTP handler which loads the HTTP request +// and calls the "taskList" service "TaskListStatus" endpoint. +func NewTaskListStatusHandler( endpoint goa.Endpoint, mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder, @@ -158,13 +158,13 @@ func NewTaskListResultHandler( formatter func(err error) goahttp.Statuser, ) http.Handler { var ( - decodeRequest = DecodeTaskListResultRequest(mux, decoder) - encodeResponse = EncodeTaskListResultResponse(encoder) + decodeRequest = DecodeTaskListStatusRequest(mux, decoder) + encodeResponse = EncodeTaskListStatusResponse(encoder) encodeError = goahttp.ErrorEncoder(encoder, formatter) ) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept")) - ctx = context.WithValue(ctx, goa.MethodKey, "TaskListResult") + ctx = context.WithValue(ctx, goa.MethodKey, "TaskListStatus") ctx = context.WithValue(ctx, goa.ServiceKey, "taskList") payload, err := decodeRequest(r) if err != nil { diff --git a/gen/http/task_list/server/types.go b/gen/http/task_list/server/types.go index 3b4aefe5ac4ddb025a2762244e38266c3fba179c..0bbdb6c9ffbb65ab7e17d51467755565e13bf190 100644 --- a/gen/http/task_list/server/types.go +++ b/gen/http/task_list/server/types.go @@ -18,9 +18,9 @@ type CreateResponseBody struct { TaskListID string `form:"taskListID" json:"taskListID" xml:"taskListID"` } -// TaskListResultMultiStatusResponseBody is the type of the "taskList" service -// "TaskListResult" endpoint HTTP response body. -type TaskListResultMultiStatusResponseBody struct { +// TaskListStatusMultiStatusResponseBody is the type of the "taskList" service +// "TaskListStatus" endpoint HTTP response body. +type TaskListStatusMultiStatusResponseBody struct { // Unique taskList identifier. ID string `form:"id" json:"id" xml:"id"` // Current status of the taskList @@ -29,9 +29,9 @@ type TaskListResultMultiStatusResponseBody struct { Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"` } -// TaskListResultCreatedResponseBody is the type of the "taskList" service -// "TaskListResult" endpoint HTTP response body. -type TaskListResultCreatedResponseBody struct { +// TaskListStatusCreatedResponseBody is the type of the "taskList" service +// "TaskListStatus" endpoint HTTP response body. +type TaskListStatusCreatedResponseBody struct { // Unique taskList identifier. ID string `form:"id" json:"id" xml:"id"` // Current status of the taskList @@ -40,9 +40,9 @@ type TaskListResultCreatedResponseBody struct { Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"` } -// TaskListResultAcceptedResponseBody is the type of the "taskList" service -// "TaskListResult" endpoint HTTP response body. -type TaskListResultAcceptedResponseBody struct { +// TaskListStatusAcceptedResponseBody is the type of the "taskList" service +// "TaskListStatus" endpoint HTTP response body. +type TaskListStatusAcceptedResponseBody struct { // Unique taskList identifier. ID string `form:"id" json:"id" xml:"id"` // Current status of the taskList @@ -51,9 +51,9 @@ type TaskListResultAcceptedResponseBody struct { Groups []*GroupStatusResponseBody `form:"groups,omitempty" json:"groups,omitempty" xml:"groups,omitempty"` } -// TaskListResultOKResponseBody is the type of the "taskList" service -// "TaskListResult" endpoint HTTP response body. -type TaskListResultOKResponseBody struct { +// TaskListStatusOKResponseBody is the type of the "taskList" service +// "TaskListStatus" endpoint HTTP response body. +type TaskListStatusOKResponseBody struct { // Unique taskList identifier. ID string `form:"id" json:"id" xml:"id"` // Current status of the taskList @@ -89,10 +89,10 @@ func NewCreateResponseBody(res *tasklist.CreateTaskListResult) *CreateResponseBo return body } -// NewTaskListResultMultiStatusResponseBody builds the HTTP response body from -// the result of the "TaskListResult" endpoint of the "taskList" service. -func NewTaskListResultMultiStatusResponseBody(res *tasklist.TaskListStatus) *TaskListResultMultiStatusResponseBody { - body := &TaskListResultMultiStatusResponseBody{ +// NewTaskListStatusMultiStatusResponseBody builds the HTTP response body from +// the result of the "TaskListStatus" endpoint of the "taskList" service. +func NewTaskListStatusMultiStatusResponseBody(res *tasklist.TaskListStatusResponse) *TaskListStatusMultiStatusResponseBody { + body := &TaskListStatusMultiStatusResponseBody{ ID: res.ID, Status: res.Status, } @@ -105,10 +105,10 @@ func NewTaskListResultMultiStatusResponseBody(res *tasklist.TaskListStatus) *Tas return body } -// NewTaskListResultCreatedResponseBody builds the HTTP response body from the -// result of the "TaskListResult" endpoint of the "taskList" service. -func NewTaskListResultCreatedResponseBody(res *tasklist.TaskListStatus) *TaskListResultCreatedResponseBody { - body := &TaskListResultCreatedResponseBody{ +// NewTaskListStatusCreatedResponseBody builds the HTTP response body from the +// result of the "TaskListStatus" endpoint of the "taskList" service. +func NewTaskListStatusCreatedResponseBody(res *tasklist.TaskListStatusResponse) *TaskListStatusCreatedResponseBody { + body := &TaskListStatusCreatedResponseBody{ ID: res.ID, Status: res.Status, } @@ -121,10 +121,10 @@ func NewTaskListResultCreatedResponseBody(res *tasklist.TaskListStatus) *TaskLis return body } -// NewTaskListResultAcceptedResponseBody builds the HTTP response body from the -// result of the "TaskListResult" endpoint of the "taskList" service. -func NewTaskListResultAcceptedResponseBody(res *tasklist.TaskListStatus) *TaskListResultAcceptedResponseBody { - body := &TaskListResultAcceptedResponseBody{ +// NewTaskListStatusAcceptedResponseBody builds the HTTP response body from the +// result of the "TaskListStatus" endpoint of the "taskList" service. +func NewTaskListStatusAcceptedResponseBody(res *tasklist.TaskListStatusResponse) *TaskListStatusAcceptedResponseBody { + body := &TaskListStatusAcceptedResponseBody{ ID: res.ID, Status: res.Status, } @@ -137,10 +137,10 @@ func NewTaskListResultAcceptedResponseBody(res *tasklist.TaskListStatus) *TaskLi return body } -// NewTaskListResultOKResponseBody builds the HTTP response body from the -// result of the "TaskListResult" endpoint of the "taskList" service. -func NewTaskListResultOKResponseBody(res *tasklist.TaskListStatus) *TaskListResultOKResponseBody { - body := &TaskListResultOKResponseBody{ +// NewTaskListStatusOKResponseBody builds the HTTP response body from the +// result of the "TaskListStatus" endpoint of the "taskList" service. +func NewTaskListStatusOKResponseBody(res *tasklist.TaskListStatusResponse) *TaskListStatusOKResponseBody { + body := &TaskListStatusOKResponseBody{ ID: res.ID, Status: res.Status, } @@ -166,10 +166,10 @@ func NewCreateTaskListRequest(body interface{}, taskListName string, cacheNamesp return res } -// NewTaskListResultRequest builds a taskList service TaskListResult endpoint +// NewTaskListStatusRequest builds a taskList service TaskListStatus endpoint // payload. -func NewTaskListResultRequest(taskListID string) *tasklist.TaskListResultRequest { - v := &tasklist.TaskListResultRequest{} +func NewTaskListStatusRequest(taskListID string) *tasklist.TaskListStatusRequest { + v := &tasklist.TaskListStatusRequest{} v.TaskListID = taskListID return v diff --git a/gen/task_list/client.go b/gen/task_list/client.go index 72bb221fcd4488da8b6a33abd31996d26e399453..d877a52535b4c7ff6a6a8a8f5477b9d87bb34d96 100644 --- a/gen/task_list/client.go +++ b/gen/task_list/client.go @@ -16,14 +16,14 @@ import ( // Client is the "taskList" service client. type Client struct { CreateEndpoint goa.Endpoint - TaskListResultEndpoint goa.Endpoint + TaskListStatusEndpoint goa.Endpoint } // NewClient initializes a "taskList" service client given the endpoints. -func NewClient(create, taskListResult goa.Endpoint) *Client { +func NewClient(create, taskListStatus goa.Endpoint) *Client { return &Client{ CreateEndpoint: create, - TaskListResultEndpoint: taskListResult, + TaskListStatusEndpoint: taskListStatus, } } @@ -37,12 +37,12 @@ func (c *Client) Create(ctx context.Context, p *CreateTaskListRequest) (res *Cre return ires.(*CreateTaskListResult), nil } -// TaskListResult calls the "TaskListResult" endpoint of the "taskList" service. -func (c *Client) TaskListResult(ctx context.Context, p *TaskListResultRequest) (res *TaskListStatus, err error) { +// TaskListStatus calls the "TaskListStatus" endpoint of the "taskList" service. +func (c *Client) TaskListStatus(ctx context.Context, p *TaskListStatusRequest) (res *TaskListStatusResponse, err error) { var ires interface{} - ires, err = c.TaskListResultEndpoint(ctx, p) + ires, err = c.TaskListStatusEndpoint(ctx, p) if err != nil { return } - return ires.(*TaskListStatus), nil + return ires.(*TaskListStatusResponse), nil } diff --git a/gen/task_list/endpoints.go b/gen/task_list/endpoints.go index 7af1fef229827f5d823f5848edbb4274dbd77e00..98659ce6197c558b4a80e649eb887da4d3ee90df 100644 --- a/gen/task_list/endpoints.go +++ b/gen/task_list/endpoints.go @@ -16,21 +16,21 @@ import ( // Endpoints wraps the "taskList" service endpoints. type Endpoints struct { Create goa.Endpoint - TaskListResult goa.Endpoint + TaskListStatus goa.Endpoint } // NewEndpoints wraps the methods of the "taskList" service with endpoints. func NewEndpoints(s Service) *Endpoints { return &Endpoints{ Create: NewCreateEndpoint(s), - TaskListResult: NewTaskListResultEndpoint(s), + TaskListStatus: NewTaskListStatusEndpoint(s), } } // Use applies the given middleware to all the "taskList" service endpoints. func (e *Endpoints) Use(m func(goa.Endpoint) goa.Endpoint) { e.Create = m(e.Create) - e.TaskListResult = m(e.TaskListResult) + e.TaskListStatus = m(e.TaskListStatus) } // NewCreateEndpoint returns an endpoint function that calls the method @@ -42,11 +42,11 @@ func NewCreateEndpoint(s Service) goa.Endpoint { } } -// NewTaskListResultEndpoint returns an endpoint function that calls the method -// "TaskListResult" of service "taskList". -func NewTaskListResultEndpoint(s Service) goa.Endpoint { +// NewTaskListStatusEndpoint returns an endpoint function that calls the method +// "TaskListStatus" of service "taskList". +func NewTaskListStatusEndpoint(s Service) goa.Endpoint { return func(ctx context.Context, req interface{}) (interface{}, error) { - p := req.(*TaskListResultRequest) - return s.TaskListResult(ctx, p) + p := req.(*TaskListStatusRequest) + return s.TaskListStatus(ctx, p) } } diff --git a/gen/task_list/service.go b/gen/task_list/service.go index 7d8d7f7d82c20b6578c598c6d55ccbcaf486319d..3c82eda7634d6f616ff5315d4eae1fb862397157 100644 --- a/gen/task_list/service.go +++ b/gen/task_list/service.go @@ -16,9 +16,9 @@ type Service interface { // Create a task list and corresponding tasks and put them in respective queues // for execution. Create(context.Context, *CreateTaskListRequest) (res *CreateTaskListResult, err error) - // TaskListResult retrieves a taskList result containing all tasks' unique IDs + // TaskListStatus retrieves a taskList status containing all tasks' unique IDs // and statuses from the Cache service. - TaskListResult(context.Context, *TaskListResultRequest) (res *TaskListStatus, err error) + TaskListStatus(context.Context, *TaskListStatusRequest) (res *TaskListStatusResponse, err error) } // ServiceName is the name of the service as defined in the design. This is the @@ -29,7 +29,7 @@ const ServiceName = "taskList" // MethodNames lists the service method names as defined in the design. These // are the same values that are set in the endpoint request contexts under the // MethodKey key. -var MethodNames = [2]string{"Create", "TaskListResult"} +var MethodNames = [2]string{"Create", "TaskListStatus"} // CreateTaskListRequest is the payload type of the taskList service Create // method. @@ -60,16 +60,16 @@ type GroupStatus struct { Tasks []*TaskStatus } -// TaskListResultRequest is the payload type of the taskList service -// TaskListResult method. -type TaskListResultRequest struct { +// TaskListStatusRequest is the payload type of the taskList service +// TaskListStatus method. +type TaskListStatusRequest struct { // Unique taskList identifier. TaskListID string } -// TaskListStatus is the result type of the taskList service TaskListResult -// method. -type TaskListStatus struct { +// TaskListStatusResponse is the result type of the taskList service +// TaskListStatus method. +type TaskListStatusResponse struct { // Unique taskList identifier. ID string // Current status of the taskList diff --git a/internal/listexecutor/listexecutor.go b/internal/listexecutor/listexecutor.go index b05bad414c12af2880cfce1296ea5c4473bbe1eb..29615ad89a23598290f01e7b0e9055485d74e1a0 100644 --- a/internal/listexecutor/listexecutor.go +++ b/internal/listexecutor/listexecutor.go @@ -3,6 +3,7 @@ package listexecutor import ( "bytes" "context" + "encoding/json" "io" "net/http" "sync" @@ -11,6 +12,8 @@ import ( "go.uber.org/zap" "code.vereign.com/gaiax/tsa/golib/errors" + "code.vereign.com/gaiax/tsa/golib/ptr" + goatasklist "code.vereign.com/gaiax/tsa/task/gen/task_list" taskpkg "code.vereign.com/gaiax/tsa/task/internal/service/task" "code.vereign.com/gaiax/tsa/task/internal/service/tasklist" ) @@ -125,13 +128,17 @@ func (l *ListExecutor) Execute(ctx context.Context, list *tasklist.TaskList) { list.State = taskpkg.Pending list.StartedAt = time.Now() + var state goatasklist.TaskListStatusResponse + // execute groups sequentially for i := range list.Groups { - if err := l.executeGroup(ctx, &list.Groups[i]); err != nil { + groupState, err := l.executeGroup(ctx, &list.Groups[i]) + if err != nil { logger.Error("error executing group", zap.Error(err)) list.Groups[i].State = taskpkg.Failed list.State = taskpkg.Failed } + state.Groups = append(state.Groups, groupState) } if list.State != taskpkg.Failed { @@ -139,6 +146,20 @@ func (l *ListExecutor) Execute(ctx context.Context, list *tasklist.TaskList) { } list.FinishedAt = time.Now() + state.ID = list.ID + state.Status = string(list.State) + + value, err := json.Marshal(state) + if err != nil { + logger.Error("error marshaling taskList state", zap.Error(err)) + } else { + if err := l.cache.Set(ctx, list.ID, list.CacheNamespace, list.CacheScope, value); err != nil { + logger.Error("error storing taskList state in cache", zap.Error(err)) + } else { + logger.Debug("taskList state is stored in cache") + } + } + if err := l.storage.SaveTaskListHistory(ctx, list); err != nil { logger.Error("error saving taskList history", zap.Error(err)) } else { @@ -150,7 +171,7 @@ func (l *ListExecutor) Execute(ctx context.Context, list *tasklist.TaskList) { } } -func (l *ListExecutor) executeGroup(ctx context.Context, group *tasklist.Group) error { +func (l *ListExecutor) executeGroup(ctx context.Context, group *tasklist.Group) (*goatasklist.GroupStatus, error) { switch exec := group.Execution; exec { case sequential: return l.executeSequential(ctx, group) @@ -158,19 +179,22 @@ func (l *ListExecutor) executeGroup(ctx context.Context, group *tasklist.Group) return l.executeParallel(ctx, group) } - return errors.New("unknown type of group execution") + return nil, errors.New("unknown type of group execution") } -func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Group) error { +func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Group) (*goatasklist.GroupStatus, error) { group.State = taskpkg.Pending + var state goatasklist.GroupStatus tasks, err := l.storage.GetGroupTasks(ctx, group) if err != nil { - return err + return nil, err } req := group.Request for _, task := range tasks { + taskState := goatasklist.TaskStatus{ID: &task.ID} + logger := l.logger.With( zap.String("taskID", task.ID), zap.String("taskName", task.Name), @@ -179,6 +203,8 @@ func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Gr // mark all subsequent tasks as failed if one task already failed if group.State == taskpkg.Failed { task.State = taskpkg.Failed + taskState.Status = ptr.String(taskpkg.Failed) + state.Tasks = append(state.Tasks, &taskState) continue } @@ -186,12 +212,17 @@ func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Gr err := l.executeTask(ctx, task) if err != nil { task.State = taskpkg.Failed + taskState.Status = ptr.String(taskpkg.Failed) + state.Tasks = append(state.Tasks, &taskState) group.State = taskpkg.Failed logger.Error("error executing task", zap.Error(err)) continue } logger.Debug("task execution completed successfully") + taskState.Status = ptr.String(string(task.State)) + state.Tasks = append(state.Tasks, &taskState) + // pass the response from current task as an input to the next task req = task.Response @@ -223,21 +254,29 @@ func (l *ListExecutor) executeSequential(ctx context.Context, group *tasklist.Gr group.State = taskpkg.Done } - return nil + state.ID = &group.ID + state.Status = ptr.String(string(group.State)) + + return &state, nil } -func (l *ListExecutor) executeParallel(ctx context.Context, group *tasklist.Group) error { +func (l *ListExecutor) executeParallel(ctx context.Context, group *tasklist.Group) (*goatasklist.GroupStatus, error) { group.State = taskpkg.Pending + var state goatasklist.GroupStatus tasks, err := l.storage.GetGroupTasks(ctx, group) if err != nil { - return err + return nil, err } var wg sync.WaitGroup for _, task := range tasks { wg.Add(1) go func(t *taskpkg.Task) { + taskState := goatasklist.TaskStatus{ + ID: &t.ID, + } + defer wg.Done() logger := l.logger.With( zap.String("taskID", t.ID), @@ -248,12 +287,17 @@ func (l *ListExecutor) executeParallel(ctx context.Context, group *tasklist.Grou if err := l.executeTask(ctx, t); err != nil { t.State = taskpkg.Failed + taskState.Status = ptr.String(taskpkg.Failed) + state.Tasks = append(state.Tasks, &taskState) group.State = taskpkg.Failed logger.Error("error executing task", zap.Error(err)) return } logger.Debug("task execution completed successfully") + taskState.Status = ptr.String(string(t.State)) + state.Tasks = append(state.Tasks, &taskState) + if err := l.cache.Set( ctx, t.ID, @@ -286,7 +330,10 @@ func (l *ListExecutor) executeParallel(ctx context.Context, group *tasklist.Grou group.State = taskpkg.Done } - return nil + state.ID = &group.ID + state.Status = ptr.String(string(group.State)) + + return &state, nil } func (l *ListExecutor) executeTask(ctx context.Context, task *taskpkg.Task) error { diff --git a/internal/service/tasklist/service.go b/internal/service/tasklist/service.go index 5542a7d24eace9e0d4782eea171151a4a46b4603..2fc94f5d4131a4938d7cba593fe0a3ab9cfe5d6d 100644 --- a/internal/service/tasklist/service.go +++ b/internal/service/tasklist/service.go @@ -1,6 +1,7 @@ package tasklist import ( + "bytes" "context" "encoding/json" "time" @@ -9,34 +10,45 @@ import ( "go.uber.org/zap" "code.vereign.com/gaiax/tsa/golib/errors" + "code.vereign.com/gaiax/tsa/golib/ptr" goatasklist "code.vereign.com/gaiax/tsa/task/gen/task_list" "code.vereign.com/gaiax/tsa/task/internal/service/task" ) //go:generate counterfeiter . Storage //go:generate counterfeiter . Queue +//go:generate counterfeiter . Cache // Storage for retrieving predefined task templates. type Storage interface { TaskListTemplate(ctx context.Context, taskListName string) (*Template, error) TaskTemplates(ctx context.Context, names []string) (map[string]*task.Task, error) + TaskList(ctx context.Context, taskListID string) (*TaskList, error) + TaskListHistory(ctx context.Context, taskListID string) (*TaskList, error) + GetGroupTasks(ctx context.Context, group *Group) ([]*task.Task, error) } type Queue interface { AddTaskList(ctx context.Context, taskList *TaskList, tasks []*task.Task) error } +type Cache interface { + Get(ctx context.Context, key, namespace, scope string) ([]byte, error) +} + type Service struct { storage Storage queue Queue + cache Cache logger *zap.Logger } -func New(template Storage, queue Queue, logger *zap.Logger) *Service { +func New(template Storage, queue Queue, cache Cache, logger *zap.Logger) *Service { return &Service{ storage: template, queue: queue, + cache: cache, logger: logger, } } @@ -105,6 +117,59 @@ func (s *Service) Create(ctx context.Context, req *goatasklist.CreateTaskListReq }, nil } +// TaskListStatus retrieves a taskList result containing all tasks' unique IDs +// and statuses from the Cache service. +func (s *Service) TaskListStatus(ctx context.Context, req *goatasklist.TaskListStatusRequest) (res *goatasklist.TaskListStatusResponse, err error) { + if req.TaskListID == "" { + return nil, errors.New(errors.BadRequest, "missing taskListID") + } + + logger := s.logger.With(zap.String("taskListID", req.TaskListID)) + + var list *TaskList + list, err = s.storage.TaskListHistory(ctx, req.TaskListID) + if err != nil && !errors.Is(errors.NotFound, err) { + logger.Error("error getting taskList from history collection", zap.Error(err)) + return nil, err + } + + if list == nil { + list, err = s.storage.TaskList(ctx, req.TaskListID) + if err != nil { + if errors.Is(errors.NotFound, err) { + return nil, errors.New("taskList is not found", err) + } + logger.Error("error getting taskList from taskLists collection", zap.Error(err)) + return nil, err + } + } + + var result *goatasklist.TaskListStatusResponse + if list.State != task.Done && list.State != task.Failed { + // taskList is not executed yet + result, err = s.calculateState(ctx, list) + if err != nil { + logger.Error("error calculating taskList state", zap.Error(err)) + return nil, err + } + } else { + // taskList is already executed + var value []byte + value, err = s.cache.Get(ctx, list.ID, list.CacheNamespace, list.CacheScope) + if err != nil { + logger.Error("error getting taskList result from cache", zap.Error(err)) + return nil, err + } + + if err := json.NewDecoder(bytes.NewReader(value)).Decode(&result); err != nil { + logger.Error("error decoding result from cache", zap.Error(err)) + return nil, errors.New("error decoding result from cache", err) + } + } + + return result, nil +} + func createGroups(t *Template, req []byte) []Group { var groups []Group for _, group := range t.Groups { @@ -163,6 +228,36 @@ func createTasks(t *TaskList, templates map[string]*task.Task) ([]*task.Task, er return tasks, nil } +func (s *Service) calculateState(ctx context.Context, list *TaskList) (*goatasklist.TaskListStatusResponse, error) { + result := &goatasklist.TaskListStatusResponse{ + ID: list.ID, + Status: string(list.State), + } + + for i := range list.Groups { + groupState := goatasklist.GroupStatus{ + ID: &list.Groups[i].ID, + Status: ptr.String(string(list.Groups[i].State)), + } + + tasks, err := s.storage.GetGroupTasks(ctx, &list.Groups[i]) + if err != nil { + return nil, err + } + for j := range tasks { + taskState := goatasklist.TaskStatus{ + ID: &tasks[j].ID, + Status: ptr.String(string(tasks[j].State)), + } + groupState.Tasks = append(groupState.Tasks, &taskState) + } + + result.Groups = append(result.Groups, &groupState) + } + + return result, nil +} + // taskNamesFromTaskListTemplate returns the names of all tasks within // one taskList template func taskNamesFromTaskListTemplate(template *Template) []string { diff --git a/internal/service/tasklist/service_test.go b/internal/service/tasklist/service_test.go index 9dd3b39e39b25076f55f206661264627f2917c07..7e71903497891b26408f6876a134e4ab6d05a336 100644 --- a/internal/service/tasklist/service_test.go +++ b/internal/service/tasklist/service_test.go @@ -15,7 +15,7 @@ import ( ) func TestNew(t *testing.T) { - svc := tasklist.New(nil, nil, zap.NewNop()) + svc := tasklist.New(nil, nil, nil, zap.NewNop()) assert.Implements(t, (*goatasklist.Service)(nil), svc) } @@ -120,7 +120,7 @@ func Test_Create(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - svc := tasklist.New(test.storage, test.queue, zap.NewNop()) + svc := tasklist.New(test.storage, test.queue, nil, zap.NewNop()) res, err := svc.Create(context.Background(), test.req) if err != nil { assert.NotEmpty(t, test.errtext) @@ -138,3 +138,181 @@ func Test_Create(t *testing.T) { }) } } + +func Test_TaskListStatus(t *testing.T) { + tests := []struct { + name string + req *goatasklist.TaskListStatusRequest + storage *tasklistfakes.FakeStorage + queue *tasklistfakes.FakeQueue + cache *tasklistfakes.FakeCache + + errkind errors.Kind + errtext string + }{ + { + name: "missing taskList ID", + req: &goatasklist.TaskListStatusRequest{}, + errkind: errors.BadRequest, + errtext: "missing taskListID", + }, + { + name: "error getting taskList form history collection", + req: &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"}, + storage: &tasklistfakes.FakeStorage{ + TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return nil, errors.New("some error") + }, + }, + errkind: errors.Unknown, + errtext: "some error", + }, + { + name: "taskList not found", + req: &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"}, + storage: &tasklistfakes.FakeStorage{ + TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return nil, errors.New(errors.NotFound) + }, + TaskListStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return nil, errors.New(errors.NotFound) + }, + }, + errkind: errors.NotFound, + errtext: "taskList is not found", + }, + { + name: "error getting taskList from taskLists collection", + req: &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"}, + storage: &tasklistfakes.FakeStorage{ + TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return nil, errors.New(errors.NotFound) + }, + TaskListStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return nil, errors.New("some error") + }, + }, + errkind: errors.Unknown, + errtext: "some error", + }, + { + name: "error calculating taskList state", + req: &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"}, + storage: &tasklistfakes.FakeStorage{ + TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return pendingTaskList, nil + }, + GetGroupTasksStub: func(ctx context.Context, group *tasklist.Group) ([]*task.Task, error) { + return nil, errors.New("some error") + }, + }, + errkind: errors.Unknown, + errtext: "some error", + }, + { + name: "error getting taskList from cache", + req: &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"}, + storage: &tasklistfakes.FakeStorage{ + TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return doneTaskList, nil + }, + }, + cache: &tasklistfakes.FakeCache{ + GetStub: func(ctx context.Context, key, namespace, scope string) ([]byte, error) { + return nil, errors.New("some cache error") + }, + }, + errkind: errors.Unknown, + errtext: "some cache error", + }, + { + name: "successfully get taskList state on pending task", + req: &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"}, + storage: &tasklistfakes.FakeStorage{ + TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return pendingTaskList, nil + }, + GetGroupTasksStub: func(ctx context.Context, group *tasklist.Group) ([]*task.Task, error) { + return []*task.Task{}, nil + }, + }, + }, + { + name: "successfully get taskList state on executed task", + req: &goatasklist.TaskListStatusRequest{TaskListID: "d16996cd-1977-42a9-90b2-b4548a35c1b4"}, + storage: &tasklistfakes.FakeStorage{ + TaskListHistoryStub: func(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + return doneTaskList, nil + }, + }, + cache: &tasklistfakes.FakeCache{ + GetStub: func(ctx context.Context, key, namespace, scope string) ([]byte, error) { + return doneTaskState, nil + }, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + svc := tasklist.New(test.storage, test.queue, test.cache, zap.NewNop()) + res, err := svc.TaskListStatus(context.Background(), test.req) + if err != nil { + assert.NotEmpty(t, test.errtext) + e, ok := err.(*errors.Error) + assert.True(t, ok) + assert.Equal(t, test.errkind, e.Kind) + assert.Contains(t, e.Error(), test.errtext) + assert.Nil(t, res) + } else { + assert.Empty(t, test.errtext) + assert.NotNil(t, res) + assert.NotEmpty(t, res.ID) + assert.NotEmpty(t, res.Status) + assert.NotEmpty(t, res.Groups) + } + }) + } +} + +//nolint:gosec +var pendingTaskList = &tasklist.TaskList{ + ID: "16996cd-1977-42a9-90b2-b4548a35c1b4", + State: "pending", + Groups: []tasklist.Group{ + { + ID: "074076d5-c995-4d2d-8d38-da57360453d4", + Tasks: []string{"createdTask", "createdTask2"}, + State: "created", + }, + }, +} + +//nolint:gosec +var doneTaskList = &tasklist.TaskList{ + ID: "16996cd-1977-42a9-90b2-b4548a35c1b4", + State: "done", +} + +//nolint:gosec +var doneTaskState = []byte(`{ + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "done", + "groups": [ + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "type": "sequential", + "status": "done", + "tasks": [ + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "done" + }, + { + "id": "ad641603-1ca0-4342-ad73-d70a6b1ec502", + "status": "done" + } + ] + } + ] +}`) diff --git a/internal/service/tasklist/tasklistfakes/fake_cache.go b/internal/service/tasklist/tasklistfakes/fake_cache.go new file mode 100644 index 0000000000000000000000000000000000000000..2f636bdb059b5e8cc84bd827b91bbc65e67a8d37 --- /dev/null +++ b/internal/service/tasklist/tasklistfakes/fake_cache.go @@ -0,0 +1,123 @@ +// Code generated by counterfeiter. DO NOT EDIT. +package tasklistfakes + +import ( + "context" + "sync" + + "code.vereign.com/gaiax/tsa/task/internal/service/tasklist" +) + +type FakeCache struct { + GetStub func(context.Context, string, string, string) ([]byte, error) + getMutex sync.RWMutex + getArgsForCall []struct { + arg1 context.Context + arg2 string + arg3 string + arg4 string + } + getReturns struct { + result1 []byte + result2 error + } + getReturnsOnCall map[int]struct { + result1 []byte + result2 error + } + invocations map[string][][]interface{} + invocationsMutex sync.RWMutex +} + +func (fake *FakeCache) Get(arg1 context.Context, arg2 string, arg3 string, arg4 string) ([]byte, error) { + fake.getMutex.Lock() + ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)] + fake.getArgsForCall = append(fake.getArgsForCall, struct { + arg1 context.Context + arg2 string + arg3 string + arg4 string + }{arg1, arg2, arg3, arg4}) + stub := fake.GetStub + fakeReturns := fake.getReturns + fake.recordInvocation("Get", []interface{}{arg1, arg2, arg3, arg4}) + fake.getMutex.Unlock() + if stub != nil { + return stub(arg1, arg2, arg3, arg4) + } + if specificReturn { + return ret.result1, ret.result2 + } + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeCache) GetCallCount() int { + fake.getMutex.RLock() + defer fake.getMutex.RUnlock() + return len(fake.getArgsForCall) +} + +func (fake *FakeCache) GetCalls(stub func(context.Context, string, string, string) ([]byte, error)) { + fake.getMutex.Lock() + defer fake.getMutex.Unlock() + fake.GetStub = stub +} + +func (fake *FakeCache) GetArgsForCall(i int) (context.Context, string, string, string) { + fake.getMutex.RLock() + defer fake.getMutex.RUnlock() + argsForCall := fake.getArgsForCall[i] + return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 +} + +func (fake *FakeCache) GetReturns(result1 []byte, result2 error) { + fake.getMutex.Lock() + defer fake.getMutex.Unlock() + fake.GetStub = nil + fake.getReturns = struct { + result1 []byte + result2 error + }{result1, result2} +} + +func (fake *FakeCache) GetReturnsOnCall(i int, result1 []byte, result2 error) { + fake.getMutex.Lock() + defer fake.getMutex.Unlock() + fake.GetStub = nil + if fake.getReturnsOnCall == nil { + fake.getReturnsOnCall = make(map[int]struct { + result1 []byte + result2 error + }) + } + fake.getReturnsOnCall[i] = struct { + result1 []byte + result2 error + }{result1, result2} +} + +func (fake *FakeCache) Invocations() map[string][][]interface{} { + fake.invocationsMutex.RLock() + defer fake.invocationsMutex.RUnlock() + fake.getMutex.RLock() + defer fake.getMutex.RUnlock() + copiedInvocations := map[string][][]interface{}{} + for key, value := range fake.invocations { + copiedInvocations[key] = value + } + return copiedInvocations +} + +func (fake *FakeCache) recordInvocation(key string, args []interface{}) { + fake.invocationsMutex.Lock() + defer fake.invocationsMutex.Unlock() + if fake.invocations == nil { + fake.invocations = map[string][][]interface{}{} + } + if fake.invocations[key] == nil { + fake.invocations[key] = [][]interface{}{} + } + fake.invocations[key] = append(fake.invocations[key], args) +} + +var _ tasklist.Cache = new(FakeCache) diff --git a/internal/service/tasklist/tasklistfakes/fake_storage.go b/internal/service/tasklist/tasklistfakes/fake_storage.go index 9ece29b9180862d8281bd5759b4104ff9a731e67..4dd7cf097593ba40b96d8e9ea7731d96914d1a19 100644 --- a/internal/service/tasklist/tasklistfakes/fake_storage.go +++ b/internal/service/tasklist/tasklistfakes/fake_storage.go @@ -10,6 +10,48 @@ import ( ) type FakeStorage struct { + GetGroupTasksStub func(context.Context, *tasklist.Group) ([]*task.Task, error) + getGroupTasksMutex sync.RWMutex + getGroupTasksArgsForCall []struct { + arg1 context.Context + arg2 *tasklist.Group + } + getGroupTasksReturns struct { + result1 []*task.Task + result2 error + } + getGroupTasksReturnsOnCall map[int]struct { + result1 []*task.Task + result2 error + } + TaskListStub func(context.Context, string) (*tasklist.TaskList, error) + taskListMutex sync.RWMutex + taskListArgsForCall []struct { + arg1 context.Context + arg2 string + } + taskListReturns struct { + result1 *tasklist.TaskList + result2 error + } + taskListReturnsOnCall map[int]struct { + result1 *tasklist.TaskList + result2 error + } + TaskListHistoryStub func(context.Context, string) (*tasklist.TaskList, error) + taskListHistoryMutex sync.RWMutex + taskListHistoryArgsForCall []struct { + arg1 context.Context + arg2 string + } + taskListHistoryReturns struct { + result1 *tasklist.TaskList + result2 error + } + taskListHistoryReturnsOnCall map[int]struct { + result1 *tasklist.TaskList + result2 error + } TaskListTemplateStub func(context.Context, string) (*tasklist.Template, error) taskListTemplateMutex sync.RWMutex taskListTemplateArgsForCall []struct { @@ -42,6 +84,201 @@ type FakeStorage struct { invocationsMutex sync.RWMutex } +func (fake *FakeStorage) GetGroupTasks(arg1 context.Context, arg2 *tasklist.Group) ([]*task.Task, error) { + fake.getGroupTasksMutex.Lock() + ret, specificReturn := fake.getGroupTasksReturnsOnCall[len(fake.getGroupTasksArgsForCall)] + fake.getGroupTasksArgsForCall = append(fake.getGroupTasksArgsForCall, struct { + arg1 context.Context + arg2 *tasklist.Group + }{arg1, arg2}) + stub := fake.GetGroupTasksStub + fakeReturns := fake.getGroupTasksReturns + fake.recordInvocation("GetGroupTasks", []interface{}{arg1, arg2}) + fake.getGroupTasksMutex.Unlock() + if stub != nil { + return stub(arg1, arg2) + } + if specificReturn { + return ret.result1, ret.result2 + } + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeStorage) GetGroupTasksCallCount() int { + fake.getGroupTasksMutex.RLock() + defer fake.getGroupTasksMutex.RUnlock() + return len(fake.getGroupTasksArgsForCall) +} + +func (fake *FakeStorage) GetGroupTasksCalls(stub func(context.Context, *tasklist.Group) ([]*task.Task, error)) { + fake.getGroupTasksMutex.Lock() + defer fake.getGroupTasksMutex.Unlock() + fake.GetGroupTasksStub = stub +} + +func (fake *FakeStorage) GetGroupTasksArgsForCall(i int) (context.Context, *tasklist.Group) { + fake.getGroupTasksMutex.RLock() + defer fake.getGroupTasksMutex.RUnlock() + argsForCall := fake.getGroupTasksArgsForCall[i] + return argsForCall.arg1, argsForCall.arg2 +} + +func (fake *FakeStorage) GetGroupTasksReturns(result1 []*task.Task, result2 error) { + fake.getGroupTasksMutex.Lock() + defer fake.getGroupTasksMutex.Unlock() + fake.GetGroupTasksStub = nil + fake.getGroupTasksReturns = struct { + result1 []*task.Task + result2 error + }{result1, result2} +} + +func (fake *FakeStorage) GetGroupTasksReturnsOnCall(i int, result1 []*task.Task, result2 error) { + fake.getGroupTasksMutex.Lock() + defer fake.getGroupTasksMutex.Unlock() + fake.GetGroupTasksStub = nil + if fake.getGroupTasksReturnsOnCall == nil { + fake.getGroupTasksReturnsOnCall = make(map[int]struct { + result1 []*task.Task + result2 error + }) + } + fake.getGroupTasksReturnsOnCall[i] = struct { + result1 []*task.Task + result2 error + }{result1, result2} +} + +func (fake *FakeStorage) TaskList(arg1 context.Context, arg2 string) (*tasklist.TaskList, error) { + fake.taskListMutex.Lock() + ret, specificReturn := fake.taskListReturnsOnCall[len(fake.taskListArgsForCall)] + fake.taskListArgsForCall = append(fake.taskListArgsForCall, struct { + arg1 context.Context + arg2 string + }{arg1, arg2}) + stub := fake.TaskListStub + fakeReturns := fake.taskListReturns + fake.recordInvocation("TaskList", []interface{}{arg1, arg2}) + fake.taskListMutex.Unlock() + if stub != nil { + return stub(arg1, arg2) + } + if specificReturn { + return ret.result1, ret.result2 + } + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeStorage) TaskListCallCount() int { + fake.taskListMutex.RLock() + defer fake.taskListMutex.RUnlock() + return len(fake.taskListArgsForCall) +} + +func (fake *FakeStorage) TaskListCalls(stub func(context.Context, string) (*tasklist.TaskList, error)) { + fake.taskListMutex.Lock() + defer fake.taskListMutex.Unlock() + fake.TaskListStub = stub +} + +func (fake *FakeStorage) TaskListArgsForCall(i int) (context.Context, string) { + fake.taskListMutex.RLock() + defer fake.taskListMutex.RUnlock() + argsForCall := fake.taskListArgsForCall[i] + return argsForCall.arg1, argsForCall.arg2 +} + +func (fake *FakeStorage) TaskListReturns(result1 *tasklist.TaskList, result2 error) { + fake.taskListMutex.Lock() + defer fake.taskListMutex.Unlock() + fake.TaskListStub = nil + fake.taskListReturns = struct { + result1 *tasklist.TaskList + result2 error + }{result1, result2} +} + +func (fake *FakeStorage) TaskListReturnsOnCall(i int, result1 *tasklist.TaskList, result2 error) { + fake.taskListMutex.Lock() + defer fake.taskListMutex.Unlock() + fake.TaskListStub = nil + if fake.taskListReturnsOnCall == nil { + fake.taskListReturnsOnCall = make(map[int]struct { + result1 *tasklist.TaskList + result2 error + }) + } + fake.taskListReturnsOnCall[i] = struct { + result1 *tasklist.TaskList + result2 error + }{result1, result2} +} + +func (fake *FakeStorage) TaskListHistory(arg1 context.Context, arg2 string) (*tasklist.TaskList, error) { + fake.taskListHistoryMutex.Lock() + ret, specificReturn := fake.taskListHistoryReturnsOnCall[len(fake.taskListHistoryArgsForCall)] + fake.taskListHistoryArgsForCall = append(fake.taskListHistoryArgsForCall, struct { + arg1 context.Context + arg2 string + }{arg1, arg2}) + stub := fake.TaskListHistoryStub + fakeReturns := fake.taskListHistoryReturns + fake.recordInvocation("TaskListHistory", []interface{}{arg1, arg2}) + fake.taskListHistoryMutex.Unlock() + if stub != nil { + return stub(arg1, arg2) + } + if specificReturn { + return ret.result1, ret.result2 + } + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeStorage) TaskListHistoryCallCount() int { + fake.taskListHistoryMutex.RLock() + defer fake.taskListHistoryMutex.RUnlock() + return len(fake.taskListHistoryArgsForCall) +} + +func (fake *FakeStorage) TaskListHistoryCalls(stub func(context.Context, string) (*tasklist.TaskList, error)) { + fake.taskListHistoryMutex.Lock() + defer fake.taskListHistoryMutex.Unlock() + fake.TaskListHistoryStub = stub +} + +func (fake *FakeStorage) TaskListHistoryArgsForCall(i int) (context.Context, string) { + fake.taskListHistoryMutex.RLock() + defer fake.taskListHistoryMutex.RUnlock() + argsForCall := fake.taskListHistoryArgsForCall[i] + return argsForCall.arg1, argsForCall.arg2 +} + +func (fake *FakeStorage) TaskListHistoryReturns(result1 *tasklist.TaskList, result2 error) { + fake.taskListHistoryMutex.Lock() + defer fake.taskListHistoryMutex.Unlock() + fake.TaskListHistoryStub = nil + fake.taskListHistoryReturns = struct { + result1 *tasklist.TaskList + result2 error + }{result1, result2} +} + +func (fake *FakeStorage) TaskListHistoryReturnsOnCall(i int, result1 *tasklist.TaskList, result2 error) { + fake.taskListHistoryMutex.Lock() + defer fake.taskListHistoryMutex.Unlock() + fake.TaskListHistoryStub = nil + if fake.taskListHistoryReturnsOnCall == nil { + fake.taskListHistoryReturnsOnCall = make(map[int]struct { + result1 *tasklist.TaskList + result2 error + }) + } + fake.taskListHistoryReturnsOnCall[i] = struct { + result1 *tasklist.TaskList + result2 error + }{result1, result2} +} + func (fake *FakeStorage) TaskListTemplate(arg1 context.Context, arg2 string) (*tasklist.Template, error) { fake.taskListTemplateMutex.Lock() ret, specificReturn := fake.taskListTemplateReturnsOnCall[len(fake.taskListTemplateArgsForCall)] @@ -180,6 +417,12 @@ func (fake *FakeStorage) TaskTemplatesReturnsOnCall(i int, result1 map[string]*t func (fake *FakeStorage) Invocations() map[string][][]interface{} { fake.invocationsMutex.RLock() defer fake.invocationsMutex.RUnlock() + fake.getGroupTasksMutex.RLock() + defer fake.getGroupTasksMutex.RUnlock() + fake.taskListMutex.RLock() + defer fake.taskListMutex.RUnlock() + fake.taskListHistoryMutex.RLock() + defer fake.taskListHistoryMutex.RUnlock() fake.taskListTemplateMutex.RLock() defer fake.taskListTemplateMutex.RUnlock() fake.taskTemplatesMutex.RLock() diff --git a/internal/storage/storage.go b/internal/storage/storage.go index cc16df1cd4392949218e17a91b7ab8995395864d..4a8d1ffaf7089f11273e316f45336238d833579e 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -315,3 +315,45 @@ func (s *Storage) SaveTaskListHistory(ctx context.Context, taskList *tasklist.Ta b := backoff.WithContext(backoff.NewExponentialBackOff(), ctx) return backoff.Retry(insert, b) } + +// TaskList retrieves a tasklist.TaskList from taskLists collection by ID +func (s *Storage) TaskList(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + result := s.taskLists.FindOne(ctx, bson.M{ + "id": taskListID, + }) + + if result.Err() != nil { + if strings.Contains(result.Err().Error(), "no documents in result") { + return nil, errors.New(errors.NotFound, "taskList not found") + } + return nil, result.Err() + } + + var list tasklist.TaskList + if err := result.Decode(&list); err != nil { + return nil, err + } + + return &list, nil +} + +// TaskListHistory retrieves a tasklist.TaskList from taskListHistory collection by ID +func (s *Storage) TaskListHistory(ctx context.Context, taskListID string) (*tasklist.TaskList, error) { + result := s.taskListHistory.FindOne(ctx, bson.M{ + "id": taskListID, + }) + + if result.Err() != nil { + if strings.Contains(result.Err().Error(), "no documents in result") { + return nil, errors.New(errors.NotFound, "taskList not found") + } + return nil, result.Err() + } + + var list tasklist.TaskList + if err := result.Decode(&list); err != nil { + return nil, err + } + + return &list, nil +}