code.gitea.io/gitea@v1.21.7/routers/web/repo/setting/runners.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package setting
     5  
     6  import (
     7  	"errors"
     8  	"net/http"
     9  	"net/url"
    10  
    11  	actions_model "code.gitea.io/gitea/models/actions"
    12  	"code.gitea.io/gitea/models/db"
    13  	"code.gitea.io/gitea/modules/base"
    14  	"code.gitea.io/gitea/modules/context"
    15  	"code.gitea.io/gitea/modules/setting"
    16  	actions_shared "code.gitea.io/gitea/routers/web/shared/actions"
    17  	shared_user "code.gitea.io/gitea/routers/web/shared/user"
    18  )
    19  
    20  const (
    21  	// TODO: Separate secrets from runners when layout is ready
    22  	tplRepoRunners     base.TplName = "repo/settings/actions"
    23  	tplOrgRunners      base.TplName = "org/settings/actions"
    24  	tplAdminRunners    base.TplName = "admin/actions"
    25  	tplUserRunners     base.TplName = "user/settings/actions"
    26  	tplRepoRunnerEdit  base.TplName = "repo/settings/runner_edit"
    27  	tplOrgRunnerEdit   base.TplName = "org/settings/runners_edit"
    28  	tplAdminRunnerEdit base.TplName = "admin/runners/edit"
    29  	tplUserRunnerEdit  base.TplName = "user/settings/runner_edit"
    30  )
    31  
    32  type runnersCtx struct {
    33  	OwnerID            int64
    34  	RepoID             int64
    35  	IsRepo             bool
    36  	IsOrg              bool
    37  	IsAdmin            bool
    38  	IsUser             bool
    39  	RunnersTemplate    base.TplName
    40  	RunnerEditTemplate base.TplName
    41  	RedirectLink       string
    42  }
    43  
    44  func getRunnersCtx(ctx *context.Context) (*runnersCtx, error) {
    45  	if ctx.Data["PageIsRepoSettings"] == true {
    46  		return &runnersCtx{
    47  			RepoID:             ctx.Repo.Repository.ID,
    48  			OwnerID:            0,
    49  			IsRepo:             true,
    50  			RunnersTemplate:    tplRepoRunners,
    51  			RunnerEditTemplate: tplRepoRunnerEdit,
    52  			RedirectLink:       ctx.Repo.RepoLink + "/settings/actions/runners/",
    53  		}, nil
    54  	}
    55  
    56  	if ctx.Data["PageIsOrgSettings"] == true {
    57  		err := shared_user.LoadHeaderCount(ctx)
    58  		if err != nil {
    59  			ctx.ServerError("LoadHeaderCount", err)
    60  			return nil, nil
    61  		}
    62  		return &runnersCtx{
    63  			RepoID:             0,
    64  			OwnerID:            ctx.Org.Organization.ID,
    65  			IsOrg:              true,
    66  			RunnersTemplate:    tplOrgRunners,
    67  			RunnerEditTemplate: tplOrgRunnerEdit,
    68  			RedirectLink:       ctx.Org.OrgLink + "/settings/actions/runners/",
    69  		}, nil
    70  	}
    71  
    72  	if ctx.Data["PageIsAdmin"] == true {
    73  		return &runnersCtx{
    74  			RepoID:             0,
    75  			OwnerID:            0,
    76  			IsAdmin:            true,
    77  			RunnersTemplate:    tplAdminRunners,
    78  			RunnerEditTemplate: tplAdminRunnerEdit,
    79  			RedirectLink:       setting.AppSubURL + "/admin/actions/runners/",
    80  		}, nil
    81  	}
    82  
    83  	if ctx.Data["PageIsUserSettings"] == true {
    84  		return &runnersCtx{
    85  			OwnerID:            ctx.Doer.ID,
    86  			RepoID:             0,
    87  			IsUser:             true,
    88  			RunnersTemplate:    tplUserRunners,
    89  			RunnerEditTemplate: tplUserRunnerEdit,
    90  			RedirectLink:       setting.AppSubURL + "/user/settings/actions/runners/",
    91  		}, nil
    92  	}
    93  
    94  	return nil, errors.New("unable to set Runners context")
    95  }
    96  
    97  // Runners render settings/actions/runners page for repo level
    98  func Runners(ctx *context.Context) {
    99  	ctx.Data["PageIsSharedSettingsRunners"] = true
   100  	ctx.Data["Title"] = ctx.Tr("actions.actions")
   101  	ctx.Data["PageType"] = "runners"
   102  
   103  	rCtx, err := getRunnersCtx(ctx)
   104  	if err != nil {
   105  		ctx.ServerError("getRunnersCtx", err)
   106  		return
   107  	}
   108  
   109  	page := ctx.FormInt("page")
   110  	if page <= 1 {
   111  		page = 1
   112  	}
   113  
   114  	opts := actions_model.FindRunnerOptions{
   115  		ListOptions: db.ListOptions{
   116  			Page:     page,
   117  			PageSize: 100,
   118  		},
   119  		Sort:   ctx.Req.URL.Query().Get("sort"),
   120  		Filter: ctx.Req.URL.Query().Get("q"),
   121  	}
   122  	if rCtx.IsRepo {
   123  		opts.RepoID = rCtx.RepoID
   124  		opts.WithAvailable = true
   125  	} else if rCtx.IsOrg || rCtx.IsUser {
   126  		opts.OwnerID = rCtx.OwnerID
   127  		opts.WithAvailable = true
   128  	}
   129  	actions_shared.RunnersList(ctx, opts)
   130  
   131  	ctx.HTML(http.StatusOK, rCtx.RunnersTemplate)
   132  }
   133  
   134  // RunnersEdit renders runner edit page for repository level
   135  func RunnersEdit(ctx *context.Context) {
   136  	ctx.Data["PageIsSharedSettingsRunners"] = true
   137  	ctx.Data["Title"] = ctx.Tr("actions.runners.edit_runner")
   138  	rCtx, err := getRunnersCtx(ctx)
   139  	if err != nil {
   140  		ctx.ServerError("getRunnersCtx", err)
   141  		return
   142  	}
   143  
   144  	page := ctx.FormInt("page")
   145  	if page <= 1 {
   146  		page = 1
   147  	}
   148  
   149  	actions_shared.RunnerDetails(ctx, page,
   150  		ctx.ParamsInt64(":runnerid"), rCtx.OwnerID, rCtx.RepoID,
   151  	)
   152  	ctx.HTML(http.StatusOK, rCtx.RunnerEditTemplate)
   153  }
   154  
   155  func RunnersEditPost(ctx *context.Context) {
   156  	rCtx, err := getRunnersCtx(ctx)
   157  	if err != nil {
   158  		ctx.ServerError("getRunnersCtx", err)
   159  		return
   160  	}
   161  	actions_shared.RunnerDetailsEditPost(ctx, ctx.ParamsInt64(":runnerid"),
   162  		rCtx.OwnerID, rCtx.RepoID,
   163  		rCtx.RedirectLink+url.PathEscape(ctx.Params(":runnerid")))
   164  }
   165  
   166  func ResetRunnerRegistrationToken(ctx *context.Context) {
   167  	rCtx, err := getRunnersCtx(ctx)
   168  	if err != nil {
   169  		ctx.ServerError("getRunnersCtx", err)
   170  		return
   171  	}
   172  	actions_shared.RunnerResetRegistrationToken(ctx, rCtx.OwnerID, rCtx.RepoID, rCtx.RedirectLink)
   173  }
   174  
   175  // RunnerDeletePost response for deleting runner
   176  func RunnerDeletePost(ctx *context.Context) {
   177  	rCtx, err := getRunnersCtx(ctx)
   178  	if err != nil {
   179  		ctx.ServerError("getRunnersCtx", err)
   180  		return
   181  	}
   182  	actions_shared.RunnerDeletePost(ctx, ctx.ParamsInt64(":runnerid"), rCtx.RedirectLink, rCtx.RedirectLink+url.PathEscape(ctx.Params(":runnerid")))
   183  }
   184  
   185  func RedirectToDefaultSetting(ctx *context.Context) {
   186  	ctx.Redirect(ctx.Repo.RepoLink + "/settings/actions/runners")
   187  }