added controllers and handlers for connectors, triggers, templates

jobatzil/rename
Vistaar Juneja 2023-08-22 11:26:59 +01:00
parent 23f612162a
commit 2870aaaabc
32 changed files with 1054 additions and 19 deletions

View File

@ -18,6 +18,7 @@ import (
gitrpcserver "github.com/harness/gitness/gitrpc/server"
gitrpccron "github.com/harness/gitness/gitrpc/server/cron"
checkcontroller "github.com/harness/gitness/internal/api/controller/check"
"github.com/harness/gitness/internal/api/controller/connector"
"github.com/harness/gitness/internal/api/controller/execution"
"github.com/harness/gitness/internal/api/controller/githook"
controllerlogs "github.com/harness/gitness/internal/api/controller/logs"
@ -29,6 +30,8 @@ import (
"github.com/harness/gitness/internal/api/controller/service"
"github.com/harness/gitness/internal/api/controller/serviceaccount"
"github.com/harness/gitness/internal/api/controller/space"
"github.com/harness/gitness/internal/api/controller/template"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/controller/user"
controllerwebhook "github.com/harness/gitness/internal/api/controller/webhook"
"github.com/harness/gitness/internal/auth/authn"
@ -106,6 +109,9 @@ func initSystem(ctx context.Context, config *types.Config) (*cliserver.System, e
livelog.WireSet,
controllerlogs.WireSet,
secret.WireSet,
connector.WireSet,
template.WireSet,
trigger.WireSet,
)
return &cliserver.System{}, nil
}

View File

@ -8,7 +8,6 @@ package main
import (
"context"
"github.com/harness/gitness/cli/server"
"github.com/harness/gitness/encrypt"
"github.com/harness/gitness/events"
@ -16,6 +15,7 @@ import (
server3 "github.com/harness/gitness/gitrpc/server"
"github.com/harness/gitness/gitrpc/server/cron"
check2 "github.com/harness/gitness/internal/api/controller/check"
"github.com/harness/gitness/internal/api/controller/connector"
"github.com/harness/gitness/internal/api/controller/execution"
"github.com/harness/gitness/internal/api/controller/githook"
logs2 "github.com/harness/gitness/internal/api/controller/logs"
@ -28,6 +28,8 @@ import (
"github.com/harness/gitness/internal/api/controller/serviceaccount"
"github.com/harness/gitness/internal/api/controller/space"
"github.com/harness/gitness/internal/api/controller/system"
"github.com/harness/gitness/internal/api/controller/template"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/controller/user"
webhook2 "github.com/harness/gitness/internal/api/controller/webhook"
"github.com/harness/gitness/internal/auth/authn"
@ -109,6 +111,12 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
return nil, err
}
secretController := secret.ProvideController(db, pathUID, pathStore, encrypter, secretStore, authorizer, spaceStore)
triggerStore := database.ProvideTriggerStore(db)
triggerController := trigger.ProvideController(db, authorizer, triggerStore, pipelineStore, spaceStore)
connectorStore := database.ProvideConnectorStore(db)
connectorController := connector.ProvideController(db, pathUID, connectorStore, authorizer, spaceStore)
templateStore := database.ProvideTemplateStore(db)
templateController := template.ProvideController(db, pathUID, pathStore, templateStore, authorizer, spaceStore)
pullReqStore := database.ProvidePullReqStore(db, principalInfoCache)
pullReqActivityStore := database.ProvidePullReqActivityStore(db, principalInfoCache)
codeCommentView := database.ProvideCodeCommentView(db)
@ -163,7 +171,7 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
checkStore := database.ProvideCheckStore(db, principalInfoCache)
checkController := check2.ProvideController(db, authorizer, repoStore, checkStore, gitrpcInterface)
systemController := system.NewController(principalStore, config)
apiHandler := router.ProvideAPIHandler(config, authenticator, repoController, executionController, logsController, spaceController, pipelineController, secretController, pullreqController, webhookController, githookController, serviceaccountController, controller, principalController, checkController, systemController)
apiHandler := router.ProvideAPIHandler(config, authenticator, repoController, executionController, logsController, spaceController, pipelineController, secretController, triggerController, connectorController, templateController, pullreqController, webhookController, githookController, serviceaccountController, controller, principalController, checkController, systemController)
gitHandler := router.ProvideGitHandler(config, provider, repoStore, authenticator, authorizer, gitrpcInterface)
webHandler := router.ProvideWebHandler(config)
routerRouter := router.ProvideRouter(config, apiHandler, gitHandler, webHandler)

View File

@ -15,7 +15,6 @@ import (
type Controller struct {
db *sqlx.DB
uidCheck check.PathUID
pathStore store.PathStore
connectorStore store.ConnectorStore
authorizer authz.Authorizer
spaceStore store.SpaceStore
@ -25,14 +24,12 @@ func NewController(
db *sqlx.DB,
uidCheck check.PathUID,
authorizer authz.Authorizer,
pathStore store.PathStore,
connectorStore store.ConnectorStore,
spaceStore store.SpaceStore,
) *Controller {
return &Controller{
db: db,
uidCheck: uidCheck,
pathStore: pathStore,
connectorStore: connectorStore,
authorizer: authorizer,
spaceStore: spaceStore,

View File

@ -20,10 +20,9 @@ var WireSet = wire.NewSet(
func ProvideController(db *sqlx.DB,
uidCheck check.PathUID,
pathStore store.PathStore,
connectorStore store.ConnectorStore,
authorizer authz.Authorizer,
spaceStore store.SpaceStore,
) *Controller {
return NewController(db, uidCheck, authorizer, pathStore, connectorStore, spaceStore)
return NewController(db, uidCheck, authorizer, connectorStore, spaceStore)
}

View File

@ -25,14 +25,12 @@ func NewController(
db *sqlx.DB,
uidCheck check.PathUID,
authorizer authz.Authorizer,
pathStore store.PathStore,
templateStore store.TemplateStore,
spaceStore store.SpaceStore,
) *Controller {
return &Controller{
db: db,
uidCheck: uidCheck,
pathStore: pathStore,
templateStore: templateStore,
authorizer: authorizer,
spaceStore: spaceStore,

View File

@ -25,5 +25,5 @@ func ProvideController(db *sqlx.DB,
authorizer authz.Authorizer,
spaceStore store.SpaceStore,
) *Controller {
return NewController(db, uidCheck, authorizer, pathStore, templateStore, spaceStore)
return NewController(db, uidCheck, authorizer, templateStore, spaceStore)
}

View File

@ -0,0 +1,36 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"github.com/harness/gitness/internal/auth/authz"
"github.com/harness/gitness/internal/store"
"github.com/jmoiron/sqlx"
)
type Controller struct {
db *sqlx.DB
authorizer authz.Authorizer
triggerStore store.TriggerStore
pipelineStore store.PipelineStore
spaceStore store.SpaceStore
}
func NewController(
db *sqlx.DB,
authorizer authz.Authorizer,
triggerStore store.TriggerStore,
pipelineStore store.PipelineStore,
spaceStore store.SpaceStore,
) *Controller {
return &Controller{
db: db,
authorizer: authorizer,
triggerStore: triggerStore,
pipelineStore: pipelineStore,
spaceStore: spaceStore,
}
}

View File

@ -0,0 +1,67 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"context"
"fmt"
"time"
apiauth "github.com/harness/gitness/internal/api/auth"
"github.com/harness/gitness/internal/auth"
"github.com/harness/gitness/types"
"github.com/harness/gitness/types/enum"
)
// TODO: Add more as needed.
type CreateInput struct {
Description string `json:"description"`
UID string `json:"uid"`
Data string `json:"data"`
}
func (c *Controller) Create(
ctx context.Context,
session *auth.Session,
spaceRef string,
uid string,
in *CreateInput,
) (*types.Trigger, error) {
space, err := c.spaceStore.FindByRef(ctx, spaceRef)
if err != nil {
return nil, fmt.Errorf("could not find space: %w", err)
}
pipeline, err := c.pipelineStore.FindByUID(ctx, space.ID, uid)
if err != nil {
return nil, fmt.Errorf("could not find pipeline: %w", err)
}
err = apiauth.CheckPipeline(ctx, c.authorizer, session, space.Path, pipeline.UID, enum.PermissionPipelineExecute)
if err != nil {
return nil, fmt.Errorf("failed to authorize: %w", err)
}
pipeline, err = c.pipelineStore.IncrementSeqNum(ctx, pipeline)
if err != nil {
return nil, fmt.Errorf("failed to increment sequence number: %w", err)
}
now := time.Now().UnixMilli()
trigger := &types.Trigger{
Description: in.Description,
UID: in.UID,
PipelineID: pipeline.ID,
Created: now,
Updated: now,
Version: 0,
}
err = c.triggerStore.Create(ctx, trigger)
if err != nil {
return nil, fmt.Errorf("trigger creation failed: %w", err)
}
return trigger, nil
}

View File

@ -0,0 +1,41 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"context"
"fmt"
apiauth "github.com/harness/gitness/internal/api/auth"
"github.com/harness/gitness/internal/auth"
"github.com/harness/gitness/types/enum"
)
func (c *Controller) Delete(
ctx context.Context,
session *auth.Session,
spaceRef string,
pipelineUID string,
triggerUID string,
) error {
space, err := c.spaceStore.FindByRef(ctx, spaceRef)
if err != nil {
return fmt.Errorf("could not find parent space: %w", err)
}
pipeline, err := c.pipelineStore.FindByUID(ctx, space.ID, pipelineUID)
if err != nil {
return fmt.Errorf("could not find pipeline: %w", err)
}
err = apiauth.CheckPipeline(ctx, c.authorizer, session, space.Path, pipeline.UID, enum.PermissionPipelineDelete)
if err != nil {
return fmt.Errorf("could not authorize: %w", err)
}
err = c.triggerStore.DeleteByUID(ctx, pipeline.ID, triggerUID)
if err != nil {
return fmt.Errorf("could not delete trigger: %w", err)
}
return nil
}

View File

@ -0,0 +1,45 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"context"
"fmt"
apiauth "github.com/harness/gitness/internal/api/auth"
"github.com/harness/gitness/internal/auth"
"github.com/harness/gitness/types"
"github.com/harness/gitness/types/enum"
)
func (c *Controller) Find(
ctx context.Context,
session *auth.Session,
spaceRef string,
pipelineUID string,
triggerUID string,
) (*types.Trigger, error) {
space, err := c.spaceStore.FindByRef(ctx, spaceRef)
if err != nil {
return nil, fmt.Errorf("could not find parent space: %w", err)
}
pipeline, err := c.pipelineStore.FindByUID(ctx, space.ID, pipelineUID)
if err != nil {
return nil, fmt.Errorf("could not find pipeline: %w", err)
}
err = apiauth.CheckPipeline(ctx, c.authorizer, session, space.Path, pipeline.UID, enum.PermissionPipelineView)
if err != nil {
return nil, fmt.Errorf("could not authorize: %w", err)
}
trigger, err := c.triggerStore.FindByUID(ctx, pipeline.ID, triggerUID)
if err != nil {
return nil, fmt.Errorf("could not find trigger %s: %w", triggerUID, err)
}
return trigger, nil
}

View File

@ -0,0 +1,59 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"context"
"fmt"
apiauth "github.com/harness/gitness/internal/api/auth"
"github.com/harness/gitness/internal/auth"
"github.com/harness/gitness/store/database/dbtx"
"github.com/harness/gitness/types"
"github.com/harness/gitness/types/enum"
)
func (c *Controller) List(
ctx context.Context,
session *auth.Session,
spaceRef string,
pipelineUID string,
filter types.ListQueryFilter,
) ([]*types.Trigger, int64, error) {
space, err := c.spaceStore.FindByRef(ctx, spaceRef)
if err != nil {
return nil, 0, fmt.Errorf("failed to find parent space: %w", err)
}
pipeline, err := c.pipelineStore.FindByUID(ctx, space.ID, pipelineUID)
if err != nil {
return nil, 0, fmt.Errorf("failed to find pipeline: %w", err)
}
err = apiauth.CheckPipeline(ctx, c.authorizer, session, space.Path, pipeline.UID, enum.PermissionPipelineView)
if err != nil {
return nil, 0, fmt.Errorf("failed to authorize: %w", err)
}
var count int64
var triggers []*types.Trigger
err = dbtx.New(c.db).WithTx(ctx, func(ctx context.Context) (err error) {
count, err = c.triggerStore.Count(ctx, pipeline.ID, filter)
if err != nil {
return fmt.Errorf("failed to count child triggers: %w", err)
}
triggers, err = c.triggerStore.List(ctx, pipeline.ID, filter)
if err != nil {
return fmt.Errorf("failed to list child triggers: %w", err)
}
return
}, dbtx.TxDefaultReadOnly)
if err != nil {
return triggers, count, fmt.Errorf("failed to fetch list: %w", err)
}
return triggers, count, nil
}

View File

@ -0,0 +1,61 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"context"
"fmt"
apiauth "github.com/harness/gitness/internal/api/auth"
"github.com/harness/gitness/internal/auth"
"github.com/harness/gitness/types"
"github.com/harness/gitness/types/enum"
)
// UpdateInput is used for updating a trigger.
type UpdateInput struct {
Description string `json:"description"`
UID string `json:"uid"`
}
func (c *Controller) Update(
ctx context.Context,
session *auth.Session,
spaceRef string,
pipelineUID string,
triggerUID string,
in *UpdateInput) (*types.Trigger, error) {
space, err := c.spaceStore.FindByRef(ctx, spaceRef)
if err != nil {
return nil, fmt.Errorf("could not find space: %w", err)
}
err = apiauth.CheckPipeline(ctx, c.authorizer, session, space.Path, pipelineUID, enum.PermissionPipelineEdit)
if err != nil {
return nil, fmt.Errorf("failed to check auth: %w", err)
}
pipeline, err := c.pipelineStore.FindByUID(ctx, space.ID, pipelineUID)
if err != nil {
return nil, fmt.Errorf("failed to find pipeline: %w", err)
}
trigger, err := c.triggerStore.FindByUID(ctx, pipeline.ID, triggerUID)
if err != nil {
return nil, fmt.Errorf("failed to find trigger: %w", err)
}
return c.triggerStore.UpdateOptLock(ctx,
trigger, func(original *types.Trigger) error {
// update values only if provided
if in.Description != "" {
original.Description = in.Description
}
if in.UID != "" {
original.UID = in.UID
}
return nil
})
}

View File

@ -0,0 +1,27 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"github.com/harness/gitness/internal/auth/authz"
"github.com/harness/gitness/internal/store"
"github.com/google/wire"
"github.com/jmoiron/sqlx"
)
// WireSet provides a wire set for this package.
var WireSet = wire.NewSet(
ProvideController,
)
func ProvideController(db *sqlx.DB,
authorizer authz.Authorizer,
triggerStore store.TriggerStore,
pipelineStore store.PipelineStore,
spaceStore store.SpaceStore,
) *Controller {
return NewController(db, authorizer, triggerStore, pipelineStore, spaceStore)
}

View File

@ -0,0 +1,37 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package connector
import (
"encoding/json"
"net/http"
"github.com/harness/gitness/internal/api/controller/connector"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
)
// HandleCreate returns a http.HandlerFunc that creates a new connector.
func HandleCreate(connectorCtrl *connector.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
in := new(connector.CreateInput)
err := json.NewDecoder(r.Body).Decode(in)
if err != nil {
render.BadRequestf(w, "Invalid Request Body: %s.", err)
return
}
connector, err := connectorCtrl.Create(ctx, session, in)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusCreated, connector)
}
}

View File

@ -0,0 +1,39 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package connector
import (
"net/http"
"github.com/harness/gitness/internal/api/controller/connector"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleDelete(connectorCtrl *connector.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
connectorRef, err := request.GetConnectorRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, connectorUID, err := paths.DisectLeaf(connectorRef)
if err != nil {
render.TranslatedUserError(w, err)
return
}
err = connectorCtrl.Delete(ctx, session, spaceRef, connectorUID)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.DeleteSuccessful(w)
}
}

View File

@ -0,0 +1,39 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package connector
import (
"net/http"
"github.com/harness/gitness/internal/api/controller/connector"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
// HandleFind finds a connector from the database.
func HandleFind(connectorCtrl *connector.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
connectorRef, err := request.GetConnectorRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, connectorUID, err := paths.DisectLeaf(connectorRef)
if err != nil {
render.TranslatedUserError(w, err)
}
connector, err := connectorCtrl.Find(ctx, session, spaceRef, connectorUID)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusOK, connector)
}
}

