mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 03:18:24 +00:00 
			
		
		
		
	refactor(API): refactor secret creation and update functionality (#26751)
According to the GitHub API Spec: https://docs.github.com/en/rest/actions/secrets?apiVersion=2022-11-28#create-or-update-an-organization-secret Merge the Create and Update secret into a single API. - Remove the `CreateSecretOption` struct and replace it with `CreateOrUpdateSecretOption` in `modules/structs/secret.go` - Update the `CreateOrUpdateOrgSecret` function in `routers/api/v1/org/action.go` to use `CreateOrUpdateSecretOption` instead of `UpdateSecretOption` - Remove the `CreateOrgSecret` function in `routers/api/v1/org/action.go` and replace it with `CreateOrUpdateOrgSecret` - Update the Swagger documentation in `routers/api/v1/swagger/options.go` and `templates/swagger/v1_json.tmpl` to reflect the changes in the struct names and function names Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
This commit is contained in:
		| @@ -14,21 +14,9 @@ type Secret struct { | |||||||
| 	Created time.Time `json:"created_at"` | 	Created time.Time `json:"created_at"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // CreateSecretOption options when creating secret | // CreateOrUpdateSecretOption options when creating or updating secret | ||||||
| // swagger:model | // swagger:model | ||||||
| type CreateSecretOption struct { | type CreateOrUpdateSecretOption struct { | ||||||
| 	// Name of the secret to create |  | ||||||
| 	// |  | ||||||
| 	// required: true |  | ||||||
| 	// unique: true |  | ||||||
| 	Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(100)"` |  | ||||||
| 	// Data of the secret to create |  | ||||||
| 	Data string `json:"data" binding:"Required"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // UpdateSecretOption options when updating secret |  | ||||||
| // swagger:model |  | ||||||
| type UpdateSecretOption struct { |  | ||||||
| 	// Data of the secret to update | 	// Data of the secret to update | ||||||
| 	// | 	// | ||||||
| 	// required: true | 	// required: true | ||||||
|   | |||||||
| @@ -1300,9 +1300,8 @@ func Routes() *web.Route { | |||||||
| 			}) | 			}) | ||||||
| 			m.Group("/actions/secrets", func() { | 			m.Group("/actions/secrets", func() { | ||||||
| 				m.Get("", reqToken(), reqOrgOwnership(), org.ListActionsSecrets) | 				m.Get("", reqToken(), reqOrgOwnership(), org.ListActionsSecrets) | ||||||
| 				m.Post("", reqToken(), reqOrgOwnership(), bind(api.CreateSecretOption{}), org.CreateOrgSecret) |  | ||||||
| 				m.Combo("/{secretname}"). | 				m.Combo("/{secretname}"). | ||||||
| 					Put(reqToken(), reqOrgOwnership(), bind(api.UpdateSecretOption{}), org.UpdateOrgSecret). | 					Put(reqToken(), reqOrgOwnership(), bind(api.CreateOrUpdateSecretOption{}), org.CreateOrUpdateOrgSecret). | ||||||
| 					Delete(reqToken(), reqOrgOwnership(), org.DeleteOrgSecret) | 					Delete(reqToken(), reqOrgOwnership(), org.DeleteOrgSecret) | ||||||
| 			}) | 			}) | ||||||
| 			m.Group("/public_members", func() { | 			m.Group("/public_members", func() { | ||||||
|   | |||||||
| @@ -12,7 +12,6 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/web" | 	"code.gitea.io/gitea/modules/web" | ||||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||||
| 	"code.gitea.io/gitea/routers/web/shared/actions" | 	"code.gitea.io/gitea/routers/web/shared/actions" | ||||||
| 	"code.gitea.io/gitea/services/convert" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // ListActionsSecrets list an organization's actions secrets | // ListActionsSecrets list an organization's actions secrets | ||||||
| @@ -74,55 +73,11 @@ func listActionsSecrets(ctx *context.APIContext) { | |||||||
| 	ctx.JSON(http.StatusOK, apiSecrets) | 	ctx.JSON(http.StatusOK, apiSecrets) | ||||||
| } | } | ||||||
|  |  | ||||||
| // CreateOrgSecret create one secret of the organization | // create or update one secret of the organization | ||||||
| func CreateOrgSecret(ctx *context.APIContext) { | func CreateOrUpdateOrgSecret(ctx *context.APIContext) { | ||||||
| 	// swagger:operation POST /orgs/{org}/actions/secrets organization createOrgSecret |  | ||||||
| 	// --- |  | ||||||
| 	// summary: Create a secret in an organization |  | ||||||
| 	// consumes: |  | ||||||
| 	// - application/json |  | ||||||
| 	// produces: |  | ||||||
| 	// - application/json |  | ||||||
| 	// parameters: |  | ||||||
| 	// - name: org |  | ||||||
| 	//   in: path |  | ||||||
| 	//   description: name of organization |  | ||||||
| 	//   type: string |  | ||||||
| 	//   required: true |  | ||||||
| 	// - name: body |  | ||||||
| 	//   in: body |  | ||||||
| 	//   schema: |  | ||||||
| 	//     "$ref": "#/definitions/CreateSecretOption" |  | ||||||
| 	// responses: |  | ||||||
| 	//   "201": |  | ||||||
| 	//     "$ref": "#/responses/Secret" |  | ||||||
| 	//   "400": |  | ||||||
| 	//     "$ref": "#/responses/error" |  | ||||||
| 	//   "404": |  | ||||||
| 	//     "$ref": "#/responses/notFound" |  | ||||||
| 	//   "403": |  | ||||||
| 	//     "$ref": "#/responses/forbidden" |  | ||||||
| 	opt := web.GetForm(ctx).(*api.CreateSecretOption) |  | ||||||
| 	if err := actions.NameRegexMatch(opt.Name); err != nil { |  | ||||||
| 		ctx.Error(http.StatusBadRequest, "CreateOrgSecret", err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	s, err := secret_model.InsertEncryptedSecret( |  | ||||||
| 		ctx, ctx.Org.Organization.ID, 0, opt.Name, actions.ReserveLineBreakForTextarea(opt.Data), |  | ||||||
| 	) |  | ||||||
| 	if err != nil { |  | ||||||
| 		ctx.Error(http.StatusInternalServerError, "InsertEncryptedSecret", err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	ctx.JSON(http.StatusCreated, convert.ToSecret(s)) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // UpdateOrgSecret update one secret of the organization |  | ||||||
| func UpdateOrgSecret(ctx *context.APIContext) { |  | ||||||
| 	// swagger:operation PUT /orgs/{org}/actions/secrets/{secretname} organization updateOrgSecret | 	// swagger:operation PUT /orgs/{org}/actions/secrets/{secretname} organization updateOrgSecret | ||||||
| 	// --- | 	// --- | ||||||
| 	// summary: Update a secret value in an organization | 	// summary: Create or Update a secret value in an organization | ||||||
| 	// consumes: | 	// consumes: | ||||||
| 	// - application/json | 	// - application/json | ||||||
| 	// produces: | 	// produces: | ||||||
| @@ -141,19 +96,34 @@ func UpdateOrgSecret(ctx *context.APIContext) { | |||||||
| 	// - name: body | 	// - name: body | ||||||
| 	//   in: body | 	//   in: body | ||||||
| 	//   schema: | 	//   schema: | ||||||
| 	//     "$ref": "#/definitions/UpdateSecretOption" | 	//     "$ref": "#/definitions/CreateOrUpdateSecretOption" | ||||||
| 	// responses: | 	// responses: | ||||||
|  | 	//   "201": | ||||||
|  | 	//     description: response when creating a secret | ||||||
| 	//   "204": | 	//   "204": | ||||||
| 	//     description: update one secret of the organization | 	//     description: response when updating a secret | ||||||
|  | 	//   "400": | ||||||
|  | 	//     "$ref": "#/responses/error" | ||||||
| 	//   "403": | 	//   "403": | ||||||
| 	//     "$ref": "#/responses/forbidden" | 	//     "$ref": "#/responses/forbidden" | ||||||
| 	secretName := ctx.Params(":secretname") | 	secretName := ctx.Params(":secretname") | ||||||
| 	opt := web.GetForm(ctx).(*api.UpdateSecretOption) | 	if err := actions.NameRegexMatch(secretName); err != nil { | ||||||
|  | 		ctx.Error(http.StatusBadRequest, "CreateOrUpdateOrgSecret", err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	opt := web.GetForm(ctx).(*api.CreateOrUpdateSecretOption) | ||||||
| 	err := secret_model.UpdateSecret( | 	err := secret_model.UpdateSecret( | ||||||
| 		ctx, ctx.Org.Organization.ID, 0, secretName, opt.Data, | 		ctx, ctx.Org.Organization.ID, 0, secretName, opt.Data, | ||||||
| 	) | 	) | ||||||
| 	if secret_model.IsErrSecretNotFound(err) { | 	if secret_model.IsErrSecretNotFound(err) { | ||||||
| 		ctx.NotFound(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) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
| @@ -189,8 +189,5 @@ type swaggerParameterBodies struct { | |||||||
| 	UpdateRepoAvatarOptions api.UpdateRepoAvatarOption | 	UpdateRepoAvatarOptions api.UpdateRepoAvatarOption | ||||||
|  |  | ||||||
| 	// in:body | 	// in:body | ||||||
| 	CreateSecretOption api.CreateSecretOption | 	CreateOrUpdateSecretOption api.CreateOrUpdateSecretOption | ||||||
|  |  | ||||||
| 	// in:body |  | ||||||
| 	UpdateSecretOption api.UpdateSecretOption |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										108
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										108
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							| @@ -1586,49 +1586,6 @@ | |||||||
|             "$ref": "#/responses/SecretList" |             "$ref": "#/responses/SecretList" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       }, |  | ||||||
|       "post": { |  | ||||||
|         "consumes": [ |  | ||||||
|           "application/json" |  | ||||||
|         ], |  | ||||||
|         "produces": [ |  | ||||||
|           "application/json" |  | ||||||
|         ], |  | ||||||
|         "tags": [ |  | ||||||
|           "organization" |  | ||||||
|         ], |  | ||||||
|         "summary": "Create a secret in an organization", |  | ||||||
|         "operationId": "createOrgSecret", |  | ||||||
|         "parameters": [ |  | ||||||
|           { |  | ||||||
|             "type": "string", |  | ||||||
|             "description": "name of organization", |  | ||||||
|             "name": "org", |  | ||||||
|             "in": "path", |  | ||||||
|             "required": true |  | ||||||
|           }, |  | ||||||
|           { |  | ||||||
|             "name": "body", |  | ||||||
|             "in": "body", |  | ||||||
|             "schema": { |  | ||||||
|               "$ref": "#/definitions/CreateSecretOption" |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         ], |  | ||||||
|         "responses": { |  | ||||||
|           "201": { |  | ||||||
|             "$ref": "#/responses/Secret" |  | ||||||
|           }, |  | ||||||
|           "400": { |  | ||||||
|             "$ref": "#/responses/error" |  | ||||||
|           }, |  | ||||||
|           "403": { |  | ||||||
|             "$ref": "#/responses/forbidden" |  | ||||||
|           }, |  | ||||||
|           "404": { |  | ||||||
|             "$ref": "#/responses/notFound" |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "/orgs/{org}/actions/secrets/{secretname}": { |     "/orgs/{org}/actions/secrets/{secretname}": { | ||||||
| @@ -1642,7 +1599,7 @@ | |||||||
|         "tags": [ |         "tags": [ | ||||||
|           "organization" |           "organization" | ||||||
|         ], |         ], | ||||||
|         "summary": "Update a secret value in an organization", |         "summary": "Create or Update a secret value in an organization", | ||||||
|         "operationId": "updateOrgSecret", |         "operationId": "updateOrgSecret", | ||||||
|         "parameters": [ |         "parameters": [ | ||||||
|           { |           { | ||||||
| @@ -1663,13 +1620,19 @@ | |||||||
|             "name": "body", |             "name": "body", | ||||||
|             "in": "body", |             "in": "body", | ||||||
|             "schema": { |             "schema": { | ||||||
|               "$ref": "#/definitions/UpdateSecretOption" |               "$ref": "#/definitions/CreateOrUpdateSecretOption" | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|         ], |         ], | ||||||
|         "responses": { |         "responses": { | ||||||
|  |           "201": { | ||||||
|  |             "description": "response when creating a secret" | ||||||
|  |           }, | ||||||
|           "204": { |           "204": { | ||||||
|             "description": "update one secret of the organization" |             "description": "response when updating a secret" | ||||||
|  |           }, | ||||||
|  |           "400": { | ||||||
|  |             "$ref": "#/responses/error" | ||||||
|           }, |           }, | ||||||
|           "403": { |           "403": { | ||||||
|             "$ref": "#/responses/forbidden" |             "$ref": "#/responses/forbidden" | ||||||
| @@ -17283,6 +17246,21 @@ | |||||||
|       }, |       }, | ||||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" |       "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||||
|     }, |     }, | ||||||
|  |     "CreateOrUpdateSecretOption": { | ||||||
|  |       "description": "CreateOrUpdateSecretOption options when creating or updating secret", | ||||||
|  |       "type": "object", | ||||||
|  |       "required": [ | ||||||
|  |         "data" | ||||||
|  |       ], | ||||||
|  |       "properties": { | ||||||
|  |         "data": { | ||||||
|  |           "description": "Data of the secret to update", | ||||||
|  |           "type": "string", | ||||||
|  |           "x-go-name": "Data" | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||||
|  |     }, | ||||||
|     "CreateOrgOption": { |     "CreateOrgOption": { | ||||||
|       "description": "CreateOrgOption options for creating an organization", |       "description": "CreateOrgOption options for creating an organization", | ||||||
|       "type": "object", |       "type": "object", | ||||||
| @@ -17569,27 +17547,6 @@ | |||||||
|       }, |       }, | ||||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" |       "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||||
|     }, |     }, | ||||||
|     "CreateSecretOption": { |  | ||||||
|       "description": "CreateSecretOption options when creating secret", |  | ||||||
|       "type": "object", |  | ||||||
|       "required": [ |  | ||||||
|         "name" |  | ||||||
|       ], |  | ||||||
|       "properties": { |  | ||||||
|         "data": { |  | ||||||
|           "description": "Data of the secret to create", |  | ||||||
|           "type": "string", |  | ||||||
|           "x-go-name": "Data" |  | ||||||
|         }, |  | ||||||
|         "name": { |  | ||||||
|           "description": "Name of the secret to create", |  | ||||||
|           "type": "string", |  | ||||||
|           "uniqueItems": true, |  | ||||||
|           "x-go-name": "Name" |  | ||||||
|         } |  | ||||||
|       }, |  | ||||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" |  | ||||||
|     }, |  | ||||||
|     "CreateStatusOption": { |     "CreateStatusOption": { | ||||||
|       "description": "CreateStatusOption holds the information needed to create a new CommitStatus for a Commit", |       "description": "CreateStatusOption holds the information needed to create a new CommitStatus for a Commit", | ||||||
|       "type": "object", |       "type": "object", | ||||||
| @@ -21978,21 +21935,6 @@ | |||||||
|       }, |       }, | ||||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" |       "x-go-package": "code.gitea.io/gitea/modules/structs" | ||||||
|     }, |     }, | ||||||
|     "UpdateSecretOption": { |  | ||||||
|       "description": "UpdateSecretOption options when updating secret", |  | ||||||
|       "type": "object", |  | ||||||
|       "required": [ |  | ||||||
|         "data" |  | ||||||
|       ], |  | ||||||
|       "properties": { |  | ||||||
|         "data": { |  | ||||||
|           "description": "Data of the secret to update", |  | ||||||
|           "type": "string", |  | ||||||
|           "x-go-name": "Data" |  | ||||||
|         } |  | ||||||
|       }, |  | ||||||
|       "x-go-package": "code.gitea.io/gitea/modules/structs" |  | ||||||
|     }, |  | ||||||
|     "UpdateUserAvatarOption": { |     "UpdateUserAvatarOption": { | ||||||
|       "description": "UpdateUserAvatarUserOption options when updating the user avatar", |       "description": "UpdateUserAvatarUserOption options when updating the user avatar", | ||||||
|       "type": "object", |       "type": "object", | ||||||
| @@ -23309,7 +23251,7 @@ | |||||||
|     "parameterBodies": { |     "parameterBodies": { | ||||||
|       "description": "parameterBodies", |       "description": "parameterBodies", | ||||||
|       "schema": { |       "schema": { | ||||||
|         "$ref": "#/definitions/UpdateSecretOption" |         "$ref": "#/definitions/CreateOrUpdateSecretOption" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "redirect": { |     "redirect": { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user