From 897d5eb79f6a81a90afee96d499c1a805535796c Mon Sep 17 00:00:00 2001 From: corbadovych <149707852+corbadovych@users.noreply.github.com> Date: Fri, 17 Nov 2023 07:46:52 +0200 Subject: [PATCH] Add some project APIs (#1) --- pkg/sdk/authtoken/authtoken.go | 11 +++-- pkg/sdk/project/project.go | 74 ++++++++++++++++++++++++++++++++++ sdk.go | 20 +++++++++ 3 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 pkg/sdk/project/project.go diff --git a/pkg/sdk/authtoken/authtoken.go b/pkg/sdk/authtoken/authtoken.go index abc0afc..4622551 100644 --- a/pkg/sdk/authtoken/authtoken.go +++ b/pkg/sdk/authtoken/authtoken.go @@ -3,6 +3,7 @@ package authtoken import ( "context" + "github.com/corbado/corbado-go/pkg/sdk/assert" "github.com/corbado/corbado-go/pkg/sdk/entity/api" "github.com/corbado/corbado-go/pkg/sdk/servererror" ) @@ -17,11 +18,15 @@ type Impl struct { var _ AuthToken = &Impl{} -// New returns new email link client -func New(client *api.ClientWithResponses) *Impl { +// New returns new auth tokens client +func New(client *api.ClientWithResponses) (*Impl, error) { + if err := assert.NotNil(client); err != nil { + return nil, err + } + return &Impl{ client: client, - } + }, nil } func (i *Impl) Validate(ctx context.Context, req api.AuthTokenValidateReq, editors ...api.RequestEditorFn) (*api.AuthTokenValidateRsp, error) { diff --git a/pkg/sdk/project/project.go b/pkg/sdk/project/project.go new file mode 100644 index 0000000..a784393 --- /dev/null +++ b/pkg/sdk/project/project.go @@ -0,0 +1,74 @@ +package project + +import ( + "context" + + "github.com/corbado/corbado-go/pkg/sdk/assert" + "github.com/corbado/corbado-go/pkg/sdk/entity/api" + "github.com/corbado/corbado-go/pkg/sdk/servererror" +) + +type Project interface { + CreateSecret(ctx context.Context, req api.ProjectSecretCreateReq, editors ...api.RequestEditorFn) (*api.ProjectSecretCreateRsp, error) + ConfigGet(ctx context.Context, editors ...api.RequestEditorFn) (*api.ProjectConfigGetRsp, error) + ConfigUpdate(ctx context.Context, req api.ProjectConfigSaveReq, editors ...api.RequestEditorFn) error +} + +type Impl struct { + client *api.ClientWithResponses +} + +var _ Project = &Impl{} + +// New returns new projects client +func New(client *api.ClientWithResponses) (*Impl, error) { + if err := assert.NotNil(client); err != nil { + return nil, err + } + + return &Impl{ + client: client, + }, nil +} + +// CreateSecret creates an API secret +func (i *Impl) CreateSecret(ctx context.Context, req api.ProjectSecretCreateReq, editors ...api.RequestEditorFn) (*api.ProjectSecretCreateRsp, error) { + res, err := i.client.ProjectSecretCreateWithResponse(ctx, req, editors...) + if err != nil { + return nil, err + } + + if res.JSONDefault != nil { + return nil, servererror.New(res.JSONDefault) + } + + return res.JSON200, nil +} + +// ConfigGet retrieves project config by projectID inferred from authentication +func (i *Impl) ConfigGet(ctx context.Context, editors ...api.RequestEditorFn) (*api.ProjectConfigGetRsp, error) { + res, err := i.client.ProjectConfigGetWithResponse(ctx, editors...) + if err != nil { + return nil, err + } + + if res.JSONDefault != nil { + return nil, servererror.New(res.JSONDefault) + } + + return res.JSON200, nil +} + +// ConfigUpdate saves project config +func (i *Impl) ConfigUpdate(ctx context.Context, req api.ProjectConfigSaveReq, editors ...api.RequestEditorFn) error { + res, err := i.client.ProjectConfigSaveWithResponse(ctx, req, editors...) + if err != nil { + return err + } + + if res.JSONDefault != nil { + return servererror.New(res.JSONDefault) + } + + return nil +} diff --git a/sdk.go b/sdk.go index 0189867..0edf064 100644 --- a/sdk.go +++ b/sdk.go @@ -7,6 +7,7 @@ import ( "github.com/corbado/corbado-go/pkg/sdk/authtoken" "github.com/corbado/corbado-go/pkg/sdk/emaillink" "github.com/corbado/corbado-go/pkg/sdk/entity/api" + "github.com/corbado/corbado-go/pkg/sdk/project" "github.com/corbado/corbado-go/pkg/sdk/servererror" "github.com/corbado/corbado-go/pkg/sdk/session" "github.com/corbado/corbado-go/pkg/sdk/user" @@ -19,6 +20,7 @@ const Version = "v0.1.0" type SDK interface { AuthTokens() authtoken.AuthToken EmailLinks() emaillink.EmailLink + Projects() project.Project Sessions() session.Session Users() user.User Validations() validation.Validation @@ -30,6 +32,7 @@ type Impl struct { authTokens authtoken.AuthToken emailLinks emaillink.EmailLink + projects project.Project sessions session.Session validation validation.Validation users user.User @@ -49,11 +52,21 @@ func NewSDK(config *Config) (*Impl, error) { } // instantiate all APIs eagerly because it's cheap to do so and we don't have to deal with thread safety this way + authTokens, err := authtoken.New(client) + if err != nil { + return nil, err + } + emailLinks, err := emaillink.New(client) if err != nil { return nil, err } + projects, err := project.New(client) + if err != nil { + return nil, err + } + sessions, err := session.New(client, config.ProjectID, config.FrontendAPI, config.ShortSessionCookieName, config.JWTIssuer) if err != nil { return nil, err @@ -76,7 +89,9 @@ func NewSDK(config *Config) (*Impl, error) { return &Impl{ client: client, + authTokens: authTokens, emailLinks: emailLinks, + projects: projects, sessions: sessions, users: users, validation: validation, @@ -99,6 +114,11 @@ func (i *Impl) Validations() validation.Validation { return i.validation } +// Projects returns projects client +func (i *Impl) Projects() project.Project { + return i.projects +} + // Sessions returns sessions client func (i *Impl) Sessions() session.Session { return i.sessions