View File

@ -0,0 +1,47 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package connector
import (
"encoding/json"
"net/http"
"github.com/harness/gitness/internal/api/controller/connector"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleUpdate(connectorCtrl *connector.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
in := new(connector.UpdateInput)
err := json.NewDecoder(r.Body).Decode(in)
if err != nil {
render.BadRequestf(w, "Invalid Request Body: %s.", err)
return
}
connectorRef, err := request.GetConnectorRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, connectorUID, err := paths.DisectLeaf(connectorRef)
if err != nil {
render.TranslatedUserError(w, err)
}
connector, err := connectorCtrl.Update(ctx, session, spaceRef, connectorUID, in)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusOK, connector)
}
}

View File

@ -0,0 +1,37 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package template
import (
"encoding/json"
"net/http"
"github.com/harness/gitness/internal/api/controller/template"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
)
// HandleCreate returns a http.HandlerFunc that creates a new template.
func HandleCreate(templateCtrl *template.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
in := new(template.CreateInput)
err := json.NewDecoder(r.Body).Decode(in)
if err != nil {
render.BadRequestf(w, "Invalid Request Body: %s.", err)
return
}
template, err := templateCtrl.Create(ctx, session, in)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusCreated, template)
}
}

View File

@ -0,0 +1,39 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package template
import (
"net/http"
"github.com/harness/gitness/internal/api/controller/template"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleDelete(templateCtrl *template.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
templateRef, err := request.GetTemplateRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, templateUID, err := paths.DisectLeaf(templateRef)
if err != nil {
render.TranslatedUserError(w, err)
return
}
err = templateCtrl.Delete(ctx, session, spaceRef, templateUID)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.DeleteSuccessful(w)
}
}

