resource

package module
v0.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 2, 2025 License: MIT Imports: 27 Imported by: 2

Documentation

Overview

package resource provides a set of types and functions for working with resources.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AddResources added in v0.0.3

func AddResources[Resource Resourcer, Request any](s *Collection, scope accesstypes.PermissionScope, rSet *ResourceSet[Resource, Request]) error

func Operations added in v0.0.3

func Operations(r *http.Request, pattern string) iter.Seq2[*Operation, error]

func PatchsetCompare added in v0.0.3

func PatchsetCompare(a, b PatchSetComparer) bool

func ProcessEvent added in v0.0.3

func ProcessEvent(processName string) string

func UserEvent added in v0.0.3

func UserEvent(ctx context.Context) string

func UserProcessEvent added in v0.0.3

func UserProcessEvent(ctx context.Context, processName string) string

Types

type Collection

type Collection struct {
	// contains filtered or unexported fields
}

func NewCollection

func NewCollection() *Collection

func (*Collection) AddResource

func (s *Collection) AddResource(scope accesstypes.PermissionScope, permission accesstypes.Permission, res accesstypes.Resource) error

func (*Collection) GenerateTypeScript

func (s *Collection) GenerateTypeScript(dst string) error

func (*Collection) IsResourceImmutable

func (s *Collection) IsResourceImmutable(scope accesstypes.PermissionScope, res accesstypes.Resource) bool

func (*Collection) List

func (*Collection) Scope

type Columns added in v0.0.3

type Columns string

type Config added in v0.0.3

type Config struct {
	DBType              DBType
	ChangeTrackingTable string
	TrackChanges        bool
}

func (Config) SetChangeTrackingTable added in v0.0.3

func (c Config) SetChangeTrackingTable(changeTrackingTable string) Config

func (Config) SetDBType added in v0.0.3

func (c Config) SetDBType(dbType DBType) Config

func (Config) SetTrackChanges added in v0.0.3

func (c Config) SetTrackChanges(trackChanges bool) Config

type Configurer added in v0.0.3

type Configurer interface {
	Config() Config
}

type DBType added in v0.0.3

type DBType string
const (
	SpannerDBType  DBType = "spanner"
	PostgresDBType DBType = "postgres"
)

type DataChangeEvent added in v0.0.3

type DataChangeEvent struct {
	TableName   accesstypes.Resource `spanner:"TableName"`
	RowID       string               `spanner:"RowId"`
	EventTime   time.Time            `spanner:"EventTime"`
	EventSource string               `spanner:"EventSource"`
	ChangeSet   string               `spanner:"ChangeSet"`
}

type Decoder added in v0.0.3

type Decoder[Resource Resourcer, Request any] struct {
	// contains filtered or unexported fields
}

Decoder is a struct that can be used for decoding http requests and validating those requests

func NewDecoder added in v0.0.3

func NewDecoder[Resource Resourcer, Request any](rSet *ResourceSet[Resource, Request]) (*Decoder[Resource, Request], error)

func (*Decoder[Resource, Request]) Decode added in v0.0.3

func (d *Decoder[Resource, Request]) Decode(request *http.Request) (*PatchSet[Resource], error)

func (*Decoder[Resource, Request]) WithPermissionChecker added in v0.0.3

func (d *Decoder[Resource, Request]) WithPermissionChecker(domainFromReq DomainFromReq, userFromReq UserFromReq, enforcer accesstypes.Enforcer) *DecoderWithPermissionChecker[Resource, Request]

func (*Decoder[Resource, Request]) WithValidator added in v0.0.3

func (d *Decoder[Resource, Request]) WithValidator(v ValidatorFunc) *Decoder[Resource, Request]

type DecoderWithPermissionChecker added in v0.0.3

type DecoderWithPermissionChecker[Resource Resourcer, Request any] struct {
	// contains filtered or unexported fields
}

func (*DecoderWithPermissionChecker[Resource, Request]) Decode added in v0.0.3

