class PlaceOS::Model::GroupPlaylist

Overview

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).

Included Modules

Defined in:

placeos-models/group/playlist.cr

Constant Summary

CALLBACKS = {before_save: [do if (__temp_1354 = @group) && __temp_1354.new_record? __temp_1354.save self.group_id = __temp_1354.id.not_nil! end end, do if (__temp_1356 = @playlist) && __temp_1356.new_record? __temp_1356.save self.playlist_id = __temp_1356.id.not_nil! end end] of Nil, after_save: [] 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: [] of Nil, after_destroy: [do end, do end] of Nil}

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).

PRIMARY_KEY_TYPES = {:group_id => UUID, :playlist_id => String} of Nil => Nil

macro level key => type

PRIMARY_KEYS = [{:group_id, :playlist_id}]

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).

Constructors

Class Method Summary

Instance Method Summary

Constructor Detail

def self.from_json(string_or_io : String | IO, trusted : Bool = false) : self #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def 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">

def self.from_trusted_json(string_or_io : String | IO, root : String) : self #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def self.from_trusted_json(string_or_io : String | IO) : self #

Serialize from a trusted JSON source


def self.from_trusted_yaml(string_or_io : String | IO) : self #

Serialize from a trusted YAML source


def self.from_yaml(string_or_io : String | IO, trusted : Bool = false) : self #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def self.new(ctx : YAML::ParseContext, node : YAML::Nodes::Node) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def self.new(pull : JSON::PullParser) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def self.new(rs : DB::ResultSet) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def self.new(created_at : Time | ActiveModel::Model::None = ::ActiveModel::Model::None.new, updated_at : Time | ActiveModel::Model::None = ::ActiveModel::Model::None.new, group_id : UUID | ActiveModel::Model::None = ::ActiveModel::Model::None.new, playlist_id : String | ActiveModel::Model::None = ::ActiveModel::Model::None.new) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def self.new(params : HTTP::Params | Hash(String, String) | Tuple(String, String)) #

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


Class Method Detail

def self.attributes : Array(Symbol) #

Returns all attribute keys.


def self.by_group_id(id) #

[View source]
def self.by_playlist_id(id) #

[View source]
def self.changes(id : Tuple(UUID, String) | 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.


def self.from_rs(__temp_2518 : DB::ResultSet) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def self.on_error(err : Exception | IO::Error) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def self.primary_key #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def self.table_name #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


Instance Method Detail

def after_create #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def after_destroy #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def after_initialize(trusted : Bool) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def after_save #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def after_update #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def apply_defaults #

Generate code to apply default values


def assign_attributes(created_at : Time | Missing = Missing, updated_at : Time | Missing = Missing, group_id : UUID | Missing = Missing, playlist_id : String | Missing = Missing) #

Assign to multiple attributes.


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

Assign to multiple attributes via HTTP::Params.


def assign_attributes(model : PlaceOS::Model::GroupPlaylist) #

Assign to multiple attributes from a model object


def assign_attributes_from_json(json, root : String) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def assign_attributes_from_json(json) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def assign_attributes_from_trusted_json(json, root : String) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def assign_attributes_from_trusted_json(json) #

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


def assign_attributes_from_trusted_yaml(yaml) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def assign_attributes_from_yaml(yaml) #

Uses the YAML parser as JSON is valid YAML


def attributes #

Returns a Hash of all attribute values


def attributes_tuple #

Returns a NamedTuple of all attribute values.


def before_create #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def before_destroy #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def before_save #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def before_update #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def build_group(**attributes) : Group #

[View source]
def build_playlist(**attributes) : Playlist #

[View source]
def changed? #

Check if any attributes have changed.


def changed_attributes #

Returns a Hash with all changed attributes.


def changed_json(io : IO) : Nil #

Serialize the set of changed attributes to JSON.


def changed_json : String #

Serialize the set of changed attributes to JSON.


def changed_persist_attributes #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def changed_yaml(io : IO) : Nil #

Serialize the set of changed attributes to YAML.


def changed_yaml : String #

Serialize the set of changed attributes to YAML.


def clear_changes_information #

Reset changes for all attributes.


def create_group(**attributes) : Group #

[View source]
def create_group!(**attributes) : Group #

[View source]
def create_playlist(**attributes) : Playlist #

[View source]
def create_playlist!(**attributes) : Playlist #

[View source]
def created_at : Time #

#created_at getter


def created_at=(value : Time) #

Setters #created_at setter


def created_at? : Time | Nil #

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.


def created_at_assigned? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def created_at_change : Tuple(Time | Nil, Time | Nil) | Nil #

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


def created_at_changed? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def created_at_default : Time #

#created_at's default value


def created_at_present? : Bool #

def created_at_removed? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def created_at_was : Time | Nil #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def created_at_will_change! : Nil #

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


def group : Group #

[View source]
def group! : Group #

[View source]
def group=(record : Group) : Group #

[View source]
def group? : Group | Nil #

[View source]
def group_id : UUID #

#group_id getter


def group_id=(value : UUID) #

#group_id setter


def group_id? : UUID | Nil #

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.


def group_id_assigned? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def group_id_change : Tuple(UUID | Nil, UUID | Nil) | Nil #

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


def group_id_changed? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def group_id_default : UUID #

#group_id's default value


[View source]
def group_id_present? : Bool #

def group_id_removed? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def group_id_was : UUID | Nil #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def group_id_will_change! : Nil #

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


def id #

Always returns this record's primary key value, even when the primary key isn't named #id


def id? #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def invoke_props #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def persistent_attributes #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def playlist : Playlist #

[View source]
def playlist! : Playlist #

[View source]
def playlist=(record : Playlist) : Playlist #

[View source]
def playlist? : Playlist | Nil #

[View source]
def playlist_id : String #

#playlist_id getter


def playlist_id=(value : String) #

#playlist_id setter


def playlist_id? : String | Nil #

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.


def playlist_id_assigned? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def playlist_id_change : Tuple(String | Nil, String | Nil) | Nil #

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


def playlist_id_changed? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def playlist_id_default : String #

#playlist_id's default value


[View source]
def playlist_id_present? : Bool #

def playlist_id_removed? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def playlist_id_was : String | Nil #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def playlist_id_will_change! : Nil #

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


def primary_key #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def primary_key_hash #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def reload_group : Group #

[View source]
def reload_group? : Group | Nil #

[View source]
def reload_playlist : Playlist #

[View source]
def reload_playlist? : Playlist | Nil #

[View source]
def restore_attributes #

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


def run_create_callbacks(&) #

Wrap a block with callbacks for the appropriate crud operation


[View source]
def run_destroy_callbacks(&) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def run_save_callbacks(&) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def run_update_callbacks(&) #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


[View source]
def table_name #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def updated_at : Time #

#updated_at getter


def updated_at=(value : Time) #

#updated_at setter


def updated_at? : Time | Nil #

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.


def updated_at_assigned? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def updated_at_change : Tuple(Time | Nil, Time | Nil) | Nil #

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


def updated_at_changed? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def updated_at_default : Time #

#updated_at's default value


def updated_at_present? : Bool #

def updated_at_removed? : Bool #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def updated_at_was : Time | Nil #

Junction between Group (authority-scoped, UUID) and Playlist (authority-scoped, legacy TEXT PK). Lets groups co-own / share playlists with each other within the same authority.

Presence-only — no per-row permission bitmask, no GroupHistory audit. A user's capability on a linked playlist comes from their GroupUser.permissions within the group.

Both sides must share an authority — enforced at the model layer (no single FK can express it).


def updated_at_will_change! : Nil #

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


def validate_nilability #

Validate that all non-nillable fields have values.