aboutsummaryrefslogtreecommitdiffstats
path: root/routers
diff options
context:
space:
mode:
authorBo-Yi Wu <appleboy.tw@gmail.com>2023-08-30 04:54:49 +0800
committerGitHub <noreply@github.com>2023-08-29 20:54:49 +0000
commitb91057b172dea07a9db1bf96a32d2ab25a0e030d (patch)
treeb4a88a07895a2fba14998a577cd8b778c2400dfb /routers
parent2d9249b6d9b57dea57b70357432bda945504c4b5 (diff)
downloadgitea-b91057b172dea07a9db1bf96a32d2ab25a0e030d.tar.gz
gitea-b91057b172dea07a9db1bf96a32d2ab25a0e030d.zip
feat(API): add route and implementation for creating/updating repository secret (#26766)
spec: https://docs.github.com/en/rest/actions/secrets?apiVersion=2022-11-28#create-or-update-a-repository-secret - Add a new route for creating or updating a secret value in a repository - Create a new file `routers/api/v1/repo/action.go` with the implementation of the `CreateOrUpdateSecret` function - Update the Swagger documentation for the `updateRepoSecret` operation in the `v1_json.tmpl` template file --------- Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io>
Diffstat (limited to 'routers')
-rw-r--r--routers/api/v1/api.go6
-rw-r--r--routers/api/v1/org/action.go23
-rw-r--r--routers/api/v1/repo/action.go75
3 files changed, 87 insertions, 17 deletions
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 6424931a47..32e5a10bbe 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -933,6 +933,10 @@ func Routes() *web.Route {
m.Post("/accept", repo.AcceptTransfer)
m.Post("/reject", repo.RejectTransfer)
}, reqToken())
+ m.Group("/actions/secrets", func() {
+ m.Combo("/{secretname}").
+ Put(reqToken(), reqOwner(), bind(api.CreateOrUpdateSecretOption{}), repo.CreateOrUpdateSecret)
+ })
m.Group("/hooks/git", func() {
m.Combo("").Get(repo.ListGitHooks)
m.Group("/{id}", func() {
@@ -1301,7 +1305,7 @@ func Routes() *web.Route {
m.Group("/actions/secrets", func() {
m.Get("", reqToken(), reqOrgOwnership(), org.ListActionsSecrets)
m.Combo("/{secretname}").
- Put(reqToken(), reqOrgOwnership(), bind(api.CreateOrUpdateSecretOption{}), org.CreateOrUpdateOrgSecret).
+ Put(reqToken(), reqOrgOwnership(), bind(api.CreateOrUpdateSecretOption{}), org.CreateOrUpdateSecret).
Delete(reqToken(), reqOrgOwnership(), org.DeleteOrgSecret)
})
m.Group("/public_members", func() {
diff --git a/routers/api/v1/org/action.go b/routers/api/v1/org/action.go
index ee18cca26d..0bf741e825 100644
--- a/routers/api/v1/org/action.go
+++ b/routers/api/v1/org/action.go
@@ -74,7 +74,7 @@ func listActionsSecrets(ctx *context.APIContext) {
}
// create or update one secret of the organization
-func CreateOrUpdateOrgSecret(ctx *context.APIContext) {
+func CreateOrUpdateSecret(ctx *context.APIContext) {
// swagger:operation PUT /orgs/{org}/actions/secrets/{secretname} organization updateOrgSecret
// ---
// summary: Create or Update a secret value in an organization
@@ -108,26 +108,17 @@ func CreateOrUpdateOrgSecret(ctx *context.APIContext) {
// "$ref": "#/responses/forbidden"
secretName := ctx.Params(":secretname")
if err := actions.NameRegexMatch(secretName); err != nil {
- ctx.Error(http.StatusBadRequest, "CreateOrUpdateOrgSecret", err)
+ ctx.Error(http.StatusBadRequest, "CreateOrUpdateSecret", err)
return
}
opt := web.GetForm(ctx).(*api.CreateOrUpdateSecretOption)
- err := secret_model.UpdateSecret(
- ctx, ctx.Org.Organization.ID, 0, secretName, opt.Data,
- )
- if secret_model.IsErrSecretNotFound(err) {
- _, err := secret_model.InsertEncryptedSecret(
- ctx, ctx.Org.Organization.ID, 0, secretName, actions.ReserveLineBreakForTextarea(opt.Data),
- )
- if err != nil {
- ctx.Error(http.StatusInternalServerError, "InsertEncryptedSecret", err)
- return
- }
- ctx.Status(http.StatusCreated)
+ isCreated, err := secret_model.CreateOrUpdateSecret(ctx, ctx.Org.Organization.ID, 0, secretName, opt.Data)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "CreateOrUpdateSecret", err)
return
}
- if err != nil {
- ctx.Error(http.StatusInternalServerError, "UpdateSecret", err)
+ if isCreated {
+ ctx.Status(http.StatusCreated)
return
}
diff --git a/routers/api/v1/repo/action.go b/routers/api/v1/repo/action.go
new file mode 100644
index 0000000000..015c731a75
--- /dev/null
+++ b/routers/api/v1/repo/action.go
@@ -0,0 +1,75 @@
+// Copyright 2023 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package repo
+
+import (
+ "net/http"
+
+ secret_model "code.gitea.io/gitea/models/secret"
+ "code.gitea.io/gitea/modules/context"
+ api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/web"
+ "code.gitea.io/gitea/routers/web/shared/actions"
+)
+
+// create or update one secret of the repository
+func CreateOrUpdateSecret(ctx *context.APIContext) {
+ // swagger:operation PUT /repos/{owner}/{repo}/actions/secrets/{secretname} repository updateRepoSecret
+ // ---
+ // summary: Create or Update a secret value in a repository
+ // consumes:
+ // - application/json
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: owner
+ // in: path
+ // description: owner of the repository
+ // type: string
+ // required: true
+ // - name: repo
+ // in: path
+ // description: name of the repository
+ // type: string
+ // required: true
+ // - name: secretname
+ // in: path
+ // description: name of the secret
+ // type: string
+ // required: true
+ // - name: body
+ // in: body
+ // schema:
+ // "$ref": "#/definitions/CreateOrUpdateSecretOption"
+ // responses:
+ // "201":
+ // description: response when creating a secret
+ // "204":
+ // description: response when updating a secret
+ // "400":
+ // "$ref": "#/responses/error"
+ // "403":
+ // "$ref": "#/responses/forbidden"
+
+ owner := ctx.Repo.Owner
+ repo := ctx.Repo.Repository
+
+ secretName := ctx.Params(":secretname")
+ if err := actions.NameRegexMatch(secretName); err != nil {
+ ctx.Error(http.StatusBadRequest, "CreateOrUpdateSecret", err)
+ return
+ }
+ opt := web.GetForm(ctx).(*api.CreateOrUpdateSecretOption)
+ isCreated, err := secret_model.CreateOrUpdateSecret(ctx, owner.ID, repo.ID, secretName, opt.Data)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "CreateOrUpdateSecret", err)
+ return
+ }
+ if isCreated {
+ ctx.Status(http.StatusCreated)
+ return
+ }
+
+ ctx.Status(http.StatusNoContent)
+}