func (d *DecoderWithPermissionChecker[Resource, Request]) Decode(request *http.Request, perm accesstypes.Permission) (*PatchSet[Resource], error)

func (*DecoderWithPermissionChecker[Resource, Request]) DecodeOperation added in v0.0.3

func (d *DecoderWithPermissionChecker[Resource, Request]) DecodeOperation(oper *Operation) (*PatchSet[Resource], error)

func (*DecoderWithPermissionChecker[Resource, Request]) WithValidator added in v0.0.3

func (d *DecoderWithPermissionChecker[Resource, Request]) WithValidator(v ValidatorFunc) *DecoderWithPermissionChecker[Resource, Request]

type DiffElem added in v0.0.3

type DiffElem struct {
	Old any
	New any
}

type DomainFromCtx added in v0.0.3

type DomainFromCtx func(context.Context) accesstypes.Domain

type DomainFromReq added in v0.0.3

type DomainFromReq func(*http.Request) accesstypes.Domain

type FieldMapper

type FieldMapper struct {
	// contains filtered or unexported fields
}

func NewFieldMapper

func NewFieldMapper(v any) (*FieldMapper, error)

func (*FieldMapper) Fields

func (f *FieldMapper) Fields() []accesstypes.Field

func (*FieldMapper) Len

func (f *FieldMapper) Len() int

func (*FieldMapper) StructFieldName

func (f *FieldMapper) StructFieldName(tag string) (accesstypes.Field, bool)

type KeyPart

type KeyPart struct {
	Key   accesstypes.Field
	Value any
}

type KeySet

type KeySet struct {
	// contains filtered or unexported fields
}

KeySet is an object that represents a single or composite primary key and its value.

func (KeySet) Add

func (p KeySet) Add(key accesstypes.Field, value any) KeySet

Add adds an additional column to the primary key creating a composite primary key

  • PrimaryKey is immutable.
  • Add returns a new PrimaryKey that should be used for all subsequent operations.

func (KeySet) KeyMap

func (p KeySet) KeyMap() map[accesstypes.Field]any

func (KeySet) KeySet

func (p KeySet) KeySet() spanner.KeySet

func (KeySet) Len

func (p KeySet) Len() int

func (KeySet) Parts

func (p KeySet) Parts() []KeyPart

func (KeySet) RowID

func (p KeySet) RowID() string

func (KeySet) String

func (p KeySet) String() string

type Operation added in v0.0.3

type Operation struct {
	Type OperationType
	Req  *http.Request
}

type OperationType added in v0.0.3

type OperationType string
const (
	OperationCreate OperationType = "add"
	OperationUpdate OperationType = "patch"
	OperationDelete OperationType = "remove"
)

type PatchSet

type PatchSet[Resource Resourcer] struct {
	// contains filtered or unexported fields
}

func NewPatchSet

func NewPatchSet[Resource Resourcer](rMeta *ResourceMetadata[Resource]) *PatchSet[Resource]

func (*PatchSet[Resource]) Data

func (p *PatchSet[Resource]) Data() map[accesstypes.Field]any

func (*PatchSet[Resource]) Diff added in v0.0.3

func (p *PatchSet[Resource]) Diff(old any) (map[accesstypes.Field]DiffElem, error)

Diff returns a map of fields that have changed between old and patchSet.

func (*PatchSet[Resource]) Fields

func (p *PatchSet[Resource]) Fields() []accesstypes.Field

func (*PatchSet[Resource]) Get

func (p *PatchSet[Resource]) Get(field accesstypes.Field) any

func (*PatchSet[Resource]) HasKey

func (p *PatchSet[Resource]) HasKey() bool

func (*PatchSet[Resource]) IsSet added in v0.0.3

func (p *PatchSet[Resource]) IsSet(field accesstypes.Field) bool

func (*PatchSet[Resource]) Key

func (p *PatchSet[Resource]) Key(field accesstypes.Field) any

func (*PatchSet[Resource]) Len

func (p *PatchSet[Resource]) Len() int

func (*PatchSet[Resource]) PatchType added in v0.0.3

func (p *PatchSet[Resource]) PatchType() PatchType

