class

PlaceOS::Model::Metadata

Inherits PlaceOS::Model::Utilities::Versions < PlaceOS::Model::Utilities::LastModified < PlaceOS::Model::Timestamps < PlaceOS::Model::ModelBase < PlaceOS::Model::Associations < Neuroplastic < PgORM::Base < PgORM::Validators < PgORM::Table < PgORM::Persistence < PgORM::Associations < ActiveModel::Callbacks < ActiveModel::Validation < ActiveModel::Model < DB::Mappable < DB::Serializable < YAML::Serializable < JSON::Serializable < Reference < Object

Constants

CALLBACKS = { before_save: [:set_modified_by] of Nil, after_save: [:clear_modifier, :__create_version__, :cleanup_history] of Nil, before_create: [do self.created_at = self.updated_at = Time.utc end] of Nil, after_create: [] of Nil, before_update: [do self.updated_at = Time.utc end] of Nil, after_update: [] of Nil, before_destroy: [:destroy_metadata] of Nil, after_destroy: [] of Nil, }
Log = ::Log.for(self)
PRIMARY_KEY_TYPES = {:id => (String | Nil)} of Nil => Nil

macro level key => type

PRIMARY_KEYS = [{:id}]

Constructors

from_json(string_or_io : String | IO, trusted : Bool = false) : self
from_json(string_or_io : String | IO, root : String, trusted : Bool = false) : self

Deserializes the given JSON in string_or_io into an instance of self, assuming the JSON consists of an JSON object with key root, and whose value is the value to deserialize. Will not deserialise from fields with mass_assign: false

class User < ActiveModel::Model
  attribute name : String
  attribute google_id : UUID, mass_assign: false
end

User.from_json(%({"main": {"name": "Jason", "google_id": "f6f70bfb-c882-446d-8758-7ce47db39620"}}), root: "main") # => #<User:0x103131b20 @name="Jason">
from_trusted_json(string_or_io : String | IO, root : String) : self
from_trusted_json(string_or_io : String | IO) : self

Serialize from a trusted JSON source

from_trusted_yaml(string_or_io : String | IO) : self

Serialize from a trusted YAML source

from_yaml(string_or_io : String | IO, trusted : Bool = false) : self
new(rs : DB::ResultSet)
new(created_at : Time | ActiveModel::Model::None = ::ActiveModel::Model::None.new, updated_at : Time | ActiveModel::Model::None = ::ActiveModel::Model::None.new, modified_by_id : String | Nil | ActiveModel::Model::None = ::ActiveModel::Model::None.new, metadata_id : String | Nil | ActiveModel::Model::None = ::ActiveModel::Model::None.new, name : String | ActiveModel::Model::None = ::ActiveModel::Model::None.new, description : String | ActiveModel::Model::None = ::ActiveModel::Model::None.new, details : JSON::Any | ActiveModel::Model::None = ::ActiveModel::Model::None.new, editors : Set(String) | ActiveModel::Model::None = ::ActiveModel::Model::None.new, parent_id : String | Nil | ActiveModel::Model::None = ::ActiveModel::Model::None.new, schema_id : String | Nil | ActiveModel::Model::None = ::ActiveModel::Model::None.new, id : String | Nil | ActiveModel::Model::None = ::ActiveModel::Model::None.new)

Initialize PlaceOS::Model::Metadata from HTTP::Params.

Class methods

attributes

Returns all attribute keys.

build_history(parent, name : String | Nil = nil, offset : Int32 = 0, limit : Int32 = 10)
Source
build_metadata(parent, name : String | Nil = nil) : Hash(String, Interface)
Source
by_parent_id(id)

Look up instances of this model dependent on the foreign key

Source
by_schema_id(id)

Look up instances of this model dependent on the foreign key

Source
changes(id : String | Nil | Nil = nil) : ChangeFeed

Changefeed at row (if id passed) or whole table level. Returns a ChangeFeed instance which can be used to invoke async callbacks via on or use blocking Iterator via each method.

