Select Git revision
collection.go
collection.go 6.48 KiB
package collections
import (
"time"
"git.perx.ru/perxis/perxis-go/pkg/permission"
"git.perx.ru/perxis/perxis-go/pkg/schema"
)
// Config
type Config struct {
SourceSpaceID string
SourceEnvID string
SourceCollectionID string
SourceSchema *schema.Schema
}
// Access - описывает текущие ограничения на доступ к элементам коллекции для текущего
// пользователя
type Access struct {
Actions []permission.Action // Список разрешенных действия с элементами коллекции
HiddenFields []string // Поля не отображаемые в интерфейсе и не возвращаемые API
DenyReadFields []string // Поля недоступные для редактирования и не обновляемые через API
DenyWriteFields []string // Поля отображаемые в интерфейсе, но не возвращаемые в API
}
func (a Access) Clone() *Access {
clone := &Access{
Actions: make([]permission.Action, len(a.Actions)),
HiddenFields: make([]string, len(a.HiddenFields)),
DenyReadFields: make([]string, len(a.DenyReadFields)),
DenyWriteFields: make([]string, len(a.DenyWriteFields)),
}
copy(clone.Actions, a.Actions)
copy(clone.HiddenFields, a.HiddenFields)
copy(clone.DenyReadFields, a.DenyReadFields)
copy(clone.DenyWriteFields, a.DenyWriteFields)
return clone
}
func (a Access) Can(action permission.Action) bool {
for _, act := range a.Actions {
if act == action {
return true
}
}
return false
}
type Collection struct {
ID string `json:"id" bson:"id"`
SpaceID string `json:"spaceId" bson:"-"`
EnvID string `json:"envId" bson:"-"`
Name string `json:"name" bson:"name"`
Single *bool `json:"single" bson:"single,omitempty"` // В коллекции может быть только один документ
System *bool `json:"system" bson:"system,omitempty"` // Системная коллекция
NoData *bool `json:"no_data" bson:"no_data"` // Коллекция не содержит элементы. Схема используется для включения в другие схемы
Hidden bool `json:"hidden" bson:"hidden"` // Коллекция скрыта в административном интерфейсе
Schema *schema.Schema `json:"schema" bson:"schema"`
Access *Access `json:"access" bson:"-"` // Ограничения на доступ к элементам коллекции. Отсутствие объекта означает неограниченный доступ
// StateInfo отображает состояние коллекции:
// - State: идентификатор состояния коллекции (new/preparing/ready/error/changed)
// - Info: дополнительная информация о состоянии коллекции (например, если при
// применении схемы к коллекции произошла ошибка)
// - StartedAt: время, в которое коллекция перешла в состояние `Preparing`
StateInfo *StateInfo `json:"state_info" bson:"state_info,omitempty"` // todo: показывать в интерфейсе как readonly