func (*PatchSet[Resource]) PrimaryKey added in v0.0.3

func (p *PatchSet[Resource]) PrimaryKey() KeySet

func (*PatchSet[Resource]) Resolve added in v0.0.3

func (p *PatchSet[Resource]) Resolve() (map[string]any, error)

Resolve returns a map with the keys set to the database struct tags found on databaseType, and the values set to the values in patchSet.

func (*PatchSet[Resource]) Resource added in v0.0.3

func (p *PatchSet[Resource]) Resource() accesstypes.Resource

func (*PatchSet[Resource]) Set

func (p *PatchSet[Resource]) Set(field accesstypes.Field, value any) *PatchSet[Resource]

func (*PatchSet[Resource]) SetKey

func (p *PatchSet[Resource]) SetKey(field accesstypes.Field, value any) *PatchSet[Resource]

func (*PatchSet[Resource]) SetPatchType added in v0.0.3

func (p *PatchSet[Resource]) SetPatchType(t PatchType) *PatchSet[Resource]

func (*PatchSet[Resource]) SpannerBuffer added in v0.0.3

func (p *PatchSet[Resource]) SpannerBuffer(ctx context.Context, txn *spanner.ReadWriteTransaction, eventSource ...string) error

func (*PatchSet[Resource]) SpannerBufferDelete added in v0.0.3

func (p *PatchSet[Resource]) SpannerBufferDelete(ctx context.Context, txn *spanner.ReadWriteTransaction, eventSource ...string) error

func (*PatchSet[Resource]) SpannerBufferInsert added in v0.0.3

func (p *PatchSet[Resource]) SpannerBufferInsert(txn *spanner.ReadWriteTransaction, eventSource ...string) error

func (*PatchSet[Resource]) SpannerBufferInsertOrUpdate added in v0.0.3

func (p *PatchSet[Resource]) SpannerBufferInsertOrUpdate(ctx context.Context, txn *spanner.ReadWriteTransaction, eventSource ...string) error

func (*PatchSet[Resource]) SpannerBufferUpdate added in v0.0.3

func (p *PatchSet[Resource]) SpannerBufferUpdate(ctx context.Context, txn *spanner.ReadWriteTransaction, eventSource ...string) error

func (*PatchSet[Resource]) SpannerDelete added in v0.0.3

func (p *PatchSet[Resource]) SpannerDelete(ctx context.Context, s *spanner.Client, eventSource ...string) error

func (*PatchSet[Resource]) SpannerInsert added in v0.0.3

func (p *PatchSet[Resource]) SpannerInsert(ctx context.Context, s *spanner.Client, eventSource ...string) error

func (*PatchSet[Resource]) SpannerInsertOrUpdate added in v0.0.3

func (p *PatchSet[Resource]) SpannerInsertOrUpdate(ctx context.Context, s *spanner.Client, eventSource ...string) error

func (*PatchSet[Resource]) SpannerPatch added in v0.0.3

func (p *PatchSet[Resource]) SpannerPatch(ctx context.Context, spanner *spanner.Client, eventSource ...string) error

func (*PatchSet[Resource]) SpannerUpdate added in v0.0.3

func (p *PatchSet[Resource]) SpannerUpdate(ctx context.Context, s *spanner.Client, eventSource ...string) error

type PatchSetComparer added in v0.0.3

type PatchSetComparer interface {
	Data() map[accesstypes.Field]any
	Fields() []accesstypes.Field
	PatchType() PatchType
	PrimaryKey() KeySet
}

type PatchType added in v0.0.3

type PatchType string
const (
	CreatePatchType PatchType = "CreatePatchType"
	UpdatePatchType PatchType = "UpdatePatchType"
	DeletePatchType PatchType = "DeletePatchType"
)

type QueryDecoder added in v0.0.3

type QueryDecoder[Resource Resourcer, Request any] struct {
	// contains filtered or unexported fields
}

QueryDecoder is a struct that returns columns that a given user has access to view

func NewQueryDecoder added in v0.0.3