View File

@ -0,0 +1,39 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package template
import (
"net/http"
"github.com/harness/gitness/internal/api/controller/template"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
// HandleFind finds a template from the database.
func HandleFind(templateCtrl *template.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
templateRef, err := request.GetTemplateRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, templateUID, err := paths.DisectLeaf(templateRef)
if err != nil {
render.TranslatedUserError(w, err)
}
template, err := templateCtrl.Find(ctx, session, spaceRef, templateUID)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusOK, template)
}
}

View File

@ -0,0 +1,47 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package template
import (
"encoding/json"
"net/http"
"github.com/harness/gitness/internal/api/controller/template"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleUpdate(templateCtrl *template.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
in := new(template.UpdateInput)
err := json.NewDecoder(r.Body).Decode(in)
if err != nil {
render.BadRequestf(w, "Invalid Request Body: %s.", err)
return
}
templateRef, err := request.GetTemplateRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, templateUID, err := paths.DisectLeaf(templateRef)
if err != nil {
render.TranslatedUserError(w, err)
}
template, err := templateCtrl.Update(ctx, session, spaceRef, templateUID, in)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusOK, template)
}
}

View File

@ -0,0 +1,47 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"encoding/json"
"net/http"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleCreate(triggerCtrl *trigger.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
pipelineRef, err := request.GetPipelineRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, pipelineUID, err := paths.DisectLeaf(pipelineRef)
if err != nil {
render.TranslatedUserError(w, err)
return
}
in := new(trigger.CreateInput)
err = json.NewDecoder(r.Body).Decode(in)
if err != nil {
render.BadRequestf(w, "Invalid Request Body: %s.", err)
return
}
trigger, err := triggerCtrl.Create(ctx, session, spaceRef, pipelineUID, in)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusCreated, trigger)
}
}