elastic
for(parent : String | Zone | ControlSystem | User, name : String | Nil = nil)
Source
from_interface(interface : Interface)
Source
from_rs(__temp_2077 : DB::ResultSet)
interface(model : Metadata)
Source
master_metadata_query(offset : Int32 = 0, limit : Int32 = 100, &)

Query on main metadata records

Gets records where the metadata_id does not exist, i.e. is the main

Source
master_metadata_query_count

Count of records returned by query on main metadata records

Gets records where the metadata_id does not exist, i.e. is the main

Source
master_metadata_raw_query(count : Bool = false, &)

Query on main metadata records

Gets records where the metadata_id does not exist, i.e. is the main

Source
on_error(err : Exception | IO::Error)
primary_key

Base class for all Engine models

Source
table_name
user_can_create?(parent_id : String | Nil, user : Model::UserJWT)

Determine if a user has create access to the Metadata

  • Support+ Users can edit Metadata
  • Users can edit their own Metadata
Source
validate_parent_exists(metadata : Metadata)
Source
validate_unique_name(metadata : Metadata)
Source

Instance methods

__control_system
__control_system=(__control_system : ControlSystem | Nil)
__modified_by
__modified_by=(__modified_by : User | Nil)
__schema

Schema for validating details object

__schema=(__schema : JsonSchema | Nil)

Schema for validating details object

__user
__user=(__user : User | Nil)
__zone
__zone=(__zone : Zone | Nil)
after_create

Base class for all Engine models

after_destroy

Base class for all Engine models

after_initialize(trusted : Bool)
after_save

Base class for all Engine models

after_update

Base class for all Engine models

apply_defaults

Generate code to apply default values

assign_attributes(created_at : Time | Missing = Missing, updated_at : Time | Missing = Missing, modified_by_id : String | Nil | Missing = Missing, metadata_id : String | Nil | Missing = Missing, name : String | Missing = Missing, description : String | Missing = Missing, details : JSON::Any | Missing = Missing, editors : Set(String) | Missing = Missing, parent_id : String | Nil | Missing = Missing, schema_id : String | Nil | Missing = Missing, id : String | Nil | Missing = Missing)

Assign to multiple attributes.

assign_attributes(params : HTTP::Params | Hash(String, String) | Tuple(String, String))

Assign to multiple attributes via HTTP::Params.

assign_attributes(model : PlaceOS::Model::Metadata)

Assign to multiple attributes from a model object

assign_attributes_from_json(json, root : String)
assign_attributes_from_json(json)
assign_attributes_from_trusted_json(json, root : String)
assign_attributes_from_trusted_json(json)

Assign each field from JSON if field exists in JSON and has changed in model

assign_attributes_from_trusted_yaml(yaml)
assign_attributes_from_yaml(yaml)

Uses the YAML parser as JSON is valid YAML

assign_from_interface(user : Model::UserJWT, interface : Interface, merge_details : Bool = false)
Source
attributes

Returns a Hash of all attribute values

attributes_tuple

Returns a NamedTuple of all attribute values.

before_create

Base class for all Engine models

before_destroy

Base class for all Engine models

before_save

Base class for all Engine models

before_update

Base class for all Engine models

changed?

Check if any attributes have changed.

changed_attributes

Returns a Hash with all changed attributes.

changed_json(io : IO) : Nil

Serialize the set of changed attributes to JSON.

changed_json

Serialize the set of changed attributes to JSON.

changed_persist_attributes
changed_yaml(io : IO) : Nil

Serialize the set of changed attributes to YAML.

changed_yaml

Serialize the set of changed attributes to YAML.

clear_changes_information

Reset changes for all attributes.

control_system

Retrieves the parent relationship

Source
control_system!
Source
control_system=(parent : ControlSystem)

Sets the parent relationship

Source
created_at

created_at getter

created_at=(value : Time)

Setters created_at setter

created_at?