func NewQueryDecoder[Resource Resourcer, Request any](rSet *ResourceSet[Resource, Request], permissionChecker accesstypes.Enforcer, domainFromCtx DomainFromCtx, userFromCtx UserFromCtx) (*QueryDecoder[Resource, Request], error)

func (*QueryDecoder[Resource, Request]) Decode added in v0.0.3

func (d *QueryDecoder[Resource, Request]) Decode(request *http.Request) (*QuerySet[Resource], error)

type QuerySet

type QuerySet[Resource Resourcer] struct {
	// contains filtered or unexported fields
}

func NewQuerySet

func NewQuerySet[Resource Resourcer](rMeta *ResourceMetadata[Resource]) *QuerySet[Resource]

func (*QuerySet[Resource]) AddField

func (q *QuerySet[Resource]) AddField(field accesstypes.Field) *QuerySet[Resource]

func (*QuerySet[Resource]) Columns added in v0.0.3

func (q *QuerySet[Resource]) Columns() (Columns, error)

Columns returns the database struct tags for the fields in databaseType that the user has access to view.

func (*QuerySet[Resource]) Fields

func (q *QuerySet[Resource]) Fields() []accesstypes.Field

func (*QuerySet[Resource]) Key added in v0.0.3

func (q *QuerySet[Resource]) Key(field accesstypes.Field) any

func (*QuerySet[Resource]) KeySet added in v0.0.3

func (q *QuerySet[Resource]) KeySet() KeySet

func (*QuerySet[Resource]) Len

func (q *QuerySet[Resource]) Len() int

func (*QuerySet[Resource]) PostgresStmt added in v0.0.3

func (q *QuerySet[Resource]) PostgresStmt() (stmt Stmt, params map[string]any, err error)

func (*QuerySet[Resource]) Resource added in v0.0.3

func (q *QuerySet[Resource]) Resource() accesstypes.Resource

func (*QuerySet[Resource]) SetKey added in v0.0.3

func (q *QuerySet[Resource]) SetKey(field accesstypes.Field, value any)

func (*QuerySet[Resource]) SpannerList added in v0.0.3

func (q *QuerySet[Resource]) SpannerList(ctx context.Context, txn *spanner.ReadOnlyTransaction, dst any) error

func (*QuerySet[Resource]) SpannerRead added in v0.0.3

func (q *QuerySet[Resource]) SpannerRead(ctx context.Context, txn *spanner.ReadOnlyTransaction, dst any) error

func (*QuerySet[Resource]) SpannerStmt added in v0.0.3

func (q *QuerySet[Resource]) SpannerStmt() (spanner.Statement, error)

func (*QuerySet[Resource]) Where added in v0.0.3

func (q *QuerySet[Resource]) Where() (where Where, params map[string]any, err error)

Where translates the the fields to database struct tags in databaseType when building the where clause

type Queryer added in v0.0.3

type Queryer[T Resourcer] interface {
	Query() *QuerySet[T]
}

type ResourceMetadata added in v0.0.3

type ResourceMetadata[Resource Resourcer] struct {
	// contains filtered or unexported fields
}

func NewResourceMetadata added in v0.0.3

func NewResourceMetadata[Resource Resourcer]() *ResourceMetadata[Resource]

type ResourceSet

type ResourceSet[Resource Resourcer, Request any] struct {
	// contains filtered or unexported fields
}

func NewResourceSet

func NewResourceSet[Resource Resourcer, Request any](permissions ...accesstypes.Permission) (*ResourceSet[Resource, Request], error)

func (*ResourceSet[Resource, Request]) BaseResource

func (r *ResourceSet[Resource, Request]) BaseResource() accesstypes.Resource

func (*ResourceSet[Resource, Request]) ImmutableFields

func (r *ResourceSet[Resource, Request]) ImmutableFields() map[accesstypes.Tag]struct{}

func (*ResourceSet[Resource, Request]) Permission

func (r *ResourceSet[Resource, Request]) Permission() accesstypes.Permission

func (*ResourceSet[Resource, Request]) PermissionRequired

