Add tag protection manage via rest API. --------- Co-authored-by: Alexander Kogay <kogay.a@citilink.ru> Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
@ -110,6 +110,19 @@ func GetProtectedTagByID(ctx context.Context, id int64) (*ProtectedTag, error) {
|
|||||||
return tag, nil
|
return tag, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetProtectedTagByNamePattern gets protected tag by name_pattern
|
||||||
|
func GetProtectedTagByNamePattern(ctx context.Context, repoID int64, pattern string) (*ProtectedTag, error) {
|
||||||
|
tag := &ProtectedTag{NamePattern: pattern, RepoID: repoID}
|
||||||
|
has, err := db.GetEngine(ctx).Get(tag)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if !has {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return tag, nil
|
||||||
|
}
|
||||||
|
|
||||||
// IsUserAllowedToControlTag checks if a user can control the specific tag.
|
// IsUserAllowedToControlTag checks if a user can control the specific tag.
|
||||||
// It returns true if the tag name is not protected or the user is allowed to control it.
|
// It returns true if the tag name is not protected or the user is allowed to control it.
|
||||||
func IsUserAllowedToControlTag(ctx context.Context, tags []*ProtectedTag, tagName string, userID int64) (bool, error) {
|
func IsUserAllowedToControlTag(ctx context.Context, tags []*ProtectedTag, tagName string, userID int64) (bool, error) {
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
package structs
|
package structs
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
// Tag represents a repository tag
|
// Tag represents a repository tag
|
||||||
type Tag struct {
|
type Tag struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
@ -38,3 +40,29 @@ type CreateTagOption struct {
|
|||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
Target string `json:"target"`
|
Target string `json:"target"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TagProtection represents a tag protection
|
||||||
|
type TagProtection struct {
|
||||||
|
ID int64 `json:"id"`
|
||||||
|
NamePattern string `json:"name_pattern"`
|
||||||
|
WhitelistUsernames []string `json:"whitelist_usernames"`
|
||||||
|
WhitelistTeams []string `json:"whitelist_teams"`
|
||||||
|
// swagger:strfmt date-time
|
||||||
|
Created time.Time `json:"created_at"`
|
||||||
|
// swagger:strfmt date-time
|
||||||
|
Updated time.Time `json:"updated_at"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateTagProtectionOption options for creating a tag protection
|
||||||
|
type CreateTagProtectionOption struct {
|
||||||
|
NamePattern string `json:"name_pattern"`
|
||||||
|
WhitelistUsernames []string `json:"whitelist_usernames"`
|
||||||
|
WhitelistTeams []string `json:"whitelist_teams"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// EditTagProtectionOption options for editing a tag protection
|
||||||
|
type EditTagProtectionOption struct {
|
||||||
|
NamePattern *string `json:"name_pattern"`
|
||||||
|
WhitelistUsernames []string `json:"whitelist_usernames"`
|
||||||
|
WhitelistTeams []string `json:"whitelist_teams"`
|
||||||
|
}
|
||||||
|
@ -1168,6 +1168,15 @@ func Routes() *web.Route {
|
|||||||
m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.CreateTagOption{}), repo.CreateTag)
|
m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.CreateTagOption{}), repo.CreateTag)
|
||||||
m.Delete("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, repo.DeleteTag)
|
m.Delete("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, repo.DeleteTag)
|
||||||
}, reqRepoReader(unit.TypeCode), context.ReferencesGitRepo(true))
|
}, reqRepoReader(unit.TypeCode), context.ReferencesGitRepo(true))
|
||||||
|
m.Group("/tag_protections", func() {
|
||||||
|
m.Combo("").Get(repo.ListTagProtection).
|
||||||
|
Post(bind(api.CreateTagProtectionOption{}), mustNotBeArchived, repo.CreateTagProtection)
|
||||||
|
m.Group("/{id}", func() {
|
||||||
|
m.Combo("").Get(repo.GetTagProtection).
|
||||||
|
Patch(bind(api.EditTagProtectionOption{}), mustNotBeArchived, repo.EditTagProtection).
|
||||||
|
Delete(repo.DeleteTagProtection)
|
||||||
|
})
|
||||||
|
}, reqToken(), reqAdmin())
|
||||||
m.Group("/actions", func() {
|
m.Group("/actions", func() {
|
||||||
m.Get("/tasks", repo.ListActionTasks)
|
m.Get("/tasks", repo.ListActionTasks)
|
||||||
}, reqRepoReader(unit.TypeActions), context.ReferencesGitRepo(true))
|
}, reqRepoReader(unit.TypeActions), context.ReferencesGitRepo(true))
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -170,6 +170,12 @@ type swaggerParameterBodies struct {
|
|||||||
// in:body
|
// in:body
|
||||||
CreateTagOption api.CreateTagOption
|
CreateTagOption api.CreateTagOption
|
||||||
|
|
||||||
|
// in:body
|
||||||
|
CreateTagProtectionOption api.CreateTagProtectionOption
|
||||||
|
|
||||||
|
// in:body
|
||||||
|
EditTagProtectionOption api.EditTagProtectionOption
|
||||||
|
|
||||||
// in:body
|
// in:body
|
||||||
CreateAccessTokenOption api.CreateAccessTokenOption
|
CreateAccessTokenOption api.CreateAccessTokenOption
|
||||||
|
|
||||||
|
@ -70,6 +70,20 @@ type swaggerResponseAnnotatedTag struct {
|
|||||||
Body api.AnnotatedTag `json:"body"`
|
Body api.AnnotatedTag `json:"body"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TagProtectionList
|
||||||
|
// swagger:response TagProtectionList
|
||||||
|
type swaggerResponseTagProtectionList struct {
|
||||||
|
// in:body
|
||||||
|
Body []api.TagProtection `json:"body"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TagProtection
|
||||||
|
// swagger:response TagProtection
|
||||||
|
type swaggerResponseTagProtection struct {
|
||||||
|
// in:body
|
||||||
|
Body api.TagProtection `json:"body"`
|
||||||
|
}
|
||||||
|
|
||||||
// Reference
|
// Reference
|
||||||
// swagger:response Reference
|
// swagger:response Reference
|
||||||
type swaggerResponseReference struct {
|
type swaggerResponseReference struct {
|
||||||
|
@ -408,6 +408,32 @@ func ToAnnotatedTagObject(repo *repo_model.Repository, commit *git.Commit) *api.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToTagProtection convert a git.ProtectedTag to an api.TagProtection
|
||||||
|
func ToTagProtection(ctx context.Context, pt *git_model.ProtectedTag, repo *repo_model.Repository) *api.TagProtection {
|
||||||
|
readers, err := access_model.GetRepoReaders(ctx, repo)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("GetRepoReaders: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
whitelistUsernames := getWhitelistEntities(readers, pt.AllowlistUserIDs)
|
||||||
|
|
||||||
|
teamReaders, err := organization.OrgFromUser(repo.Owner).TeamsWithAccessToRepo(ctx, repo.ID, perm.AccessModeRead)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Repo.Owner.TeamsWithAccessToRepo: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
whitelistTeams := getWhitelistEntities(teamReaders, pt.AllowlistTeamIDs)
|
||||||
|
|
||||||
|
return &api.TagProtection{
|
||||||
|
ID: pt.ID,
|
||||||
|
NamePattern: pt.NamePattern,
|
||||||
|
WhitelistUsernames: whitelistUsernames,
|
||||||
|
WhitelistTeams: whitelistTeams,
|
||||||
|
Created: pt.CreatedUnix.AsTime(),
|
||||||
|
Updated: pt.UpdatedUnix.AsTime(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ToTopicResponse convert from models.Topic to api.TopicResponse
|
// ToTopicResponse convert from models.Topic to api.TopicResponse
|
||||||
func ToTopicResponse(topic *repo_model.Topic) *api.TopicResponse {
|
func ToTopicResponse(topic *repo_model.Topic) *api.TopicResponse {
|
||||||
return &api.TopicResponse{
|
return &api.TopicResponse{
|
||||||
|
332
templates/swagger/v1_json.tmpl
generated
332
templates/swagger/v1_json.tmpl
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user