Skip to content

Commit

Permalink
add facts api to go sdk
Browse files Browse the repository at this point in the history
  • Loading branch information
RazcoDev committed Jun 27, 2024
1 parent edb6071 commit ef46f7d
Show file tree
Hide file tree
Showing 12 changed files with 222 additions and 53 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/permitio/permit-golang

go 1.17
go 1.18

require (
github.com/google/uuid v1.4.0
Expand Down
78 changes: 70 additions & 8 deletions pkg/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ package api

import (
"context"
"fmt"
"github.com/permitio/permit-golang/pkg/config"
"github.com/permitio/permit-golang/pkg/errors"
"github.com/permitio/permit-golang/pkg/openapi"
"go.uber.org/zap"
"time"
)

type permitBaseApi struct {
Expand All @@ -14,10 +16,37 @@ type permitBaseApi struct {
logger *zap.Logger
}

type PermitBaseFactsApi struct {
permitBaseApi
}

type IPermitBaseFactsApi interface {
lazyLoadPermitContext(ctx context.Context, methodApiLevelArg ...config.APIKeyLevel) error
WaitForSync(timeout *time.Duration) *PermitBaseFactsApi
}

type IPermitBaseApi interface {
lazyLoadPermitContext(ctx context.Context, methodApiLevelArg ...config.APIKeyLevel) error
}

func (a *PermitBaseFactsApi) WaitForSync(timeout *time.Duration) *PermitBaseFactsApi {
if a.config.GetProxyFactsViaPDP() {
stringTimeout := ""
if timeout == nil {
if timeoutFromConfig := a.config.GetFactsSyncTimeout(); timeoutFromConfig != nil {
stringTimeout = fmt.Sprintf("%d", int64(timeoutFromConfig.Seconds()))
}
}

clientConfig := a.client.GetConfig()
clientConfig.DefaultHeader["X-Wait-Timeout"] = stringTimeout
return NewPermitBaseFactsApi(openapi.NewAPIClient(clientConfig), a.config)
} else {
a.logger.Warn("Attempted to wait for sync, but 'proxyFactsViaPdp' is not enabled. Ignoring")
return a
}
}

func (a *permitBaseApi) lazyLoadPermitContext(ctx context.Context, methodApiLevelArg ...config.APIKeyLevel) error {
var methodApiLevel config.APIKeyLevel
permitContext := a.config.Context.GetContext()
Expand Down Expand Up @@ -84,14 +113,37 @@ func (p *PermitApiClient) SetContext(ctx context.Context, project string, enviro
}
p.config.Context = permitContext
}

func NewPermitApiClient(ctx context.Context, config *config.PermitConfig) *PermitApiClient {
func NewClientConfig(config *config.PermitConfig) *openapi.Configuration {
clientConfig := openapi.NewConfiguration()
clientConfig.Host = getHostFromUrl(config.GetApiUrl())
clientConfig.Scheme = getSchemaFromUrl(config.GetApiUrl())
clientConfig.AddDefaultHeader("Authorization", "Bearer "+config.GetToken())
clientConfig.HTTPClient = config.GetHTTPClient()
client := openapi.NewAPIClient(clientConfig)
return clientConfig
}
func NewFactsClientConfig(config *config.PermitConfig) *openapi.Configuration {
clientConfig := openapi.NewConfiguration()
stringTimeout := ""

//if timeout == nil {
if timeoutFromConfig := config.GetFactsSyncTimeout(); timeoutFromConfig != nil {
stringTimeout = fmt.Sprintf("%d", int64(timeoutFromConfig.Seconds()))
}
//}
clientConfig.DefaultHeader["X-Wait-Timeout"] = stringTimeout

clientConfig.AddDefaultHeader("Authorization", "Bearer "+config.GetToken())
clientConfig.Host = getHostFromUrl(config.GetPdpUrl())
clientConfig.Scheme = getSchemaFromUrl(config.GetPdpUrl())
clientConfig.HTTPClient = config.GetHTTPClient()
return clientConfig
}

func NewPermitApiClient(config *config.PermitConfig) *PermitApiClient {
baseClientConfig := NewClientConfig(config)
factsClientConfig := NewFactsClientConfig(config)
client := openapi.NewAPIClient(baseClientConfig)
factsClient := openapi.NewAPIClient(factsClientConfig)
return &PermitApiClient{
config: config,
logger: config.Logger,
Expand All @@ -102,17 +154,27 @@ func NewPermitApiClient(ctx context.Context, config *config.PermitConfig) *Permi
ImplicitGrants: NewImplicitGrantsApi(client, config),
Projects: NewProjectsApi(client, config),
ProxyConfigs: NewProxyConfigsApi(client, config),
RelationshipTuples: NewRelationshipTuplesApi(client, config),
RelationshipTuples: NewRelationshipTuplesApi(factsClient, config),
ResourceActionGroups: NewResourceActionGroupsApi(client, config),
ResourceActions: NewResourceActionsApi(client, config),
ResourceAttributes: NewResourceAttributesApi(client, config),
ResourceInstances: NewResourceInstancesApi(client, config),
ResourceInstances: NewResourceInstancesApi(factsClient, config),
ResourceRelations: NewResourceRelationsApi(client, config),
ResourceRoles: NewResourceRolesApi(client, config),
Resources: NewResourcesApi(client, config),
RoleAssignments: NewRoleAssignmentsApi(client, config),
RoleAssignments: NewRoleAssignmentsApi(factsClient, config),
Roles: NewRolesApi(client, config),
Tenants: NewTenantsApi(client, config),
Users: NewUsersApi(client, config),
Tenants: NewTenantsApi(factsClient, config),
Users: NewUsersApi(factsClient, config),
}
}

func NewPermitBaseFactsApi(client *openapi.APIClient, config *config.PermitConfig) *PermitBaseFactsApi {
return &PermitBaseFactsApi{
permitBaseApi: permitBaseApi{
client: client,
config: config,
logger: config.Logger,
},
}
}
17 changes: 12 additions & 5 deletions pkg/api/relationshipTuples.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,28 @@ import (
"github.com/permitio/permit-golang/pkg/models"
"github.com/permitio/permit-golang/pkg/openapi"
"go.uber.org/zap"
"time"
)

type RelationshipTuples struct {
permitBaseApi
PermitBaseFactsApi
}

func NewRelationshipTuplesApi(client *openapi.APIClient, config *config.PermitConfig) *RelationshipTuples {
return &RelationshipTuples{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
PermitBaseFactsApi{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
},
},
}
}
func (u *RelationshipTuples) WaitForSync(timeout *time.Duration) *RelationshipTuples {
u.PermitBaseFactsApi.WaitForSync(timeout)
return u
}

func (r *RelationshipTuples) Create(
ctx context.Context,
Expand Down
18 changes: 13 additions & 5 deletions pkg/api/resourceInstances.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,30 @@ import (
"github.com/permitio/permit-golang/pkg/models"
"github.com/permitio/permit-golang/pkg/openapi"
"go.uber.org/zap"
"time"
)

type ResourceInstances struct {
permitBaseApi
PermitBaseFactsApi
}

func NewResourceInstancesApi(client *openapi.APIClient, config *config.PermitConfig) *ResourceInstances {
return &ResourceInstances{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
PermitBaseFactsApi{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
},
},
}
}

func (r *ResourceInstances) WaitForSync(timeout *time.Duration) *ResourceInstances {
r.PermitBaseFactsApi.WaitForSync(timeout)
return r
}

func (r *ResourceInstances) Create(
ctx context.Context,
resourceInstanceCreate models.ResourceInstanceCreate,
Expand Down
18 changes: 13 additions & 5 deletions pkg/api/roleAssignments.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,30 @@ import (
"github.com/permitio/permit-golang/pkg/models"
"github.com/permitio/permit-golang/pkg/openapi"
"go.uber.org/zap"
"time"
)

type RoleAssignments struct {
permitBaseApi
PermitBaseFactsApi
}

func NewRoleAssignmentsApi(client *openapi.APIClient, config *config.PermitConfig) *RoleAssignments {
return &RoleAssignments{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
PermitBaseFactsApi{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
},
},
}
}

func (r *RoleAssignments) WaitForSync(timeout *time.Duration) *RoleAssignments {
r.PermitBaseFactsApi.WaitForSync(timeout)
return r
}

func (r *RoleAssignments) List(ctx context.Context, page int, perPage int, userFilter, roleFilter, tenantFilter string) (*[]models.RoleAssignmentRead, error) {
response, err := r.list(ctx, page, perPage, userFilter, roleFilter, tenantFilter, false)
if err != nil {
Expand Down
18 changes: 13 additions & 5 deletions pkg/api/tenants.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,30 @@ import (
"github.com/permitio/permit-golang/pkg/models"
"github.com/permitio/permit-golang/pkg/openapi"
"go.uber.org/zap"
"time"
)

type Tenants struct {
permitBaseApi
PermitBaseFactsApi
}

func NewTenantsApi(client *openapi.APIClient, config *config.PermitConfig) *Tenants {
return &Tenants{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
PermitBaseFactsApi{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
},
},
}
}

func (t *Tenants) WaitForSync(timeout *time.Duration) *Tenants {
t.PermitBaseFactsApi.WaitForSync(timeout)
return t
}

// List all tenants under the context's environment.
// Usage Example:
// `tenants, err := PermitClient.Api.Tenants.List(ctx, 1, 10)`
Expand Down
18 changes: 13 additions & 5 deletions pkg/api/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,30 @@ import (
"github.com/permitio/permit-golang/pkg/openapi"
"go.uber.org/zap"
"strings"
"time"
)

type Users struct {
permitBaseApi
PermitBaseFactsApi
}

func NewUsersApi(client *openapi.APIClient, config *config.PermitConfig) *Users {
return &Users{
permitBaseApi{
client: client,
config: config,
logger: config.Logger,
PermitBaseFactsApi{
permitBaseApi: permitBaseApi{
client: client,
config: config,
logger: config.Logger,
},
},
}
}

func (u *Users) WaitForSync(timeout *time.Duration) *Users {
u.PermitBaseFactsApi.WaitForSync(timeout)
return u
}

// List the users from your context's environment.
// Usage Example:
//
Expand Down
26 changes: 19 additions & 7 deletions pkg/config/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,31 @@ type PermitBuilder struct {
}

func NewConfigBuilder(token string) *PermitBuilder {
factsSyncTimeout := DefaultFactsSyncTimeout
return &PermitBuilder{
PermitConfig: PermitConfig{
apiUrl: DefaultApiUrl,
token: token,
pdpUrl: DefaultPdpUrl,
debug: DefaultDebugMode,
Context: nil,
Logger: nil,
httpClient: &http.Client{Timeout: DefaultTimeout},
apiUrl: DefaultApiUrl,
token: token,
pdpUrl: DefaultPdpUrl,
debug: DefaultDebugMode,
Context: nil,
Logger: nil,
proxyFactsViaPDP: false,
factsSyncTimeout: &factsSyncTimeout,
httpClient: &http.Client{Timeout: DefaultTimeout},
},
}
}

func (c *PermitConfig) WithProxyFactsViaPDP(proxyFactsViaPDP bool) *PermitConfig {
c.proxyFactsViaPDP = proxyFactsViaPDP
return c
}

func (c *PermitConfig) WithFactsSyncTimeout(timeout time.Duration) *PermitConfig {
c.factsSyncTimeout = &timeout
return c
}
func (c *PermitConfig) WithHTTPClient(client *http.Client) *PermitConfig {
c.httpClient = client
return c
Expand Down
Loading

0 comments on commit ef46f7d

Please sign in to comment.