View File

@ -0,0 +1,44 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"net/http"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleDelete(triggerCtrl *trigger.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
pipelineRef, err := request.GetPipelineRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, pipelineUID, err := paths.DisectLeaf(pipelineRef)
if err != nil {
render.TranslatedUserError(w, err)
return
}
n, err := request.GetTriggerUIDFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
err = triggerCtrl.Delete(ctx, session, spaceRef, pipelineUID, n)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.DeleteSuccessful(w)
}
}

View File

@ -0,0 +1,44 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"net/http"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleFind(triggerCtrl *trigger.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
pipelineRef, err := request.GetPipelineRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
triggerUID, err := request.GetTriggerUIDFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, pipelineUID, err := paths.DisectLeaf(pipelineRef)
if err != nil {
render.TranslatedUserError(w, err)
return
}
trigger, err := triggerCtrl.Find(ctx, session, spaceRef, pipelineUID, triggerUID)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusOK, trigger)
}
}

View File

@ -0,0 +1,42 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"net/http"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleList(triggerCtrl *trigger.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
pipelineRef, err := request.GetPipelineRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, pipelineUID, err := paths.DisectLeaf(pipelineRef)
if err != nil {
render.TranslatedUserError(w, err)
return
}
filter := request.ParseListQueryFilterFromRequest(r)
repos, totalCount, err := triggerCtrl.List(ctx, session, spaceRef, pipelineUID, filter)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.Pagination(r, w, filter.Page, filter.Size, int(totalCount))
render.JSON(w, http.StatusOK, repos)
}
}