NOTE: use getter / getter! (not property / property!) so that the setter defined later in __create_initializer__ is the only setter on the field. Crystal's overload resolution silently fails to replace a property-defined setter with one of identical signature for generic types (e.g. Set(String)?, Array(String)?, String | Array(String)), although it does work for non-generic ones like String?. Defining the setter only once via __create_initializer__ ensures change tracking, sanitization, and custom setter blocks run uniformly across all types.

created_at_assigned?
created_at_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

created_at_changed?
created_at_default

created_at's default value

created_at_present?
created_at_removed?
created_at_was
created_at_will_change!

Include created_at in the set of changed attributes, whether it has changed or not.

description

description getter

description=(value : String)

description setter

description?

NOTE: use getter / getter! (not property / property!) so that the setter defined later in __create_initializer__ is the only setter on the field. Crystal's overload resolution silently fails to replace a property-defined setter with one of identical signature for generic types (e.g. Set(String)?, Array(String)?, String | Array(String)), although it does work for non-generic ones like String?. Defining the setter only once via __create_initializer__ ensures change tracking, sanitization, and custom setter blocks run uniformly across all types.

description_assigned?
description_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

description_changed?
description_default

description's default value

Source
description_present?
description_removed?
description_was
description_will_change!

Include description in the set of changed attributes, whether it has changed or not.

destroy_metadata
details

details getter

details=(value : JSON::Any)

details setter

details?

NOTE: use getter / getter! (not property / property!) so that the setter defined later in __create_initializer__ is the only setter on the field. Crystal's overload resolution silently fails to replace a property-defined setter with one of identical signature for generic types (e.g. Set(String)?, Array(String)?, String | Array(String)), although it does work for non-generic ones like String?. Defining the setter only once via __create_initializer__ ensures change tracking, sanitization, and custom setter blocks run uniformly across all types.

details_assigned?
details_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

details_changed?
details_default

details's default value

Source
details_present?
details_removed?
details_was
details_will_change!

Include details in the set of changed attributes, whether it has changed or not.

editors

editors getter

editors=(value : Set(String))

editors setter

editors?

NOTE: use getter / getter! (not property / property!) so that the setter defined later in __create_initializer__ is the only setter on the field. Crystal's overload resolution silently fails to replace a property-defined setter with one of identical signature for generic types (e.g. Set(String)?, Array(String)?, String | Array(String)), although it does work for non-generic ones like String?. Defining the setter only once via __create_initializer__ ensures change tracking, sanitization, and custom setter blocks run uniformly across all types.

editors_assigned?
editors_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

editors_changed?
editors_default

editors's default value

Source
editors_present?
editors_removed?
editors_was
editors_will_change!

Include editors in the set of changed attributes, whether it has changed or not.

history(offset : Int32 = 0, limit : Int32 = 10, &)

Get version history

Versions are in descending order of creation

Source
history(offset : Int32 = 0, limit : Int32 = 10)

Get version history

Versions are in descending order of creation

Source
history_count

Return the number of versions for the main record.

If the record is a version, this is always 0.

Source
id

id getter

id=(value : String | Nil)

id setter

id?
id_assigned?
id_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

id_changed?
id_default

id's default value

id_present?
id_removed?
id_was
id_will_change!

Include id in the set of changed attributes, whether it has changed or not.

interface
Source
invoke_props

Base class for all Engine models

is_version?

If a PlaceOS::Model::Metadata has a parent, it's a version

Source
metadata
metadata_id

metadata_id getter

metadata_id=(value : String | Nil)

metadata_id setter

metadata_id_assigned?
metadata_id_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

metadata_id_changed?
metadata_id_default

metadata_id's default value

metadata_id_present?

Associate with main version

metadata_id_removed?
metadata_id_was
metadata_id_will_change!

Include metadata_id in the set of changed attributes, whether it has changed or not.

modified_by

Get cached child or attempt to load an associated modified_by

modified_by!
modified_by=(user)
Source
modified_by_id

modified_by_id getter

modified_by_id=(value : String | Nil)

modified_by_id setter

modified_by_id_assigned?
modified_by_id_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

modified_by_id_changed?
modified_by_id_default

modified_by_id's default value

