Skip to content

Commit 7e36627

Browse files
add api routes and functions for repository groups
1 parent 666b7cc commit 7e36627

File tree

5 files changed

+453
-3
lines changed

5 files changed

+453
-3
lines changed

modules/structs/repo.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ type CreateRepoOption struct {
156156
// ObjectFormatName of the underlying git repository
157157
// enum: sha1,sha256
158158
ObjectFormatName string `json:"object_format_name" binding:"MaxSize(6)"`
159+
// GroupID of the group which will contain this repository. ignored if the repo owner is not an organization.
160+
GroupID int64 `json:"group_id"`
159161
}
160162

161163
// EditRepoOption options when editing a repository's properties

modules/structs/repo_group.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type NewGroupOption struct {
2727
Visibility VisibleType `json:"visibility"`
2828
}
2929

30-
// MoveGroupOption - options for changing a group's parent and sort order
30+
// MoveGroupOption - options for changing a group or repo's parent and sort order
3131
// swagger:model
3232
type MoveGroupOption struct {
3333
// the new parent group. can be 0 to specify no parent

routers/api/v1/api.go

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,12 @@ import (
7373
actions_model "code.gitea.io/gitea/models/actions"
7474
auth_model "code.gitea.io/gitea/models/auth"
7575
"code.gitea.io/gitea/models/db"
76+
group_model "code.gitea.io/gitea/models/group"
7677
"code.gitea.io/gitea/models/organization"
7778
"code.gitea.io/gitea/models/perm"
7879
access_model "code.gitea.io/gitea/models/perm/access"
7980
repo_model "code.gitea.io/gitea/models/repo"
81+
shared_group_model "code.gitea.io/gitea/models/shared/group"
8082
"code.gitea.io/gitea/models/unit"
8183
user_model "code.gitea.io/gitea/models/user"
8284
"code.gitea.io/gitea/modules/log"
@@ -207,7 +209,7 @@ func repoAssignment() func(ctx *context.APIContext) {
207209
ctx.Repo.Permission.AccessMode = perm.AccessModeWrite
208210
}
209211

210-
if err := ctx.Repo.Repository.LoadUnits(ctx); err != nil {
212+
if err = ctx.Repo.Repository.LoadUnits(ctx); err != nil {
211213
ctx.APIErrorInternal(err)
212214
return
213215
}
@@ -509,6 +511,60 @@ func reqOrgOwnership() func(ctx *context.APIContext) {
509511
}
510512
}
511513

514+
// reqGroupMembership user should be organization owner,
515+
// a member of a team with access to the group, or site admin
516+
func reqGroupMembership(mode perm.AccessMode, needsCreatePerm bool) func(ctx *context.APIContext) {
517+
return func(ctx *context.APIContext) {
518+
if ctx.IsUserSiteAdmin() {
519+
return
520+
}
521+
gid := ctx.PathParamInt64("group_id")
522+
g, err := group_model.GetGroupByID(ctx, gid)
523+
if err != nil {
524+
ctx.APIErrorInternal(err)
525+
return
526+
}
527+
err = g.LoadOwner(ctx)
528+
if err != nil {
529+
ctx.APIErrorInternal(err)
530+
return
531+
}
532+
var canAccess bool
533+
if ctx.IsSigned {
534+
canAccess, err = g.CanAccessAtLevel(ctx, ctx.Doer.ID, mode)
535+
} else {
536+
canAccess, err = g.CanAccessAtLevel(ctx, 0, mode)
537+
}
538+
if err != nil {
539+
ctx.APIErrorInternal(err)
540+
return
541+
}
542+
igm, err := shared_group_model.IsGroupMember(ctx, gid, ctx.Doer)
543+
if err != nil {
544+
ctx.APIErrorInternal(err)
545+
return
546+
}
547+
if !igm && !canAccess {
548+
ctx.APIErrorNotFound()
549+
return
550+
}
551+
if needsCreatePerm {
552+
canCreateIn := false
553+
if ctx.IsSigned {
554+
canCreateIn, err = g.CanCreateIn(ctx, ctx.Doer.ID)
555+
if err != nil {
556+
ctx.APIErrorInternal(err)
557+
return
558+
}
559+
}
560+
if !canCreateIn {
561+
ctx.APIError(http.StatusForbidden, fmt.Sprintf("User[%d] does not have permission to create new items in group[%d]", ctx.Doer.ID, gid))
562+
return
563+
}
564+
}
565+
}
566+
}
567+
512568
// reqTeamMembership user should be an team member, or a site admin
513569
func reqTeamMembership() func(ctx *context.APIContext) {
514570
return func(ctx *context.APIContext) {
@@ -1189,6 +1245,7 @@ func Routes() *web.Router {
11891245
m.Combo("").Get(reqAnyRepoReader(), repo.Get).
11901246
Delete(reqToken(), reqOwner(), repo.Delete).
11911247
Patch(reqToken(), reqAdmin(), bind(api.EditRepoOption{}), repo.Edit)
1248+
m.Post("/groups/move", reqToken(), bind(api.EditGroupOption{}), reqOrgMembership(), reqGroupMembership(perm.AccessModeWrite, false), repo.MoveRepoToGroup)
11921249
m.Post("/generate", reqToken(), reqRepoReader(unit.TypeCode), bind(api.GenerateRepoOption{}), repo.Generate)
11931250
m.Group("/transfer", func() {
11941251
m.Post("", reqOwner(), bind(api.TransferRepoOption{}), repo.Transfer)
@@ -1688,6 +1745,10 @@ func Routes() *web.Router {
16881745
m.Delete("", org.UnblockUser)
16891746
})
16901747
}, reqToken(), reqOrgOwnership())
1748+
m.Group("/groups", func() {
1749+
m.Post("/new", reqToken(), reqGroupMembership(perm.AccessModeWrite, true), group.NewGroup)
1750+
m.Post("/{group_id}/move", reqToken(), reqGroupMembership(perm.AccessModeWrite, false), group.MoveGroup)
1751+
})
16911752
}, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization), orgAssignment(true), checkTokenPublicOnly())
16921753
m.Group("/teams/{teamid}", func() {
16931754
m.Combo("").Get(reqToken(), org.GetTeam).
@@ -1770,7 +1831,15 @@ func Routes() *web.Router {
17701831
m.Get("/search", repo.TopicSearch)
17711832
}, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository))
17721833
}, sudo())
1773-
1834+
m.Group("/groups", func() {
1835+
m.Group("/{group_id}", func() {
1836+
m.Combo("").
1837+
Get(reqGroupMembership(perm.AccessModeRead, false), group.GetGroup).
1838+
Patch(reqToken(), reqGroupMembership(perm.AccessModeWrite, false), bind(api.EditGroupOption{}), group.EditGroup).
1839+
Delete(reqToken(), reqGroupMembership(perm.AccessModeAdmin, false), group.DeleteGroup)
1840+
m.Post("/new", reqToken(), reqGroupMembership(perm.AccessModeWrite, true), bind(api.NewGroupOption{}), group.NewSubGroup)
1841+
})
1842+
})
17741843
return m
17751844
}
17761845

0 commit comments

Comments
 (0)