View File

@ -0,0 +1,53 @@
// Copyright 2022 Harness Inc. All rights reserved.
// Use of this source code is governed by the Polyform Free Trial License
// that can be found in the LICENSE.md file for this repository.
package trigger
import (
"encoding/json"
"net/http"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/render"
"github.com/harness/gitness/internal/api/request"
"github.com/harness/gitness/internal/paths"
)
func HandleUpdate(triggerCtrl *trigger.Controller) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
session, _ := request.AuthSessionFrom(ctx)
in := new(trigger.UpdateInput)
err := json.NewDecoder(r.Body).Decode(in)
if err != nil {
render.BadRequestf(w, "Invalid Request Body: %s.", err)
return
}
pipelineRef, err := request.GetPipelineRefFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
spaceRef, pipelineUID, err := paths.DisectLeaf(pipelineRef)
if err != nil {
render.TranslatedUserError(w, err)
return
}
triggerUID, err := request.GetTriggerUIDFromPath(r)
if err != nil {
render.TranslatedUserError(w, err)
return
}
pipeline, err := triggerCtrl.Update(ctx, session, spaceRef, pipelineUID, triggerUID, in)
if err != nil {
render.TranslatedUserError(w, err)
return
}
render.JSON(w, http.StatusOK, pipeline)
}
}

