Skip to content

Commit

Permalink
create webhook secret if not exist
Browse files Browse the repository at this point in the history
  • Loading branch information
steebchen committed May 25, 2024
1 parent c5f5114 commit d1fa773
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 2 deletions.
11 changes: 10 additions & 1 deletion internal/randstr/randstr.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,16 @@ import (
const letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-"

func MustGenerateWebhookSecret() string {
return MustGenerateRandomString(32)
secret, err := GenerateWebhookSecret()
if err != nil {
panic(err)
}

return secret
}

func GenerateWebhookSecret() (string, error) {
return GenerateRandomString(32)
}

func MustGenerateRandomString(n int) string {
Expand Down
11 changes: 11 additions & 0 deletions internal/repository/prisma/dbsqlc/tenants.sql
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,14 @@ SET
WHERE
"tenantId" = sqlc.arg('tenantId')::uuid
RETURNING *;

-- name: UpdateTenant :one
UPDATE
"Tenant" as tenants
SET
"name" = COALESCE(sqlc.narg('name')::text, "name"),
"analyticsOptOut" = COALESCE(sqlc.narg('analyticsOptOut')::boolean, "analyticsOptOut"),
"webhookSecret" = COALESCE(sqlc.narg('webhookSecret')::text, "webhookSecret")
WHERE
"id" = sqlc.arg('id')::uuid
RETURNING *;
40 changes: 40 additions & 0 deletions internal/repository/prisma/dbsqlc/tenants.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions internal/repository/prisma/tenant.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,3 +198,27 @@ func (r *tenantEngineRepository) GetTenantByID(ctx context.Context, tenantId str
return r.queries.GetTenantByID(ctx, r.pool, sqlchelpers.UUIDFromStr(tenantId))
})
}

func (r *tenantEngineRepository) UpdateTenant(ctx context.Context, tenantId string, opts *repository.UpdateTenantEngineOpts) (*dbsqlc.Tenant, error) {
if err := r.v.Validate(opts); err != nil {
return nil, err
}

params := dbsqlc.UpdateTenantParams{
ID: sqlchelpers.UUIDFromStr(tenantId),
}

if opts.Name != nil {
params.Name = sqlchelpers.TextFromStr(*opts.Name)
}

if opts.AnalyticsOptOut != nil {
params.AnalyticsOptOut = sqlchelpers.BoolFromValue(opts.AnalyticsOptOut)
}

if opts.WebhookSecret != nil {
params.WebhookSecret = sqlchelpers.TextFromStr(*opts.WebhookSecret)
}

return r.queries.UpdateTenant(ctx, r.pool, params)
}
11 changes: 10 additions & 1 deletion internal/repository/tenant.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ type TenantAPIRepository interface {
// CreateTenant creates a new tenant.
CreateTenant(opts *CreateTenantOpts) (*db.TenantModel, error)

// CreateTenant creates a new tenant.
// CreateTenant updates an existing tenant.
UpdateTenant(tenantId string, opts *UpdateTenantOpts) (*db.TenantModel, error)

// GetTenantByID returns the tenant with the given id
Expand Down Expand Up @@ -71,10 +71,19 @@ type TenantAPIRepository interface {
DeleteTenantMember(memberId string) (*db.TenantMemberModel, error)
}

type UpdateTenantEngineOpts struct {
Name *string
AnalyticsOptOut *bool
WebhookSecret *string
}

type TenantEngineRepository interface {
// ListTenants lists all tenants in the instance
ListTenants(ctx context.Context) ([]*dbsqlc.Tenant, error)

// GetTenantByID returns the tenant with the given id
GetTenantByID(ctx context.Context, tenantId string) (*dbsqlc.Tenant, error)

// UpdateTenant updates an existing tenant
UpdateTenant(ctx context.Context, tenantId string, opts *UpdateTenantEngineOpts) (*dbsqlc.Tenant, error)
}
15 changes: 15 additions & 0 deletions internal/services/admin/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"google.golang.org/protobuf/types/known/timestamppb"

"github.com/hatchet-dev/hatchet/internal/msgqueue"
"github.com/hatchet-dev/hatchet/internal/randstr"
"github.com/hatchet-dev/hatchet/internal/repository"
"github.com/hatchet-dev/hatchet/internal/repository/prisma/dbsqlc"
"github.com/hatchet-dev/hatchet/internal/repository/prisma/sqlchelpers"
Expand Down Expand Up @@ -163,6 +164,20 @@ func (a *AdminServiceImpl) PutWorkflow(ctx context.Context, req *contracts.PutWo
)
}

// if a webhook workflow is being created, but the tenant does not have a webhook secret, update it
if createOpts.Webhook != nil && !tenant.WebhookSecret.Valid {
secret, err := randstr.GenerateWebhookSecret()
if err != nil {
return nil, err
}
_, err = a.repo.Tenant().UpdateTenant(ctx, tenantId, &repository.UpdateTenantEngineOpts{
WebhookSecret: repository.StringPtr(secret),
})
if err != nil {
return nil, err
}
}

// determine if workflow already exists
var workflowVersion *dbsqlc.GetWorkflowVersionForEngineRow
var oldWorkflowVersion *dbsqlc.GetWorkflowVersionForEngineRow
Expand Down

0 comments on commit d1fa773

Please sign in to comment.