modified_by_id_present?
modified_by_id_removed?
modified_by_id_was
modified_by_id_will_change!

Include modified_by_id in the set of changed attributes, whether it has changed or not.

name

name getter

name=(value : String)

name setter

name?

NOTE: use getter / getter! (not property / property!) so that the setter defined later in __create_initializer__ is the only setter on the field. Crystal's overload resolution silently fails to replace a property-defined setter with one of identical signature for generic types (e.g. Set(String)?, Array(String)?, String | Array(String)), although it does work for non-generic ones like String?. Defining the setter only once via __create_initializer__ ensures change tracking, sanitization, and custom setter blocks run uniformly across all types.

name_assigned?
name_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

name_changed?
name_default

name's default value

Source
name_present?
name_removed?
name_was
name_will_change!

Include name in the set of changed attributes, whether it has changed or not.

parent
Source
parent_id

parent_id getter

parent_id=(value : String | Nil)

parent_id setter

parent_id?

NOTE: use getter / getter! (not property / property!) so that the setter defined later in __create_initializer__ is the only setter on the field. Crystal's overload resolution silently fails to replace a property-defined setter with one of identical signature for generic types (e.g. Set(String)?, Array(String)?, String | Array(String)), although it does work for non-generic ones like String?. Defining the setter only once via __create_initializer__ ensures change tracking, sanitization, and custom setter blocks run uniformly across all types.

parent_id_assigned?
parent_id_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

parent_id_changed?
parent_id_default

parent_id's default value

parent_id_present?
parent_id_removed?
parent_id_was
parent_id_will_change!

Include parent_id in the set of changed attributes, whether it has changed or not.

persistent_attributes

Returns a Hash of all attributes that can be persisted.

primary_key

Base class for all Engine models

Source
primary_key_hash
reset_associations

Schema for validating details object

Source
restore_attributes

Reset each attribute to their previous values and clears all changes.

schema

Retrieves the parent relationship

Source
schema!

Schema for validating details object

Source
schema=(parent : JsonSchema)

Sets the parent relationship

Source
schema_id

schema_id getter

schema_id=(value : String | Nil)

schema_id setter

schema_id_assigned?
schema_id_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

schema_id_changed?
schema_id_default

schema_id's default value

schema_id_present?

Schema for validating details object

schema_id_removed?
schema_id_was
schema_id_will_change!

Include schema_id in the set of changed attributes, whether it has changed or not.

table_name
to_parent_json(json : JSON::Builder)

Serialize attributes with :parent in its serialization_group option

to_parent_json(io : IO) : Nil

Serialize attributes with :parent in its serialization_group option

to_parent_json

Serialize attributes with :parent in its serialization_group option

to_parent_struct
updated_at

updated_at getter

updated_at=(value : Time)

updated_at setter

updated_at?

NOTE: use getter / getter! (not property / property!) so that the setter defined later in __create_initializer__ is the only setter on the field. Crystal's overload resolution silently fails to replace a property-defined setter with one of identical signature for generic types (e.g. Set(String)?, Array(String)?, String | Array(String)), although it does work for non-generic ones like String?. Defining the setter only once via __create_initializer__ ensures change tracking, sanitization, and custom setter blocks run uniformly across all types.

updated_at_assigned?
updated_at_change

Returns a Tuple of the previous and the current value of an instance variable if it has changed

updated_at_changed?
updated_at_default

updated_at's default value

updated_at_present?
updated_at_removed?
updated_at_was
updated_at_will_change!

Include updated_at in the set of changed attributes, whether it has changed or not.

user

Retrieves the parent relationship

Source
user!
Source
user=(parent : User)

Sets the parent relationship

Source
user_can_update?(user : Model::UserJWT)

Determine if a user has edit access to the Metadata

  • Support+ Users can edit Metadata
  • Users can edit their own Metadata
  • User's with roles in the Metadata's editors can edit
Source
validate_nilability

Validate that all non-nillable fields have values.

zone

Retrieves the parent relationship

Source
zone!
Source
zone=(parent : Zone)

Sets the parent relationship

Source

Nested types