models

package
v0.16.0 Latest Latest
Warning

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

Go to latest
Published: Apr 28, 2023 License: MIT Imports: 17 Imported by: 0

Documentation

Overview

Package models implements all PocketBase DB models and DTOs.

Index

Constants

View Source
const (
	// DefaultIdLength is the default length of the generated model id.
	DefaultIdLength = 15

	// DefaultIdAlphabet is the default characters set used for generating the model id.
	DefaultIdAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
)
View Source
const (
	CollectionTypeBase = "base"
	CollectionTypeAuth = "auth"
	CollectionTypeView = "view"
)
View Source
const (
	RequestAuthGuest  = "guest"
	RequestAuthAdmin  = "admin"
	RequestAuthRecord = "auth_record"
)

list with the supported values for `Request.Auth`

View Source
const (
	ParamAppSettings = "settings"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Admin

type Admin struct {
	BaseModel

	Avatar          int            `db:"avatar" json:"avatar"`
	Email           string         `db:"email" json:"email"`
	TokenKey        string         `db:"tokenKey" json:"-"`
	PasswordHash    string         `db:"passwordHash" json:"-"`
	LastResetSentAt types.DateTime `db:"lastResetSentAt" json:"-"`
}

func (*Admin) RefreshTokenKey

func (m *Admin) RefreshTokenKey() error

RefreshTokenKey generates and sets new random token key.

func (*Admin) SetPassword

func (m *Admin) SetPassword(password string) error

SetPassword sets cryptographically secure string to `model.Password`.

Additionally this method also resets the LastResetSentAt and the TokenKey fields.

func (*Admin) TableName

func (m *Admin) TableName() string

TableName returns the Admin model SQL table name.

func (*Admin) ValidatePassword

func (m *Admin) ValidatePassword(password string) bool

ValidatePassword validates a plain password against the model's password.

type BaseModel

type BaseModel struct {
	Id      string         `db:"id" json:"id"`
	Created types.DateTime `db:"created" json:"created"`
	Updated types.DateTime `db:"updated" json:"updated"`
	// contains filtered or unexported fields
}

BaseModel defines common fields and methods used by all other models.

func (*BaseModel) GetCreated

func (m *BaseModel) GetCreated() types.DateTime

GetCreated returns the model Created datetime.

func (*BaseModel) GetId

func (m *BaseModel) GetId() string

GetId returns the model id.

func (*BaseModel) GetUpdated

func (m *BaseModel) GetUpdated() types.DateTime

GetUpdated returns the model Updated datetime.

func (*BaseModel) HasId

func (m *BaseModel) HasId() bool

HasId returns whether the model has a nonzero id.

func (*BaseModel) IsNew

func (m *BaseModel) IsNew() bool

IsNew indicates what type of db query (insert or update) should be used with the model instance.

func (*BaseModel) MarkAsNew

func (m *BaseModel) MarkAsNew()

MarkAsNew marks the model as "new" (aka. enforces m.IsNew() to be true).

func (*BaseModel) MarkAsNotNew

func (m *BaseModel) MarkAsNotNew()

MarkAsNotNew marks the model as "not new" (aka. enforces m.IsNew() to be false)

func (*BaseModel) PostScan

func (m *BaseModel) PostScan() error

PostScan implements the dbx.PostScanner interface.

It is executed right after the model was populated with the db row values.

func (*BaseModel) RefreshCreated

func (m *BaseModel) RefreshCreated()

RefreshCreated updates the model Created field with the current datetime.

func (*BaseModel) RefreshId

func (m *BaseModel) RefreshId()

RefreshId generates and sets a new model id.

The generated id is a cryptographically random 15 characters length string.

func (*BaseModel) RefreshUpdated

func (m *BaseModel) RefreshUpdated()

RefreshUpdated updates the model Updated field with the current datetime.

func (*BaseModel) SetId

func (m *BaseModel) SetId(id string)

SetId sets the model id to the provided string value.

type Collection

type Collection struct {
	BaseModel

	Name    string                  `db:"name" json:"name"`
	Type    string                  `db:"type" json:"type"`
	System  bool                    `db:"system" json:"system"`
	Schema  schema.Schema           `db:"schema" json:"schema"`
	Indexes types.JsonArray[string] `db:"indexes" json:"indexes"`

	// rules
	ListRule   *string `db:"listRule" json:"listRule"`
	ViewRule   *string `db:"viewRule" json:"viewRule"`
	CreateRule *string `db:"createRule" json:"createRule"`
	UpdateRule *string `db:"updateRule" json:"updateRule"`
	DeleteRule *string `db:"deleteRule" json:"deleteRule"`

	Options types.JsonMap `db:"options" json:"options"`
}

func (*Collection) AuthOptions

func (m *Collection) AuthOptions() CollectionAuthOptions

AuthOptions decodes the current collection options and returns them as new CollectionAuthOptions instance.

func (*Collection) BaseFilesPath

func (m *Collection) BaseFilesPath() string

BaseFilesPath returns the storage dir path used by the collection.

func (*Collection) BaseOptions

func (m *Collection) BaseOptions() CollectionBaseOptions

BaseOptions decodes the current collection options and returns them as new CollectionBaseOptions instance.

func (*Collection) DecodeOptions

func (m *Collection) DecodeOptions(result any) error

DecodeOptions decodes the current collection options into the provided "result" (must be a pointer).

func (*Collection) IsAuth

func (m *Collection) IsAuth() bool

IsAuth checks if the current collection has "auth" type.

func (*Collection) IsBase

func (m *Collection) IsBase() bool

IsBase checks if the current collection has "base" type.

func (*Collection) IsView

func (m *Collection) IsView() bool

IsView checks if the current collection has "view" type.

func (Collection) MarshalJSON

func (m Collection) MarshalJSON() ([]byte, error)

MarshalJSON implements the json.Marshaler interface.

func (*Collection) NormalizeOptions

func (m *Collection) NormalizeOptions() error

NormalizeOptions updates the current collection options with a new normalized state based on the collection type.

func (*Collection) SetOptions

func (m *Collection) SetOptions(typedOptions any) error

SetOptions normalizes and unmarshals the specified options into m.Options.

func (*Collection) TableName

func (m *Collection) TableName() string

TableName returns the Collection model SQL table name.

func (*Collection) ViewOptions

func (m *Collection) ViewOptions() CollectionViewOptions

ViewOptions decodes the current collection options and returns them as new CollectionViewOptions instance.

type CollectionAuthOptions

type CollectionAuthOptions struct {
	ManageRule         *string  `form:"manageRule" json:"manageRule"`
	AllowOAuth2Auth    bool     `form:"allowOAuth2Auth" json:"allowOAuth2Auth"`
	AllowUsernameAuth  bool     `form:"allowUsernameAuth" json:"allowUsernameAuth"`
	AllowEmailAuth     bool     `form:"allowEmailAuth" json:"allowEmailAuth"`
	RequireEmail       bool     `form:"requireEmail" json:"requireEmail"`
	ExceptEmailDomains []string `form:"exceptEmailDomains" json:"exceptEmailDomains"`
	OnlyEmailDomains   []string `form:"onlyEmailDomains" json:"onlyEmailDomains"`
	MinPasswordLength  int      `form:"minPasswordLength" json:"minPasswordLength"`
}

CollectionAuthOptions defines the "auth" Collection.Options fields.

func (CollectionAuthOptions) Validate

func (o CollectionAuthOptions) Validate() error

Validate implements validation.Validatable interface.

type CollectionBaseOptions

type CollectionBaseOptions struct {
}

CollectionBaseOptions defines the "base" Collection.Options fields.

func (CollectionBaseOptions) Validate

func (o CollectionBaseOptions) Validate() error

Validate implements validation.Validatable interface.

type CollectionViewOptions

type CollectionViewOptions struct {
	Query string `form:"query" json:"query"`
}

CollectionViewOptions defines the "view" Collection.Options fields.

func (CollectionViewOptions) Validate

func (o CollectionViewOptions) Validate() error

Validate implements validation.Validatable interface.

type ColumnValueMapper

type ColumnValueMapper interface {
	// ColumnValueMap returns the data to be used when persisting the model.
	ColumnValueMap() map[string]any
}

ColumnValueMapper defines an interface for custom db model data serialization.

type ExternalAuth

type ExternalAuth struct {
	BaseModel

	CollectionId string `db:"collectionId" json:"collectionId"`
	RecordId     string `db:"recordId" json:"recordId"`
	Provider     string `db:"provider" json:"provider"`
	ProviderId   string `db:"providerId" json:"providerId"`
}

func (*ExternalAuth) TableName

func (m *ExternalAuth) TableName() string

type FilesManager

type FilesManager interface {
	// BaseFilesPath returns the storage dir path used by the interface instance.
	BaseFilesPath() string
}

FilesManager defines an interface with common methods that files manager models should implement.

type Model

type Model interface {
	TableName() string
	IsNew() bool
	MarkAsNew()
	MarkAsNotNew()
	HasId() bool
	GetId() string
	SetId(id string)
	GetCreated() types.DateTime
	GetUpdated() types.DateTime
	RefreshId()
	RefreshCreated()
	RefreshUpdated()
}

Model defines an interface with common methods that all db models should have.

type Param

type Param struct {
	BaseModel

	Key   string        `db:"key" json:"key"`
	Value types.JsonRaw `db:"value" json:"value"`
}

func (*Param) TableName

func (m *Param) TableName() string

type Record

type Record struct {
	BaseModel
	// contains filtered or unexported fields
}

func NewRecord

func NewRecord(collection *Collection) *Record

NewRecord initializes a new empty Record model.

func NewRecordFromNullStringMap

func NewRecordFromNullStringMap(collection *Collection, data dbx.NullStringMap) *Record

NewRecordFromNullStringMap initializes a single new Record model with data loaded from the provided NullStringMap.

Note that this method is intended to load and Scan data from a database result and calls PostScan() which marks the record as "not new".

func NewRecordsFromNullStringMaps

func NewRecordsFromNullStringMaps(collection *Collection, rows []dbx.NullStringMap) []*Record

NewRecordsFromNullStringMaps initializes a new Record model for each row in the provided NullStringMap slice.

Note that this method is intended to load and Scan data from a database result and calls PostScan() for each record marking them as "not new".

func (*Record) BaseFilesPath

func (m *Record) BaseFilesPath() string

BaseFilesPath returns the storage dir path used by the record.

func (*Record) CleanCopy

func (m *Record) CleanCopy() *Record

CleanCopy returns a copy of the current record model populated only with its LATEST data state and everything else reset to the defaults.

func (*Record) Collection

func (m *Record) Collection() *Collection

Collection returns the Collection model associated to the current Record model.

func (*Record) ColumnValueMap

func (m *Record) ColumnValueMap() map[string]any

ColumnValueMap implements ColumnValueMapper interface.

func (*Record) Email

func (m *Record) Email() string

Email returns the "email" auth record data value.

func (*Record) EmailVisibility

func (m *Record) EmailVisibility() bool

Verified returns the "emailVisibility" auth record data value.

func (*Record) Expand

func (m *Record) Expand() map[string]any

Expand returns a shallow copy of the current Record model expand data.

func (*Record) FindFileFieldByFile

func (m *Record) FindFileFieldByFile(filename string) *schema.SchemaField

FindFileFieldByFile returns the first file type field for which any of the record's data contains the provided filename.

func (*Record) Get

func (m *Record) Get(key string) any

Get returns a single record model data value for "key".

func (*Record) GetBool

func (m *Record) GetBool(key string) bool

GetBool returns the data value for "key" as a bool.

func (*Record) GetDateTime

func (m *Record) GetDateTime(key string) types.DateTime

GetDateTime returns the data value for "key" as a DateTime instance.

func (*Record) GetFloat

func (m *Record) GetFloat(key string) float64

GetFloat returns the data value for "key" as a float64.

func (*Record) GetInt

func (m *Record) GetInt(key string) int

GetInt returns the data value for "key" as an int.

func (*Record) GetString

func (m *Record) GetString(key string) string

GetString returns the data value for "key" as a string.

func (*Record) GetStringSlice

func (m *Record) GetStringSlice(key string) []string

GetStringSlice returns the data value for "key" as a slice of unique strings.

func (*Record) GetTime

func (m *Record) GetTime(key string) time.Time

GetTime returns the data value for "key" as a time.Time instance.

func (*Record) IgnoreEmailVisibility

func (m *Record) IgnoreEmailVisibility(state bool)

IgnoreEmailVisibility toggles the flag to ignore the auth record email visibility check.

func (*Record) LastResetSentAt

func (m *Record) LastResetSentAt() types.DateTime

LastResetSentAt returns the "lastResentSentAt" auth record data value.

func (*Record) LastVerificationSentAt

func (m *Record) LastVerificationSentAt() types.DateTime

LastVerificationSentAt returns the "lastVerificationSentAt" auth record data value.

func (*Record) Load

func (m *Record) Load(data map[string]any)

Load bulk loads the provided data into the current Record model.

func (Record) MarshalJSON

func (m Record) MarshalJSON() ([]byte, error)

MarshalJSON implements the json.Marshaler interface.

Only the data exported by `PublicExport()` will be serialized.

func (*Record) MergeExpand

func (m *Record) MergeExpand(expand map[string]any)

MergeExpand merges recursively the provided expand data into the current model's expand (if any).

Note that if an expanded prop with the same key is a slice (old or new expand) then both old and new records will be merged into a new slice (aka. a :merge: [b,c] => [a,b,c]). Otherwise the "old" expanded record will be replace with the "new" one (aka. a :merge: aNew => aNew).

func (*Record) OriginalCopy

func (m *Record) OriginalCopy() *Record

OriginalCopy returns a copy of the current record model populated with its ORIGINAL data state (aka. the initially loaded) and everything else reset to the defaults.

func (*Record) PasswordHash

func (m *Record) PasswordHash() string

PasswordHash returns the "passwordHash" auth record data value.

func (*Record) PublicExport

func (m *Record) PublicExport() map[string]any

PublicExport exports only the record fields that are safe to be public.

Fields marked as hidden will be exported only if `m.IgnoreEmailVisibility(true)` is set.

func (*Record) RefreshTokenKey

func (m *Record) RefreshTokenKey() error

RefreshTokenKey generates and sets new random auth record "tokenKey".

Returns an error if the record is not from an auth collection.

func (*Record) ReplaceModifers

func (m *Record) ReplaceModifers(data map[string]any) map[string]any

ReplaceModifers returns a new map with applied modifier values based on the current record and the specified data.

The resolved modifier keys will be removed.

Multiple modifiers will be applied one after another, while reusing the previous base key value result (eg. 1; -5; +2 => -2).

Example usage:

 newData := record.ReplaceModifers(data)
	// record:  {"field": 10}
	// data:    {"field+": 5}
	// newData: {"field": 15}

func (*Record) SchemaData

func (m *Record) SchemaData() map[string]any

SchemaData returns a shallow copy ONLY of the defined record schema fields data.

func (*Record) Set

func (m *Record) Set(key string, value any)

Set sets the provided key-value data pair for the current Record model.

If the record collection has field with name matching the provided "key", the value will be further normalized according to the field rules.

func (*Record) SetEmail

func (m *Record) SetEmail(email string) error

SetEmail sets the "email" auth record data value.

This method doesn't check whether the provided value is a valid email.

Returns an error if the record is not from an auth collection.

func (*Record) SetEmailVisibility

func (m *Record) SetEmailVisibility(visible bool) error

SetEmailVisibility sets the "emailVisibility" auth record data value.

Returns an error if the record is not from an auth collection.

func (*Record) SetExpand

func (m *Record) SetExpand(expand map[string]any)

SetExpand shallow copies the provided data to the current Record model's expand.

func (*Record) SetLastResetSentAt

func (m *Record) SetLastResetSentAt(dateTime types.DateTime) error

SetLastResetSentAt sets the "lastResentSentAt" auth record data value.

Returns an error if the record is not from an auth collection.

func (*Record) SetLastVerificationSentAt

func (m *Record) SetLastVerificationSentAt(dateTime types.DateTime) error

SetLastVerificationSentAt sets an "lastVerificationSentAt" auth record data value.

Returns an error if the record is not from an auth collection.

func (*Record) SetPassword

func (m *Record) SetPassword(password string) error

SetPassword sets cryptographically secure string to the auth record "password" field. This method also resets the "lastResetSentAt" and the "tokenKey" fields.

Returns an error if the record is not from an auth collection or an empty password is provided.

func (*Record) SetTokenKey

func (m *Record) SetTokenKey(key string) error

SetTokenKey sets the "tokenKey" auth record data value.

Returns an error if the record is not from an auth collection.

func (*Record) SetUsername

func (m *Record) SetUsername(username string) error

SetUsername sets the "username" auth record data value.

This method doesn't check whether the provided value is a valid username.

Returns an error if the record is not from an auth collection.

func (*Record) SetVerified

func (m *Record) SetVerified(verified bool) error

SetVerified sets the "verified" auth record data value.

Returns an error if the record is not from an auth collection.

func (*Record) TableName

func (m *Record) TableName() string

TableName returns the table name associated to the current Record model.

func (*Record) TokenKey

func (m *Record) TokenKey() string

TokenKey returns the "tokenKey" auth record data value.

func (*Record) UnknownData

func (m *Record) UnknownData() map[string]any

UnknownData returns a shallow copy ONLY of the unknown record fields data, aka. fields that are neither one of the base and special system ones, nor defined by the collection schema.

func (*Record) UnmarshalJSON

func (m *Record) UnmarshalJSON(data []byte) error

UnmarshalJSON implements the json.Unmarshaler interface.

func (*Record) UnmarshalJSONField

func (m *Record) UnmarshalJSONField(key string, result any) error

Retrieves the "key" json field value and unmarshals it into "result".

Example

result := struct {
    FirstName string `json:"first_name"`
}{}
err := m.UnmarshalJSONField("my_field_name", &result)

func (*Record) Username

func (m *Record) Username() string

Username returns the "username" auth record data value.

func (*Record) ValidatePassword

func (m *Record) ValidatePassword(password string) bool

ValidatePassword validates a plain password against the auth record password.

Returns false if the password is incorrect or record is not from an auth collection.

func (*Record) Verified

func (m *Record) Verified() bool

Verified returns the "verified" auth record data value.

func (*Record) WithUnknownData

func (m *Record) WithUnknownData(state bool)

WithUnknownData toggles the export/serialization of unknown data fields (false by default).

type Request

type Request struct {
	BaseModel

	Url       string        `db:"url" json:"url"`
	Method    string        `db:"method" json:"method"`
	Status    int           `db:"status" json:"status"`
	Auth      string        `db:"auth" json:"auth"`
	UserIp    string        `db:"userIp" json:"userIp"`
	RemoteIp  string        `db:"remoteIp" json:"remoteIp"`
	Referer   string        `db:"referer" json:"referer"`
	UserAgent string        `db:"userAgent" json:"userAgent"`
	Meta      types.JsonMap `db:"meta" json:"meta"`
}

func (*Request) TableName

func (m *Request) TableName() string

type RequestData

type RequestData struct {
	Method     string         `json:"method"`
	Query      map[string]any `json:"query"`
	Data       map[string]any `json:"data"`
	Headers    map[string]any `json:"headers"`
	AuthRecord *Record        `json:"authRecord"`
	Admin      *Admin         `json:"admin"`
}

RequestData defines a HTTP request data struct, usually used as part of the `@request.*` filter resolver.

func (*RequestData) HasModifierDataKeys

func (r *RequestData) HasModifierDataKeys() bool

HasModifierDataKeys loosely checks if the current struct has any modifier Data keys.

type TableInfoRow

type TableInfoRow struct {
	// the `db:"pk"` tag has special semantic so we cannot rename
	// the original field without specifying a custom mapper
	PK int

	Index        int           `db:"cid"`
	Name         string        `db:"name"`
	Type         string        `db:"type"`
	NotNull      bool          `db:"notnull"`
	DefaultValue types.JsonRaw `db:"dflt_value"`
}

Directories

Path Synopsis
Package schema implements custom Schema and SchemaField datatypes for handling the Collection schema definitions.
Package schema implements custom Schema and SchemaField datatypes for handling the Collection schema definitions.

Jump to

Keyboard shortcuts

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