diff --git a/api-docs.yml b/api-docs.yml index 13a256234..c3501af9b 100644 --- a/api-docs.yml +++ b/api-docs.yml @@ -2429,6 +2429,19 @@ paths: - $ref: '#/parameters/project_id' - $ref: '#/parameters/task_id' get: + parameters: + - name: limit + in: query + required: false + type: integer + description: Maximum number of items to return. Use 0 to return all available items + x-example: 1000 + - name: offset + in: query + required: false + type: integer + description: Number of items to skip before starting to collect the result set. Defaults to 0. + x-example: 0 tags: - project summary: Get task output diff --git a/api/projects/tasks.go b/api/projects/tasks.go index df9d82949..b9151ffd0 100644 --- a/api/projects/tasks.go +++ b/api/projects/tasks.go @@ -3,15 +3,16 @@ package projects import ( "bytes" "errors" + "net/http" + "strconv" + "time" + "github.com/gorilla/context" "github.com/semaphoreui/semaphore/api/helpers" "github.com/semaphoreui/semaphore/db" "github.com/semaphoreui/semaphore/services/tasks" "github.com/semaphoreui/semaphore/util" log "github.com/sirupsen/logrus" - "net/http" - "strconv" - "time" ) // AddTask inserts a task into the database and returns a header or returns error @@ -145,8 +146,20 @@ func GetTaskOutput(w http.ResponseWriter, r *http.Request) { task := context.Get(r, "task").(db.Task) project := context.Get(r, "project").(db.Project) + limitStr := r.URL.Query().Get("limit") + limit, err := strconv.Atoi(limitStr) + if err != nil { + limit = 0 + } + + offsetStr := r.URL.Query().Get("offset") + offset, err := strconv.Atoi(offsetStr) + if err != nil { + offset = 0 + } + var output []db.TaskOutput - output, err := helpers.Store(r).GetTaskOutputs(project.ID, task.ID, db.RetrieveQueryParams{}) + output, err = helpers.Store(r).GetTaskOutputs(project.ID, task.ID, db.RetrieveQueryParams{Offset: offset, Count: limit}) if err != nil { util.LogErrorF(err, log.Fields{"error": "Bad request. Cannot get task output from database"}) diff --git a/web/package-lock.json b/web/package-lock.json index 2643a7857..d21d1be47 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -12,10 +12,9 @@ "ansi_up": "^6.0.2", "axios": "^1.8.3", "chart.js": "^3.8.0", - "chartjs-adapter-moment": "^1.0.1", "core-js": "^3.40.0", "cron-parser": "^4.9.0", - "moment": "^2.29.4", + "dayjs": "^1.11.13", "vue": "^2.6.14", "vue-chartjs": "^4.0.0", "vue-codemirror": "^4.0.6", @@ -4730,15 +4729,6 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" }, - "node_modules/chartjs-adapter-moment": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chartjs-adapter-moment/-/chartjs-adapter-moment-1.0.1.tgz", - "integrity": "sha512-Uz+nTX/GxocuqXpGylxK19YG4R3OSVf8326D+HwSTsNw1LgzyIGRo+Qujwro1wy6X+soNSnfj5t2vZ+r6EaDmA==", - "peerDependencies": { - "chart.js": ">=3.0.0", - "moment": "^2.10.2" - } - }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -5733,6 +5723,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -11489,14 +11485,6 @@ "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", "dev": true }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "engines": { - "node": "*" - } - }, "node_modules/mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -21374,12 +21362,6 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" }, - "chartjs-adapter-moment": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chartjs-adapter-moment/-/chartjs-adapter-moment-1.0.1.tgz", - "integrity": "sha512-Uz+nTX/GxocuqXpGylxK19YG4R3OSVf8326D+HwSTsNw1LgzyIGRo+Qujwro1wy6X+soNSnfj5t2vZ+r6EaDmA==", - "requires": {} - }, "check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -22113,6 +22095,11 @@ "is-data-view": "^1.0.1" } }, + "dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -26372,11 +26359,6 @@ "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", "dev": true }, - "moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" - }, "mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",