func (r *ResourceSet[Resource, Request]) PermissionRequired(fieldName accesstypes.Field, perm accesstypes.Permission) bool

func (*ResourceSet[Resource, Request]) Permissions

func (r *ResourceSet[Resource, Request]) Permissions() []accesstypes.Permission

func (*ResourceSet[Resource, Request]) Resource

func (r *ResourceSet[Resource, Request]) Resource(fieldName accesstypes.Field) accesstypes.Resource

func (*ResourceSet[Resource, Request]) ResourceMetadata added in v0.0.3

func (r *ResourceSet[Resource, Request]) ResourceMetadata() *ResourceMetadata[Resource]

func (*ResourceSet[Resource, Request]) TagPermissions

func (r *ResourceSet[Resource, Request]) TagPermissions() accesstypes.TagPermissions

type Resourcer

type Resourcer interface {
	Resource() accesstypes.Resource
	DefaultConfig() Config
}

type SpannerBufferer added in v0.0.3

type SpannerBufferer interface {
	SpannerBuffer(ctx context.Context, txn *spanner.ReadWriteTransaction, eventSource ...string) error
	Resource() accesstypes.Resource
	PrimaryKey() KeySet
}

type SpannerLister added in v0.0.3

type SpannerLister interface {
	SpannerList(ctx context.Context, txn *spanner.ReadOnlyTransaction, dst any) error
}

type SpannerReader added in v0.0.3

type SpannerReader interface {
	SpannerRead(ctx context.Context, txn *spanner.ReadOnlyTransaction, dst any) error
	Resource() accesstypes.Resource
	KeySet() KeySet
}

type Stmt added in v0.0.3

type Stmt string

type StructDecoder added in v0.0.3

type StructDecoder[Request any] struct {
	// contains filtered or unexported fields
}

StructDecoder is a struct that can be used for decoding http requests and validating those requests

func NewStructDecoder added in v0.0.3

func NewStructDecoder[Request any]() (*StructDecoder[Request], error)

func (*StructDecoder[Request]) Decode added in v0.0.3

func (d *StructDecoder[Request]) Decode(request *http.Request) (*Request, error)

Decode parses the http request body and validates it against the struct validation rules and returns a named patchset

func (*StructDecoder[Request]) WithPermissionChecker added in v0.0.3

func (d *StructDecoder[Request]) WithPermissionChecker(domainFromReq DomainFromReq, userFromReq UserFromReq, enforcer accesstypes.Enforcer) *StructDecoderWithPermissionChecker[Request]

func (*StructDecoder[Request]) WithValidator added in v0.0.3

func (d *StructDecoder[Request]) WithValidator(v ValidatorFunc) *StructDecoder[Request]

type StructDecoderWithPermissionChecker added in v0.0.3

type StructDecoderWithPermissionChecker[Request any] struct {
	// contains filtered or unexported fields
}

func (*StructDecoderWithPermissionChecker[Request]) Decode added in v0.0.3

func (d *StructDecoderWithPermissionChecker[Request]) Decode(request *http.Request, perm accesstypes.Permission) (*Request, error)

Decode parses the http request body and validates it against the struct validation rules

func (*StructDecoderWithPermissionChecker[Request]) WithValidator added in v0.0.3

type TSGenerator

type TSGenerator struct {
	Permissions         []accesstypes.Permission
	Resources           []accesstypes.Resource
	ResourceTags        map[accesstypes.Resource][]accesstypes.Tag
	ResourcePermissions permissionMap
	Domains             []accesstypes.PermissionScope
}

type UserFromCtx added in v0.0.3

type UserFromCtx func(context.Context) accesstypes.User

type UserFromReq added in v0.0.3

type UserFromReq func(*http.Request) accesstypes.User

type ValidatorFunc added in v0.0.3

type ValidatorFunc interface {
	Struct(s interface{}) error
	StructPartial(s interface{}, fields ...string) error
}

ValidatorFunc is a function that validates s It returns an error if the validation fails

type Where added in v0.0.3

type Where string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL