@@ -0,0 +1,34 @@ | |||
// Copyright 2023 The Gitea Authors. All rights reserved. | |||
// SPDX-License-Identifier: MIT | |||
package structs | |||
import ( | |||
"time" | |||
) | |||
// ActionTask represents a ActionTask | |||
type ActionTask struct { | |||
ID int64 `json:"id"` | |||
Name string `json:"name"` | |||
HeadBranch string `json:"head_branch"` | |||
HeadSha string `json:"head_sha"` | |||
RunNumber int64 `json:"run_number"` | |||
Event string `json:"event"` | |||
DisplayTitle string `json:"display_title"` | |||
Status string `json:"status"` | |||
WorkflowID string `json:"workflow_id"` | |||
URL string `json:"url"` | |||
// swagger:strfmt date-time | |||
CreatedAt time.Time `json:"created_at"` | |||
// swagger:strfmt date-time | |||
UpdatedAt time.Time `json:"updated_at"` | |||
// swagger:strfmt date-time | |||
RunStartedAt time.Time `json:"run_started_at"` | |||
} | |||
// ActionTaskResponse returns a ActionTask | |||
type ActionTaskResponse struct { | |||
Entries []*ActionTask `json:"workflow_runs"` | |||
TotalCount int64 `json:"total_count"` | |||
} |
@@ -1154,6 +1154,9 @@ func Routes() *web.Route { | |||
m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.CreateTagOption{}), repo.CreateTag) | |||
m.Delete("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, repo.DeleteTag) | |||
}, reqRepoReader(unit.TypeCode), context.ReferencesGitRepo(true)) | |||
m.Group("/actions", func() { | |||
m.Get("/tasks", repo.ListActionTasks) | |||
}, reqRepoReader(unit.TypeActions), context.ReferencesGitRepo(true)) | |||
m.Group("/keys", func() { | |||
m.Combo("").Get(repo.ListDeployKeys). | |||
Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey) |
@@ -0,0 +1,80 @@ | |||
// Copyright 2023 The Gitea Authors. All rights reserved. | |||
// SPDX-License-Identifier: MIT | |||
package repo | |||
import ( | |||
"net/http" | |||
actions_model "code.gitea.io/gitea/models/actions" | |||
"code.gitea.io/gitea/models/db" | |||
api "code.gitea.io/gitea/modules/structs" | |||
"code.gitea.io/gitea/routers/api/v1/utils" | |||
"code.gitea.io/gitea/services/context" | |||
"code.gitea.io/gitea/services/convert" | |||
) | |||
// ListActionTasks list all the actions of a repository | |||
func ListActionTasks(ctx *context.APIContext) { | |||
// swagger:operation GET /repos/{owner}/{repo}/actions/tasks repository ListActionTasks | |||
// --- | |||
// summary: List a repository's action tasks | |||
// produces: | |||
// - application/json | |||
// parameters: | |||
// - name: owner | |||
// in: path | |||
// description: owner of the repo | |||
// type: string | |||
// required: true | |||
// - name: repo | |||
// in: path | |||
// description: name of the repo | |||
// type: string | |||
// required: true | |||
// - name: page | |||
// in: query | |||
// description: page number of results to return (1-based) | |||
// type: integer | |||
// - name: limit | |||
// in: query | |||
// description: page size of results, default maximum page size is 50 | |||
// type: integer | |||
// responses: | |||
// "200": | |||
// "$ref": "#/responses/TasksList" | |||
// "400": | |||
// "$ref": "#/responses/error" | |||
// "403": | |||
// "$ref": "#/responses/forbidden" | |||
// "404": | |||
// "$ref": "#/responses/notFound" | |||
// "409": | |||
// "$ref": "#/responses/error" | |||
// "422": | |||
// "$ref": "#/responses/validationError" | |||
tasks, total, err := db.FindAndCount[actions_model.ActionTask](ctx, &actions_model.FindTaskOptions{ | |||
ListOptions: utils.GetListOptions(ctx), | |||
RepoID: ctx.Repo.Repository.ID, | |||
}) | |||
if err != nil { | |||
ctx.Error(http.StatusInternalServerError, "ListActionTasks", err) | |||
return | |||
} | |||
res := new(api.ActionTaskResponse) | |||
res.TotalCount = total | |||
res.Entries = make([]*api.ActionTask, len(tasks)) | |||
for i := range tasks { | |||
convertedTask, err := convert.ToActionTask(ctx, ctx.Repo.Repository, tasks[i]) | |||
if err != nil { | |||
ctx.Error(http.StatusInternalServerError, "ToActionTask", err) | |||
return | |||
} | |||
res.Entries[i] = convertedTask | |||
} | |||
ctx.JSON(http.StatusOK, &res) | |||
} |
@@ -415,6 +415,13 @@ type swaggerRepoNewIssuePinsAllowed struct { | |||
Body api.NewIssuePinsAllowed `json:"body"` | |||
} | |||
// TasksList | |||
// swagger:response TasksList | |||
type swaggerRepoTasksList struct { | |||
// in:body | |||
Body api.ActionTaskResponse `json:"body"` | |||
} | |||
// swagger:response Compare | |||
type swaggerCompare struct { | |||
// in:body |
@@ -11,6 +11,7 @@ import ( | |||
"strings" | |||
"time" | |||
actions_model "code.gitea.io/gitea/models/actions" | |||
asymkey_model "code.gitea.io/gitea/models/asymkey" | |||
"code.gitea.io/gitea/models/auth" | |||
git_model "code.gitea.io/gitea/models/git" | |||
@@ -24,6 +25,7 @@ import ( | |||
"code.gitea.io/gitea/modules/container" | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/setting" | |||
api "code.gitea.io/gitea/modules/structs" | |||
"code.gitea.io/gitea/modules/util" | |||
"code.gitea.io/gitea/services/gitdiff" | |||
@@ -193,6 +195,31 @@ func ToTag(repo *repo_model.Repository, t *git.Tag) *api.Tag { | |||
} | |||
} | |||
// ToActionTask convert a actions_model.ActionTask to an api.ActionTask | |||
func ToActionTask(ctx context.Context, repo *repo_model.Repository, t *actions_model.ActionTask) (*api.ActionTask, error) { | |||
if err := t.LoadAttributes(ctx); err != nil { | |||
return nil, err | |||
} | |||
url := strings.TrimSuffix(setting.AppURL, "/") + t.GetRunLink() | |||
return &api.ActionTask{ | |||
ID: t.ID, | |||
Name: t.Job.Name, | |||
HeadBranch: t.Job.Run.PrettyRef(), | |||
HeadSha: t.Job.CommitSHA, | |||
RunNumber: t.Job.Run.Index, | |||
Event: t.Job.Run.TriggerEvent, | |||
DisplayTitle: t.Job.Run.Title, | |||
Status: t.Status.String(), | |||
WorkflowID: t.Job.Run.WorkflowID, | |||
URL: url, | |||
CreatedAt: t.Created.AsLocalTime(), | |||
UpdatedAt: t.Updated.AsLocalTime(), | |||
RunStartedAt: t.Started.AsLocalTime(), | |||
}, nil | |||
} | |||
// ToVerification convert a git.Commit.Signature to an api.PayloadCommitVerification | |||
func ToVerification(ctx context.Context, c *git.Commit) *api.PayloadCommitVerification { | |||
verif := asymkey_model.ParseCommitWithSignature(ctx, c) |
@@ -3949,6 +3949,66 @@ | |||
} | |||
} | |||
}, | |||
"/repos/{owner}/{repo}/actions/tasks": { | |||
"get": { | |||
"produces": [ | |||
"application/json" | |||
], | |||
"tags": [ | |||
"repository" | |||
], | |||
"summary": "List a repository's action tasks", | |||
"operationId": "ListActionTasks", | |||
"parameters": [ | |||
{ | |||
"type": "string", | |||
"description": "owner of the repo", | |||
"name": "owner", | |||
"in": "path", | |||
"required": true | |||
}, | |||
{ | |||
"type": "string", | |||
"description": "name of the repo", | |||
"name": "repo", | |||
"in": "path", | |||
"required": true | |||
}, | |||
{ | |||
"type": "integer", | |||
"description": "page number of results to return (1-based)", | |||
"name": "page", | |||
"in": "query" | |||
}, | |||
{ | |||
"type": "integer", | |||
"description": "page size of results, default maximum page size is 50", | |||
"name": "limit", | |||
"in": "query" | |||
} | |||
], | |||
"responses": { | |||
"200": { | |||
"$ref": "#/responses/TasksList" | |||
}, | |||
"400": { | |||
"$ref": "#/responses/error" | |||
}, | |||
"403": { | |||
"$ref": "#/responses/forbidden" | |||
}, | |||
"404": { | |||
"$ref": "#/responses/notFound" | |||
}, | |||
"409": { | |||
"$ref": "#/responses/error" | |||
}, | |||
"422": { | |||
"$ref": "#/responses/validationError" | |||
} | |||
} | |||
} | |||
}, | |||
"/repos/{owner}/{repo}/actions/variables": { | |||
"get": { | |||
"produces": [ | |||
@@ -17905,6 +17965,89 @@ | |||
}, | |||
"x-go-package": "code.gitea.io/gitea/modules/structs" | |||
}, | |||
"ActionTask": { | |||
"description": "ActionTask represents a ActionTask", | |||
"type": "object", | |||
"properties": { | |||
"created_at": { | |||
"type": "string", | |||
"format": "date-time", | |||
"x-go-name": "CreatedAt" | |||
}, | |||
"display_title": { | |||
"type": "string", | |||
"x-go-name": "DisplayTitle" | |||
}, | |||
"event": { | |||
"type": "string", | |||
"x-go-name": "Event" | |||
}, | |||
"head_branch": { | |||
"type": "string", | |||
"x-go-name": "HeadBranch" | |||
}, | |||
"head_sha": { | |||
"type": "string", | |||
"x-go-name": "HeadSha" | |||
}, | |||
"id": { | |||
"type": "integer", | |||
"format": "int64", | |||
"x-go-name": "ID" | |||
}, | |||
"name": { | |||
"type": "string", | |||
"x-go-name": "Name" | |||
}, | |||
"run_number": { | |||
"type": "integer", | |||
"format": "int64", | |||
"x-go-name": "RunNumber" | |||
}, | |||
"run_started_at": { | |||
"type": "string", | |||
"format": "date-time", | |||
"x-go-name": "RunStartedAt" | |||
}, | |||
"status": { | |||
"type": "string", | |||
"x-go-name": "Status" | |||
}, | |||
"updated_at": { | |||
"type": "string", | |||
"format": "date-time", | |||
"x-go-name": "UpdatedAt" | |||
}, | |||
"url": { | |||
"type": "string", | |||
"x-go-name": "URL" | |||
}, | |||
"workflow_id": { | |||
"type": "string", | |||
"x-go-name": "WorkflowID" | |||
} | |||
}, | |||
"x-go-package": "code.gitea.io/gitea/modules/structs" | |||
}, | |||
"ActionTaskResponse": { | |||
"description": "ActionTaskResponse returns a ActionTask", | |||
"type": "object", | |||
"properties": { | |||
"total_count": { | |||
"type": "integer", | |||
"format": "int64", | |||
"x-go-name": "TotalCount" | |||
}, | |||
"workflow_runs": { | |||
"type": "array", | |||
"items": { | |||
"$ref": "#/definitions/ActionTask" | |||
}, | |||
"x-go-name": "Entries" | |||
} | |||
}, | |||
"x-go-package": "code.gitea.io/gitea/modules/structs" | |||
}, | |||
"ActionVariable": { | |||
"description": "ActionVariable return value of the query API", | |||
"type": "object", | |||
@@ -25361,6 +25504,12 @@ | |||
} | |||
} | |||
}, | |||
"TasksList": { | |||
"description": "TasksList", | |||
"schema": { | |||
"$ref": "#/definitions/ActionTaskResponse" | |||
} | |||
}, | |||
"Team": { | |||
"description": "Team", | |||
"schema": { |