View File

@ -0,0 +1,20 @@
package request
import (
"net/http"
"net/url"
)
const (
PathParamConnectorRef = "connector_ref"
)
func GetConnectorRefFromPath(r *http.Request) (string, error) {
rawRef, err := PathParamOrError(r, PathParamConnectorRef)
if err != nil {
return "", err
}
// paths are unescaped
return url.PathUnescape(rawRef)
}

View File

@ -14,6 +14,7 @@ const (
PathParamExecutionNumber = "execution_number"
PathParamStageNumber = "stage_number"
PathParamStepNumber = "step_number"
PathParamTriggerRef = "trigger_ref"
)
func GetPipelineRefFromPath(r *http.Request) (string, error) {
@ -37,3 +38,13 @@ func GetStageNumberFromPath(r *http.Request) (int64, error) {
func GetStepNumberFromPath(r *http.Request) (int64, error) {
return PathParamAsPositiveInt64(r, PathParamStepNumber)
}
func GetTriggerUIDFromPath(r *http.Request) (string, error) {
rawRef, err := PathParamOrError(r, PathParamTriggerRef)
if err != nil {
return "", err
}
// paths are unescaped
return url.PathUnescape(rawRef)
}

View File

@ -0,0 +1,20 @@
package request
import (
"net/http"
"net/url"
)
const (
PathParamTemplateRef = "template_ref"
)
func GetTemplateRefFromPath(r *http.Request) (string, error) {
rawRef, err := PathParamOrError(r, PathParamTemplateRef)
if err != nil {
return "", err
}
// paths are unescaped
return url.PathUnescape(rawRef)
}

View File

@ -10,6 +10,7 @@ import (
"github.com/harness/gitness/githook"
"github.com/harness/gitness/internal/api/controller/check"
"github.com/harness/gitness/internal/api/controller/connector"
"github.com/harness/gitness/internal/api/controller/execution"
controllergithook "github.com/harness/gitness/internal/api/controller/githook"
"github.com/harness/gitness/internal/api/controller/logs"
@ -21,10 +22,13 @@ import (
"github.com/harness/gitness/internal/api/controller/serviceaccount"
"github.com/harness/gitness/internal/api/controller/space"
"github.com/harness/gitness/internal/api/controller/system"
"github.com/harness/gitness/internal/api/controller/template"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/controller/user"
"github.com/harness/gitness/internal/api/controller/webhook"
"github.com/harness/gitness/internal/api/handler/account"
handlercheck "github.com/harness/gitness/internal/api/handler/check"
handlerconnector "github.com/harness/gitness/internal/api/handler/connector"
handlerexecution "github.com/harness/gitness/internal/api/handler/execution"
handlergithook "github.com/harness/gitness/internal/api/handler/githook"
handlerlogs "github.com/harness/gitness/internal/api/handler/logs"
@ -37,6 +41,8 @@ import (
handlerserviceaccount "github.com/harness/gitness/internal/api/handler/serviceaccount"
handlerspace "github.com/harness/gitness/internal/api/handler/space"
handlersystem "github.com/harness/gitness/internal/api/handler/system"
handlertemplate "github.com/harness/gitness/internal/api/handler/template"
handlertrigger "github.com/harness/gitness/internal/api/handler/trigger"
handleruser "github.com/harness/gitness/internal/api/handler/user"
"github.com/harness/gitness/internal/api/handler/users"
handlerwebhook "github.com/harness/gitness/internal/api/handler/webhook"
@ -63,7 +69,8 @@ type APIHandler interface {
var (
// terminatedPathPrefixesAPI is the list of prefixes that will require resolving terminated paths.
terminatedPathPrefixesAPI = []string{"/v1/spaces/", "/v1/repos/", "/v1/pipelines/", "/v1/secrets/"}
terminatedPathPrefixesAPI = []string{"/v1/spaces/", "/v1/repos/", "/v1/pipelines/",
"/v1/secrets/", "/v1/connectors", "/v1/templates"}
)
// NewAPIHandler returns a new APIHandler.
@ -76,6 +83,9 @@ func NewAPIHandler(
spaceCtrl *space.Controller,
pipelineCtrl *pipeline.Controller,
secretCtrl *secret.Controller,
triggerCtrl *trigger.Controller,
connectorCtrl *connector.Controller,
templateCtrl *template.Controller,
pullreqCtrl *pullreq.Controller,
webhookCtrl *webhook.Controller,
githookCtrl *controllergithook.Controller,
@ -106,9 +116,9 @@ func NewAPIHandler(
r.Use(middlewareauthn.Attempt(authenticator, authn.SourceRouterAPI))
r.Route("/v1", func(r chi.Router) {
setupRoutesV1(r, repoCtrl, executionCtrl, logCtrl, pipelineCtrl,
secretCtrl, spaceCtrl, pullreqCtrl, webhookCtrl, githookCtrl,
saCtrl, userCtrl, principalCtrl, checkCtrl, sysCtrl)
setupRoutesV1(r, repoCtrl, executionCtrl, triggerCtrl, logCtrl, pipelineCtrl,
connectorCtrl, templateCtrl, secretCtrl, spaceCtrl, pullreqCtrl,
webhookCtrl, githookCtrl, saCtrl, userCtrl, principalCtrl, checkCtrl, sysCtrl)
})
// wrap router in terminatedPath encoder.
@ -131,8 +141,11 @@ func corsHandler(config *types.Config) func(http.Handler) http.Handler {
func setupRoutesV1(r chi.Router,
repoCtrl *repo.Controller,
executionCtrl *execution.Controller,
triggerCtrl *trigger.Controller,
logCtrl *logs.Controller,
pipelineCtrl *pipeline.Controller,
connectorCtrl *connector.Controller,
templateCtrl *template.Controller,
secretCtrl *secret.Controller,
spaceCtrl *space.Controller,
pullreqCtrl *pullreq.Controller,
@ -146,7 +159,9 @@ func setupRoutesV1(r chi.Router,
) {
setupSpaces(r, spaceCtrl)
setupRepos(r, repoCtrl, pullreqCtrl, webhookCtrl, checkCtrl)
setupPipelines(r, pipelineCtrl, executionCtrl, logCtrl)
setupPipelines(r, pipelineCtrl, executionCtrl, triggerCtrl, logCtrl)
setupConnectors(r, connectorCtrl)
setupTemplates(r, templateCtrl)
setupSecrets(r, secretCtrl)
setupUser(r, userCtrl)
setupServiceAccounts(r, saCtrl)
@ -299,6 +314,7 @@ func setupPipelines(
r chi.Router,
pipelineCtrl *pipeline.Controller,
executionCtrl *execution.Controller,
triggerCtrl *trigger.Controller,
logCtrl *logs.Controller) {
r.Route("/pipelines", func(r chi.Router) {
// Create takes path and parentId via body, not uri
@ -307,7 +323,38 @@ func setupPipelines(
r.Get("/", handlerpipeline.HandleFind(pipelineCtrl))
r.Patch("/", handlerpipeline.HandleUpdate(pipelineCtrl))
r.Delete("/", handlerpipeline.HandleDelete(pipelineCtrl))
setupExecutions(r, pipelineCtrl, executionCtrl, logCtrl)
setupExecutions(r, executionCtrl, logCtrl)
setupTriggers(r, triggerCtrl)
})
})
}
func setupConnectors(
r chi.Router,
connectorCtrl *connector.Controller,
) {
r.Route("/connectors", func(r chi.Router) {
// Create takes path and parentId via body, not uri
r.Post("/", handlerconnector.HandleCreate(connectorCtrl))
r.Route(fmt.Sprintf("/{%s}", request.PathParamConnectorRef), func(r chi.Router) {
r.Get("/", handlerconnector.HandleFind(connectorCtrl))
r.Patch("/", handlerconnector.HandleUpdate(connectorCtrl))
r.Delete("/", handlerconnector.HandleDelete(connectorCtrl))
})
})
}
func setupTemplates(
r chi.Router,
templateCtrl *template.Controller,
) {
r.Route("/templates", func(r chi.Router) {
// Create takes path and parentId via body, not uri
r.Post("/", handlertemplate.HandleCreate(templateCtrl))
r.Route(fmt.Sprintf("/{%s}", request.PathParamTemplateRef), func(r chi.Router) {
r.Get("/", handlertemplate.HandleFind(templateCtrl))
r.Patch("/", handlertemplate.HandleUpdate(templateCtrl))
r.Delete("/", handlertemplate.HandleDelete(templateCtrl))
})
})
}
@ -326,7 +373,6 @@ func setupSecrets(r chi.Router, secretCtrl *secret.Controller) {
func setupExecutions(
r chi.Router,
pipelineCtrl *pipeline.Controller,
executionCtrl *execution.Controller,
logCtrl *logs.Controller,
) {
@ -352,6 +398,21 @@ func setupExecutions(
})
}
func setupTriggers(
r chi.Router,
triggerCtrl *trigger.Controller,
) {
r.Route("/triggers", func(r chi.Router) {
r.Get("/", handlertrigger.HandleList(triggerCtrl))
r.Post("/", handlertrigger.HandleCreate(triggerCtrl))
r.Route(fmt.Sprintf("/{%s}", request.PathParamTriggerRef), func(r chi.Router) {
r.Get("/", handlertrigger.HandleFind(triggerCtrl))
r.Patch("/", handlertrigger.HandleUpdate(triggerCtrl))
r.Delete("/", handlertrigger.HandleDelete(triggerCtrl))
})
})
}
func setupInternal(r chi.Router, githookCtrl *controllergithook.Controller) {
r.Route("/internal", func(r chi.Router) {
SetupGitHooks(r, githookCtrl)

View File

@ -7,6 +7,7 @@ package router
import (
"github.com/harness/gitness/gitrpc"
"github.com/harness/gitness/internal/api/controller/check"
"github.com/harness/gitness/internal/api/controller/connector"
"github.com/harness/gitness/internal/api/controller/execution"
"github.com/harness/gitness/internal/api/controller/githook"
"github.com/harness/gitness/internal/api/controller/logs"
@ -18,6 +19,8 @@ import (
"github.com/harness/gitness/internal/api/controller/serviceaccount"
"github.com/harness/gitness/internal/api/controller/space"
"github.com/harness/gitness/internal/api/controller/system"
"github.com/harness/gitness/internal/api/controller/template"
"github.com/harness/gitness/internal/api/controller/trigger"
"github.com/harness/gitness/internal/api/controller/user"
"github.com/harness/gitness/internal/api/controller/webhook"
"github.com/harness/gitness/internal/auth/authn"
@ -67,6 +70,9 @@ func ProvideAPIHandler(
spaceCtrl *space.Controller,
pipelineCtrl *pipeline.Controller,
secretCtrl *secret.Controller,
triggerCtrl *trigger.Controller,
connectorCtrl *connector.Controller,
templateCtrl *template.Controller,
pullreqCtrl *pullreq.Controller,
webhookCtrl *webhook.Controller,
githookCtrl *githook.Controller,
@ -76,8 +82,9 @@ func ProvideAPIHandler(
checkCtrl *check.Controller,
sysCtrl *system.Controller,
) APIHandler {
return NewAPIHandler(config, authenticator, repoCtrl, executionCtrl, logCtrl, spaceCtrl, pipelineCtrl, secretCtrl,
pullreqCtrl, webhookCtrl, githookCtrl, saCtrl, userCtrl, principalCtrl, checkCtrl, sysCtrl)
return NewAPIHandler(config, authenticator, repoCtrl, executionCtrl, logCtrl, spaceCtrl, pipelineCtrl,
secretCtrl, triggerCtrl, connectorCtrl, templateCtrl, pullreqCtrl, webhookCtrl, githookCtrl,
saCtrl, userCtrl, principalCtrl, checkCtrl, sysCtrl)
}
func ProvideWebHandler(config *types.Config) WebHandler {

View File

@ -40,6 +40,9 @@ var WireSet = wire.NewSet(
ProvideWebhookExecutionStore,
ProvideCheckStore,
ProvideReqCheckStore,
ProvideConnectorStore,
ProvideTemplateStore,
ProvideTriggerStore,
)
// migrator is helper function to set up the database by performing automated
@ -103,6 +106,21 @@ func ProvideSecretStore(db *sqlx.DB) store.SecretStore {
return NewSecretStore(db)
}
// ProvideConnectorStore provides a connector store.
func ProvideConnectorStore(db *sqlx.DB) store.ConnectorStore {
return NewConnectorStore(db)
}
// ProvideTemplateStore provides a template store.
func ProvideTemplateStore(db *sqlx.DB) store.TemplateStore {
return NewTemplateStore(db)
}
// ProvideTriggerStore provides a trigger store.
func ProvideTriggerStore(db *sqlx.DB) store.TriggerStore {
return NewTriggerStore(db)
}
// ProvideExecutionStore provides an execution store.
func ProvideExecutionStore(db *sqlx.DB) store.ExecutionStore {
return NewExecutionStore(db)