mirror of
https://github.com/harness/drone.git
synced 2025-05-09 07:40:58 +08:00
add GITURL to repo apis list and create (#64)
- rename repo.url to repo.GitURL to avoid ambiguity - add support to create / list api - add default value (http://localhost:3000) - remove handler backfilling host / port to simplify flow (can be added if needed)
This commit is contained in:
parent
98436fb644
commit
ff2f949e78
@ -80,7 +80,7 @@ func initSystem(ctx context.Context, config *types.Config) (*system, error) {
|
||||
repoStore := database.ProvideRepoStore(db, pathTransformation)
|
||||
serviceaccountController := serviceaccount.NewController(serviceAccount, authorizer, serviceAccountStore, spaceStore, repoStore, tokenStore)
|
||||
checkSpace := check.ProvideSpaceCheck()
|
||||
spaceController := space.NewController(checkSpace, authorizer, spaceStore, repoStore, serviceAccountStore)
|
||||
spaceController := space.ProvideController(config, checkSpace, authorizer, spaceStore, repoStore, serviceAccountStore)
|
||||
accountClient, err := client.ProvideAccountClient(serviceJWTProvider, typesConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -55,7 +55,7 @@ func initSystem(ctx context.Context, config *types.Config) (*system, error) {
|
||||
}
|
||||
repoController := repo.ProvideController(config, checkRepo, authorizer, spaceStore, repoStore, serviceAccountStore, gitrpcInterface)
|
||||
checkSpace := check.ProvideSpaceCheck()
|
||||
spaceController := space.NewController(checkSpace, authorizer, spaceStore, repoStore, serviceAccountStore)
|
||||
spaceController := space.ProvideController(config, checkSpace, authorizer, spaceStore, repoStore, serviceAccountStore)
|
||||
serviceAccount := check.ProvideServiceAccountCheck()
|
||||
serviceaccountController := serviceaccount.NewController(serviceAccount, authorizer, serviceAccountStore, spaceStore, repoStore, tokenStore)
|
||||
apiHandler := router.ProvideAPIHandler(systemStore, authenticator, repoController, spaceController, serviceaccountController, controller)
|
||||
|
@ -13,6 +13,7 @@ import (
|
||||
|
||||
type Controller struct {
|
||||
defaultBranch string
|
||||
gitBaseURL string
|
||||
repoCheck check.Repo
|
||||
authorizer authz.Authorizer
|
||||
spaceStore store.SpaceStore
|
||||
@ -23,6 +24,7 @@ type Controller struct {
|
||||
|
||||
func NewController(
|
||||
defaultBranch string,
|
||||
gitBaseURL string,
|
||||
repoCheck check.Repo,
|
||||
authorizer authz.Authorizer,
|
||||
spaceStore store.SpaceStore,
|
||||
@ -32,6 +34,7 @@ func NewController(
|
||||
) *Controller {
|
||||
return &Controller{
|
||||
defaultBranch: defaultBranch,
|
||||
gitBaseURL: gitBaseURL,
|
||||
repoCheck: repoCheck,
|
||||
authorizer: authorizer,
|
||||
spaceStore: spaceStore,
|
||||
|
@ -139,6 +139,12 @@ func (c *Controller) Create(ctx context.Context, session *auth.Session, in *Crea
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// populate repo url
|
||||
repo.GitURL, err = GenerateRepoGitURL(c.gitBaseURL, repo.Path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return repo, nil
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@ package repo
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"path"
|
||||
"strings"
|
||||
@ -17,8 +18,7 @@ import (
|
||||
)
|
||||
|
||||
// Find finds a repo.
|
||||
func (c *Controller) Find(ctx context.Context, session *auth.Session, repoRef string,
|
||||
cfg *types.Config) (*types.Repository, error) {
|
||||
func (c *Controller) Find(ctx context.Context, session *auth.Session, repoRef string) (*types.Repository, error) {
|
||||
repo, err := findRepoFromRef(ctx, c.repoStore, repoRef)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -27,13 +27,24 @@ func (c *Controller) Find(ctx context.Context, session *auth.Session, repoRef st
|
||||
if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
repoPath := path.Clean(repo.Path)
|
||||
if !strings.HasSuffix(repoPath, ".git") {
|
||||
repoPath += ".git"
|
||||
}
|
||||
repo.URL, err = url.JoinPath(cfg.Git.BaseURL, repoPath)
|
||||
|
||||
repo.GitURL, err = GenerateRepoGitURL(c.gitBaseURL, repo.Path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return repo, nil
|
||||
}
|
||||
|
||||
func GenerateRepoGitURL(gitBaseURL string, repoPath string) (string, error) {
|
||||
repoPath = path.Clean(repoPath)
|
||||
if !strings.HasSuffix(repoPath, ".git") {
|
||||
repoPath += ".git"
|
||||
}
|
||||
gitURL, err := url.JoinPath(gitBaseURL, repoPath)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to join base url '%s' with path '%s': %w", gitBaseURL, repoPath, err)
|
||||
}
|
||||
|
||||
return gitURL, nil
|
||||
}
|
||||
|
@ -21,5 +21,6 @@ var WireSet = wire.NewSet(
|
||||
func ProvideController(config *types.Config, repoCheck check.Repo, authorizer authz.Authorizer,
|
||||
spaceStore store.SpaceStore, repoStore store.RepoStore, saStore store.ServiceAccountStore,
|
||||
rpcClient gitrpc.Interface) *Controller {
|
||||
return NewController(config.Git.DefaultBranch, repoCheck, authorizer, spaceStore, repoStore, saStore, rpcClient)
|
||||
return NewController(config.Git.DefaultBranch, config.Git.BaseURL,
|
||||
repoCheck, authorizer, spaceStore, repoStore, saStore, rpcClient)
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import (
|
||||
)
|
||||
|
||||
type Controller struct {
|
||||
gitBaseURL string
|
||||
spaceCheck check.Space
|
||||
authorizer authz.Authorizer
|
||||
spaceStore store.SpaceStore
|
||||
@ -18,9 +19,10 @@ type Controller struct {
|
||||
saStore store.ServiceAccountStore
|
||||
}
|
||||
|
||||
func NewController(spaceCheck check.Space, authorizer authz.Authorizer, spaceStore store.SpaceStore,
|
||||
func NewController(gitBaseURL string, spaceCheck check.Space, authorizer authz.Authorizer, spaceStore store.SpaceStore,
|
||||
repoStore store.RepoStore, saStore store.ServiceAccountStore) *Controller {
|
||||
return &Controller{
|
||||
gitBaseURL: gitBaseURL,
|
||||
spaceCheck: spaceCheck,
|
||||
authorizer: authorizer,
|
||||
spaceStore: spaceStore,
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
"fmt"
|
||||
|
||||
apiauth "github.com/harness/gitness/internal/api/auth"
|
||||
"github.com/harness/gitness/internal/api/controller/repo"
|
||||
"github.com/harness/gitness/internal/auth"
|
||||
"github.com/harness/gitness/types"
|
||||
"github.com/harness/gitness/types/enum"
|
||||
@ -38,6 +39,13 @@ func (c *Controller) ListRepositories(ctx context.Context, session *auth.Session
|
||||
return nil, 0, fmt.Errorf("failed to list child repos: %w", err)
|
||||
}
|
||||
|
||||
for _, r := range repos {
|
||||
r.GitURL, err = repo.GenerateRepoGitURL(c.gitBaseURL, r.Path)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: needs access control? Might want to avoid that (makes paging and performance hard)
|
||||
*/
|
||||
|
@ -8,15 +8,16 @@ import (
|
||||
"github.com/google/wire"
|
||||
"github.com/harness/gitness/internal/auth/authz"
|
||||
"github.com/harness/gitness/internal/store"
|
||||
"github.com/harness/gitness/types"
|
||||
"github.com/harness/gitness/types/check"
|
||||
)
|
||||
|
||||
// WireSet provides a wire set for this package.
|
||||
var WireSet = wire.NewSet(
|
||||
NewController,
|
||||
ProvideController,
|
||||
)
|
||||
|
||||
func ProvideController(spaceCheck check.Space, authorizer authz.Authorizer, spaceStore store.SpaceStore,
|
||||
repoStore store.RepoStore, saStore store.ServiceAccountStore) *Controller {
|
||||
return NewController(spaceCheck, authorizer, spaceStore, repoStore, saStore)
|
||||
func ProvideController(config *types.Config, spaceCheck check.Space, authorizer authz.Authorizer,
|
||||
spaceStore store.SpaceStore, repoStore store.RepoStore, saStore store.ServiceAccountStore) *Controller {
|
||||
return NewController(config.Git.BaseURL, spaceCheck, authorizer, spaceStore, repoStore, saStore)
|
||||
}
|
||||
|
@ -6,10 +6,6 @@ package repo
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/harness/gitness/types"
|
||||
|
||||
"github.com/harness/gitness/internal/api/controller/repo"
|
||||
"github.com/harness/gitness/internal/api/render"
|
||||
@ -17,7 +13,7 @@ import (
|
||||
)
|
||||
|
||||
// HandleFind writes json-encoded repository information to the http response body.
|
||||
func HandleFind(repoCtrl *repo.Controller, config *types.Config) http.HandlerFunc {
|
||||
func HandleFind(repoCtrl *repo.Controller) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
session, _ := request.AuthSessionFrom(ctx)
|
||||
@ -27,31 +23,12 @@ func HandleFind(repoCtrl *repo.Controller, config *types.Config) http.HandlerFun
|
||||
return
|
||||
}
|
||||
|
||||
repo, err := repoCtrl.Find(ctx, session, repoRef, config)
|
||||
repo, err := repoCtrl.Find(ctx, session, repoRef)
|
||||
if err != nil {
|
||||
render.TranslatedUserError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
parse, err := url.Parse(repo.URL)
|
||||
if err != nil {
|
||||
render.TranslatedUserError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
if parse.Host == "" {
|
||||
parse.Host = r.Host
|
||||
}
|
||||
|
||||
if parse.Scheme == "" {
|
||||
parse.Scheme = "http"
|
||||
if !strings.Contains(parse.Host, "localhost") {
|
||||
parse.Scheme = "https"
|
||||
}
|
||||
}
|
||||
|
||||
repo.URL = parse.String()
|
||||
|
||||
render.JSON(w, http.StatusOK, repo)
|
||||
}
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ func NewAPIHandler(
|
||||
r.Use(middlewareauthn.Attempt(authenticator))
|
||||
|
||||
r.Route("/v1", func(r chi.Router) {
|
||||
setupRoutesV1(r, repoCtrl, spaceCtrl, saCtrl, userCtrl, config)
|
||||
setupRoutesV1(r, repoCtrl, spaceCtrl, saCtrl, userCtrl)
|
||||
})
|
||||
|
||||
// wrap router in terminatedPath encoder.
|
||||
@ -99,9 +99,9 @@ func corsHandler(config *types.Config) func(http.Handler) http.Handler {
|
||||
}
|
||||
|
||||
func setupRoutesV1(r chi.Router, repoCtrl *repo.Controller, spaceCtrl *space.Controller,
|
||||
saCtrl *serviceaccount.Controller, userCtrl *user.Controller, config *types.Config) {
|
||||
saCtrl *serviceaccount.Controller, userCtrl *user.Controller) {
|
||||
setupSpaces(r, spaceCtrl)
|
||||
setupRepos(r, repoCtrl, config)
|
||||
setupRepos(r, repoCtrl)
|
||||
setupUsers(r, userCtrl)
|
||||
setupServiceAccounts(r, saCtrl)
|
||||
setupAdmin(r, userCtrl)
|
||||
@ -140,13 +140,13 @@ func setupSpaces(r chi.Router, spaceCtrl *space.Controller) {
|
||||
})
|
||||
}
|
||||
|
||||
func setupRepos(r chi.Router, repoCtrl *repo.Controller, config *types.Config) {
|
||||
func setupRepos(r chi.Router, repoCtrl *repo.Controller) {
|
||||
r.Route("/repos", func(r chi.Router) {
|
||||
// Create takes path and parentId via body, not uri
|
||||
r.Post("/", handlerrepo.HandleCreate(repoCtrl))
|
||||
r.Route(fmt.Sprintf("/{%s}", request.PathParamRepoRef), func(r chi.Router) {
|
||||
// repo level operations
|
||||
r.Get("/", handlerrepo.HandleFind(repoCtrl, config))
|
||||
r.Get("/", handlerrepo.HandleFind(repoCtrl))
|
||||
r.Put("/", handlerrepo.HandleUpdate(repoCtrl))
|
||||
r.Delete("/", handlerrepo.HandleDelete(repoCtrl))
|
||||
|
||||
|
@ -13,7 +13,7 @@ type Config struct {
|
||||
|
||||
// Git defines the git configuration parameters
|
||||
Git struct {
|
||||
BaseURL string `envconfig:"GITNESS_GIT_BASE_URL"` // clone url
|
||||
BaseURL string `envconfig:"GITNESS_GIT_BASE_URL" default:"http://localhost:3000"` // clone url
|
||||
Root string `envconfig:"GITNESS_GIT_ROOT"`
|
||||
DefaultBranch string `envconfig:"GITNESS_GIT_DEFAULTBRANCH" default:"main"`
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ type Repository struct {
|
||||
NumOpenPulls int `db:"repo_numOpenPulls" json:"numOpenPulls"`
|
||||
|
||||
// git urls
|
||||
URL string `db:"-" json:"url"`
|
||||
GitURL string `db:"-" json:"gitUrl"`
|
||||
}
|
||||
|
||||
// RepoFilter stores repo query parameters.
|
||||
|
Loading…
Reference in New Issue
Block a user