fix api bug
This commit is contained in:
@@ -3,6 +3,7 @@ package devcontainer
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"code.gitea.io/gitea/models/repo"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
web_module "code.gitea.io/gitea/modules/web"
|
||||
Result "code.gitea.io/gitea/routers/entity"
|
||||
@@ -58,18 +59,19 @@ func CreateRepoDevcontainer(ctx *context.Context) {
|
||||
}
|
||||
|
||||
// 4. 调用 API Service 层创建 DevContainer
|
||||
if !ctx.Doer.IsAdmin {
|
||||
repo, err := repo.GetRepositoryByID(ctx, repoId)
|
||||
if err != nil {
|
||||
errCreateDevcontainer := Result.ResultType{
|
||||
Code: Result.RespFailedCreateDevcontainer.Code,
|
||||
Msg: Result.RespFailedCreateDevcontainer.Msg,
|
||||
Data: map[string]string{
|
||||
"ErrorMsg": "Permission Denied",
|
||||
"ErrorMsg": "repo not found",
|
||||
},
|
||||
}
|
||||
errCreateDevcontainer.RespondJson2HttpResponseWriter(ctx.Resp)
|
||||
return
|
||||
}
|
||||
devcontainer_service.CreateDevcontainerJSON(ctx)
|
||||
devcontainer_service.CreateDevcontainerJSON(ctx, repo, ctx.Doer)
|
||||
|
||||
opts := &devcontainer_service.CreateDevcontainerOptions{
|
||||
Actor: ctx.Doer,
|
||||
|
||||
@@ -55,6 +55,8 @@ func GetRepoDevContainerDetails(ctx *context.Context) {
|
||||
} else {
|
||||
canRead, _ := devcontainer_service.CanCreateDevcontainer(ctx, ctx.Repo.Repository.ID, ctx.Doer.ID)
|
||||
ctx.Data["canRead"] = canRead
|
||||
isAdmin, _ := devcontainer_service.IsOwner(ctx, ctx.Repo.Repository.ID, ctx.Doer.ID)
|
||||
ctx.Data["isAdmin"] = isAdmin
|
||||
}
|
||||
|
||||
//ctx.Repo.RepoLink == ctx.Repo.Repository.Link()
|
||||
@@ -153,7 +155,7 @@ func CreateRepoDevContainerConfiguration(ctx *context.Context) {
|
||||
ctx.Flash.Error("permisson denied", true)
|
||||
return
|
||||
}
|
||||
devcontainer_service.CreateDevcontainerJSON(ctx)
|
||||
devcontainer_service.CreateDevcontainerJSON(ctx, ctx.Repo.Repository, ctx.Doer)
|
||||
ctx.Redirect(path.Join(ctx.Repo.RepoLink, "/dev-container"))
|
||||
}
|
||||
func ParseImageName(imageName string) (registry, namespace, repo, tag string) {
|
||||
|
||||
@@ -1353,7 +1353,7 @@ func registerRoutes(m *web.Router) {
|
||||
m.Group("/{username}/{reponame}/dev-container", func() { // repo Dev Container
|
||||
m.Group("", func() {
|
||||
m.Combo("").Get(devcontainer_web.GetRepoDevContainerDetails)
|
||||
}, reqSignIn, context.RepoAssignment, reqRepoCodeReader, context.RepoRef(), canEnableEditor, context.RepoMustNotBeArchived(), repo.MustBeEditable)
|
||||
})
|
||||
|
||||
m.Get("/createConfiguration", devcontainer_web.CreateRepoDevContainerConfiguration)
|
||||
m.Get("/create", devcontainer_web.CreateRepoDevContainer, context.RepoMustNotBeArchived()) // 仓库状态非 Archived 才可以创建 DevContainer
|
||||
@@ -1367,7 +1367,7 @@ func registerRoutes(m *web.Router) {
|
||||
// 1. 已登录
|
||||
// 2. repo 信息已加载到 Gitea Web Context (否则无法判定当前repo是否有写入Code权限,从而返回无权访问错误码 HTTP 404)
|
||||
// 3. 具有code写入权限
|
||||
reqSignIn, context.RepoAssignment, reqRepoCodeWriter,
|
||||
reqSignIn, context.RepoAssignment, reqRepoCodeReader,
|
||||
)
|
||||
|
||||
m.Group("/{username}/{reponame}", func() { // repo tags
|
||||
|
||||
@@ -753,6 +753,21 @@ func CanCreateDevcontainer(gitea_ctx context.Context, repoID, userID int64) (boo
|
||||
return repo_model.IsCollaborator(gitea_ctx, repoID, userID)
|
||||
|
||||
}
|
||||
func IsOwner(ctx context.Context, repo *repo_model.Repository, userID int64) (bool, error) {
|
||||
return repo_model.IsOwnerMemberCollaborator(ctx, repo, userID)
|
||||
func IsOwner(gitea_ctx context.Context, repoID, userID int64) (bool, error) {
|
||||
e := db.GetEngine(gitea_ctx)
|
||||
|
||||
teamMember, err := e.Table("team_user").
|
||||
Join("INNER", "team_repo", "`team_repo`.team_id = `team_user`.team_id").
|
||||
Join("INNER", "team_unit", "`team_unit`.team_id = `team_user`.team_id").
|
||||
Where("`team_repo`.repo_id = ? AND `team_unit`.access_mode = ? ",
|
||||
repoID, perm.AccessModeAdmin).
|
||||
And("team_user.uid = ?", userID).Exist()
|
||||
if err != nil {
|
||||
return false, nil
|
||||
}
|
||||
if teamMember {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
return e.Get(&repo_model.Collaboration{RepoID: repoID, UserID: userID, Mode: 3})
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"code.gitea.io/gitea/models/db"
|
||||
devcontainer_model "code.gitea.io/gitea/models/devcontainer"
|
||||
"code.gitea.io/gitea/models/repo"
|
||||
"code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/charset"
|
||||
"code.gitea.io/gitea/modules/git"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
@@ -33,7 +34,7 @@ type DevStarJSON struct {
|
||||
RunArgs []string
|
||||
}
|
||||
|
||||
func CreateDevcontainerJSON(ctx *gitea_context.Context) {
|
||||
func CreateDevcontainerJSON(ctx *gitea_context.Context, repo *repo.Repository, doer *user.User) {
|
||||
jsonString := `{
|
||||
"image":"mcr.microsoft.com/devcontainers/base:dev-ubuntu-20.04",
|
||||
"forwardPorts": [
|
||||
@@ -55,7 +56,7 @@ func CreateDevcontainerJSON(ctx *gitea_context.Context) {
|
||||
"8888:8888"
|
||||
]
|
||||
}`
|
||||
_, err := files_service.ChangeRepoFiles(db.DefaultContext, ctx.Repo.Repository, ctx.Doer, &files_service.ChangeRepoFilesOptions{
|
||||
_, err := files_service.ChangeRepoFiles(db.DefaultContext, repo, doer, &files_service.ChangeRepoFilesOptions{
|
||||
Files: []*files_service.ChangeRepoFile{
|
||||
{
|
||||
Operation: "create",
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
{{end}}
|
||||
|
||||
<!-- 定义tab: DevContainer List -->
|
||||
{{if .Permission.CanWrite ctx.Consts.RepoUnitTypeCode}}
|
||||
{{if .Permission.CanRead ctx.Consts.RepoUnitTypeCode}}
|
||||
<a class="{{if .PageIsRepoDevcontainerDetails}}active {{end}}item" href="{{.RepoLink}}/dev-container">
|
||||
{{svg "octicon-container"}} {{ctx.Locale.Tr "repo.dev_container"}}
|
||||
</a>
|
||||
|
||||
Reference in New Issue
Block a user