239 lines
8.6 KiB
Plaintext
239 lines
8.6 KiB
Plaintext
CREATE MIGRATION m1cfqatfhjy63l6shobgylrpgg7yhilkvjcuy5kucknb7odov7d6oq
|
|
ONTO initial
|
|
{
|
|
CREATE MODULE media IF NOT EXISTS;
|
|
CREATE MODULE metadata IF NOT EXISTS;
|
|
CREATE MODULE radio IF NOT EXISTS;
|
|
CREATE MODULE user IF NOT EXISTS;
|
|
CREATE ABSTRACT TYPE media::Resource {
|
|
CREATE PROPERTY blob -> std::bytes {
|
|
CREATE ANNOTATION std::description := 'full contents of resource';
|
|
};
|
|
CREATE REQUIRED PROPERTY hash -> std::bytes {
|
|
CREATE ANNOTATION std::description := 'SHA256 of the resource';
|
|
};
|
|
CREATE PROPERTY metadata -> std::json;
|
|
CREATE REQUIRED PROPERTY mime -> std::str;
|
|
CREATE PROPERTY name -> std::str {
|
|
CREATE ANNOTATION std::description := 'base name of path / filename';
|
|
};
|
|
CREATE PROPERTY path -> std::str {
|
|
CREATE CONSTRAINT std::exclusive;
|
|
CREATE ANNOTATION std::description := 'full path or URI to resource';
|
|
};
|
|
CREATE REQUIRED PROPERTY size -> std::int64;
|
|
CREATE MULTI PROPERTY sources -> std::str;
|
|
CREATE INDEX ON (.hash);
|
|
};
|
|
CREATE TYPE media::RecordingGroup {
|
|
CREATE PROPERTY toc -> array<std::int32>;
|
|
CREATE ANNOTATION std::description := 'a group of Recording placed within the same folder/group';
|
|
CREATE MULTI LINK resources -> media::Resource {
|
|
CREATE ANNOTATION std::description := 'other resources included around the group (same folder, one folder down, and one folder up if applicable)';
|
|
};
|
|
CREATE PROPERTY cddb1 -> std::int32;
|
|
CREATE PROPERTY crc32 -> std::int32;
|
|
CREATE PROPERTY cuetools_crc32 -> std::int32;
|
|
CREATE PROPERTY discid -> std::str;
|
|
CREATE PROPERTY tocid -> std::str;
|
|
};
|
|
CREATE SCALAR TYPE media::ArtResourceType EXTENDING enum<Original, Large, Small>;
|
|
CREATE TYPE media::Art EXTENDING media::Resource {
|
|
CREATE MULTI LINK thumbnails -> media::Art;
|
|
CREATE REQUIRED PROPERTY kind -> std::str;
|
|
CREATE REQUIRED PROPERTY type -> media::ArtResourceType;
|
|
};
|
|
CREATE TYPE metadata::Name {
|
|
CREATE REQUIRED PROPERTY language -> std::str;
|
|
CREATE REQUIRED PROPERTY value -> std::str;
|
|
};
|
|
CREATE TYPE metadata::Artist {
|
|
CREATE REQUIRED MULTI LINK names -> metadata::Name;
|
|
CREATE PROPERTY metadata -> std::json;
|
|
};
|
|
CREATE TYPE metadata::Album {
|
|
CREATE MULTI LINK art -> media::Art;
|
|
CREATE LINK cover -> media::Art;
|
|
CREATE MULTI LINK artists -> metadata::Artist {
|
|
CREATE PROPERTY kind -> std::str;
|
|
};
|
|
CREATE REQUIRED MULTI LINK names -> metadata::Name;
|
|
CREATE PROPERTY metadata -> std::json;
|
|
};
|
|
CREATE TYPE media::Blob EXTENDING media::Resource;
|
|
CREATE SCALAR TYPE media::LyricsKind EXTENDING enum<ASS, LRC, WebVTT, SubRip, Text>;
|
|
CREATE TYPE media::Lyrics EXTENDING media::Resource {
|
|
CREATE REQUIRED PROPERTY kind -> media::LyricsKind;
|
|
CREATE REQUIRED PROPERTY language -> std::str;
|
|
};
|
|
CREATE TYPE metadata::Song {
|
|
CREATE MULTI LINK lyrics -> media::Lyrics;
|
|
CREATE MULTI LINK artists -> metadata::Artist {
|
|
CREATE PROPERTY kind -> std::str;
|
|
};
|
|
CREATE REQUIRED MULTI LINK names -> metadata::Name;
|
|
CREATE PROPERTY isrc -> std::str {
|
|
CREATE CONSTRAINT std::exclusive;
|
|
};
|
|
CREATE INDEX ON (.isrc);
|
|
CREATE MULTI LINK related -> metadata::Song {
|
|
CREATE PROPERTY kind -> std::str;
|
|
};
|
|
CREATE REQUIRED PROPERTY length -> std::duration;
|
|
CREATE PROPERTY metadata -> std::json;
|
|
};
|
|
CREATE TYPE media::Recording EXTENDING media::Resource {
|
|
CREATE PROPERTY accurip_v1 -> std::int32;
|
|
CREATE PROPERTY accurip_v2 -> std::int32;
|
|
CREATE REQUIRED PROPERTY channels -> std::int32;
|
|
CREATE PROPERTY crc32 -> std::int32;
|
|
CREATE PROPERTY cuetools_crc32 -> std::int32;
|
|
CREATE REQUIRED PROPERTY length -> std::duration;
|
|
CREATE REQUIRED PROPERTY lossless -> std::bool;
|
|
CREATE REQUIRED PROPERTY processed -> std::bool {
|
|
SET default := false;
|
|
};
|
|
CREATE REQUIRED PROPERTY sample_rate -> std::int32;
|
|
CREATE REQUIRED PROPERTY samples -> std::int64;
|
|
};
|
|
ALTER TYPE media::RecordingGroup {
|
|
CREATE REQUIRED MULTI LINK recordings -> media::Recording {
|
|
CREATE PROPERTY number -> std::int32;
|
|
};
|
|
};
|
|
ALTER TYPE media::Recording {
|
|
CREATE LINK recording_group := (.<recordings[IS media::RecordingGroup]);
|
|
};
|
|
ALTER TYPE metadata::Song {
|
|
CREATE REQUIRED MULTI LINK recordings -> media::Recording {
|
|
CREATE PROPERTY end_sample -> std::int64;
|
|
CREATE PROPERTY start_sample -> std::int64;
|
|
};
|
|
};
|
|
ALTER TYPE media::Recording {
|
|
CREATE LINK song := (.<recordings[IS metadata::Song]);
|
|
};
|
|
CREATE TYPE radio::HistoryEntry {
|
|
CREATE LINK recording -> media::Recording;
|
|
CREATE REQUIRED LINK song -> metadata::Song;
|
|
CREATE REQUIRED PROPERTY date -> std::datetime;
|
|
};
|
|
CREATE TYPE metadata::License {
|
|
CREATE PROPERTY name -> std::str;
|
|
CREATE PROPERTY url -> std::str {
|
|
CREATE CONSTRAINT std::exclusive;
|
|
};
|
|
};
|
|
CREATE SCALAR TYPE metadata::ReleaseMediaSource EXTENDING enum<CD, Web, Analog>;
|
|
CREATE TYPE metadata::Release {
|
|
CREATE LINK license -> metadata::License;
|
|
CREATE PROPERTY media_source -> metadata::ReleaseMediaSource;
|
|
CREATE PROPERTY metadata -> std::json;
|
|
CREATE PROPERTY release_date -> std::datetime;
|
|
};
|
|
ALTER TYPE metadata::Album {
|
|
CREATE MULTI LINK releases -> metadata::Release {
|
|
CREATE CONSTRAINT std::exclusive;
|
|
};
|
|
};
|
|
ALTER TYPE metadata::Release {
|
|
CREATE LINK album := (.<releases[IS metadata::Album]);
|
|
};
|
|
CREATE TYPE metadata::Tag {
|
|
CREATE REQUIRED PROPERTY name -> std::str {
|
|
CREATE CONSTRAINT std::exclusive;
|
|
};
|
|
CREATE INDEX ON (.name);
|
|
};
|
|
ALTER TYPE metadata::Album {
|
|
CREATE MULTI LINK tags -> metadata::Tag;
|
|
};
|
|
ALTER TYPE metadata::Tag {
|
|
CREATE MULTI LINK albums := (.<tags[IS metadata::Album]);
|
|
};
|
|
CREATE TYPE metadata::Disc {
|
|
CREATE PROPERTY catalog_number -> std::str;
|
|
CREATE INDEX ON (.catalog_number);
|
|
CREATE MULTI LINK tracks -> metadata::Song {
|
|
CREATE PROPERTY number -> std::int32;
|
|
};
|
|
CREATE PROPERTY metadata -> std::json;
|
|
};
|
|
ALTER TYPE metadata::Release {
|
|
CREATE MULTI LINK discs -> metadata::Disc {
|
|
CREATE CONSTRAINT std::exclusive;
|
|
CREATE PROPERTY number -> std::int32;
|
|
};
|
|
};
|
|
ALTER TYPE metadata::Disc {
|
|
CREATE LINK release := (.<discs[IS metadata::Release]);
|
|
};
|
|
ALTER TYPE metadata::Song {
|
|
CREATE MULTI LINK discs := (.<tracks[IS metadata::Disc]);
|
|
CREATE MULTI LINK tags -> metadata::Tag;
|
|
};
|
|
ALTER TYPE metadata::Tag {
|
|
CREATE MULTI LINK songs := (.<tags[IS metadata::Song]);
|
|
};
|
|
CREATE TYPE user::Favorite {
|
|
CREATE REQUIRED LINK song -> metadata::Song;
|
|
CREATE MULTI LINK tags -> metadata::Tag;
|
|
};
|
|
CREATE TYPE user::Tagging {
|
|
CREATE REQUIRED LINK song -> metadata::Song;
|
|
CREATE MULTI LINK tags -> metadata::Tag;
|
|
};
|
|
CREATE TYPE user::Playlist {
|
|
CREATE MULTI LINK songs -> metadata::Song {
|
|
CREATE PROPERTY number -> std::int32;
|
|
};
|
|
CREATE PROPERTY name -> std::str;
|
|
};
|
|
CREATE TYPE user::UserGroup {
|
|
CREATE REQUIRED PROPERTY name -> std::str {
|
|
CREATE CONSTRAINT std::exclusive;
|
|
};
|
|
CREATE MULTI PROPERTY permissions -> std::str;
|
|
};
|
|
CREATE SCALAR TYPE user::KeyKind EXTENDING enum<Ed25519, Secp256k1, Secp256r1, Passphrase>;
|
|
CREATE TYPE user::UserKey {
|
|
CREATE REQUIRED PROPERTY kind -> user::KeyKind;
|
|
CREATE REQUIRED PROPERTY value -> std::bytes;
|
|
};
|
|
CREATE TYPE user::User {
|
|
CREATE REQUIRED PROPERTY name -> std::str {
|
|
CREATE CONSTRAINT std::exclusive;
|
|
};
|
|
CREATE INDEX ON (.name);
|
|
CREATE REQUIRED MULTI LINK groups -> user::UserGroup;
|
|
CREATE REQUIRED MULTI LINK keys -> user::UserKey {
|
|
CREATE PROPERTY name -> std::str;
|
|
};
|
|
CREATE PROPERTY metadata -> std::json;
|
|
};
|
|
ALTER TYPE radio::HistoryEntry {
|
|
CREATE PROPERTY source -> user::User;
|
|
};
|
|
ALTER TYPE user::Favorite {
|
|
CREATE REQUIRED LINK owner -> user::User;
|
|
CREATE INDEX ON (.owner);
|
|
};
|
|
ALTER TYPE user::User {
|
|
CREATE MULTI LINK favorites := (.<owner[IS user::Favorite]);
|
|
};
|
|
ALTER TYPE user::Playlist {
|
|
CREATE REQUIRED LINK owner -> user::User;
|
|
CREATE INDEX ON (.owner);
|
|
};
|
|
ALTER TYPE user::User {
|
|
CREATE MULTI LINK playlists := (.<owner[IS user::Playlist]);
|
|
};
|
|
ALTER TYPE user::Tagging {
|
|
CREATE REQUIRED LINK owner -> user::User;
|
|
CREATE INDEX ON (.owner);
|
|
};
|
|
ALTER TYPE user::User {
|
|
CREATE MULTI LINK tagged := (.<owner[IS user::Tagging]);
|
|
};
|
|
};
|