updates MODELS and SCHEMAS

This commit is contained in:
Sundog 2023-10-19 14:57:03 -04:00
parent ce51888070
commit 9c4d3a7197
2 changed files with 261 additions and 4 deletions

View File

@ -21,6 +21,9 @@ struct Person {
name: String, name: String,
handle: Option<String>, handle: Option<String>,
email: Option<Vec<String>>, email: Option<Vec<String>>,
avatar: Option<String>,
cover: Option<String>,
bio: Option<String>,
is_active: bool, is_active: bool,
is_blocked: bool, is_blocked: bool,
created_at: chrono::DateTime, created_at: chrono::DateTime,
@ -240,8 +243,8 @@ struct PlaylistId {
struct Playlist { struct Playlist {
id: PlaylistId, id: PlaylistId,
title: String, title: String,
description: String, description: Option<String>,
created_by: String, created_by: PersonId,
created_at: chrono::DateTime, created_at: chrono::DateTime,
modified_at: chrono::DateTime, modified_at: chrono::DateTime,
deleted_at: Option<chrono::DateTime> deleted_at: Option<chrono::DateTime>
@ -313,14 +316,40 @@ struct Comment {
target_id: CommentTargetId, target_id: CommentTargetId,
created_by: PersonId, created_by: PersonId,
created_at: chrono::DateTime, created_at: chrono::DateTime,
modified_at: chrono::DateTime, modified_by: Option<PersonId>,
deleted_at: Option<chrono::DateTime> modified_at: Option<chrono::DateTime>,
deleted_by: Option<PersonId>,
deleted_at: Option<chrono::DateTime>,
is_public: bool, is_public: bool,
is_approved: bool, is_approved: bool,
in_reply_to: Option<CommentId>, in_reply_to: Option<CommentId>,
} }
``` ```
# Image
An Image represents an image file that a Person wants to reference from a Label, an Artist, an Album, a Track, a Playlist, or an Article.
``` rust
struct ImageId {
id: String,
}
struct Image {
id: ImageId,
path: String,
width: usize,
height: usize,
alt_text: String,
is_public: bool,
created_by: PersonId,
created_at: chrono::DateTime,
modified_by: PersonId,
modified_at: chrono::DateTime,
deleted_by: Option<PersonId>,
deleted_at: Option<chrono::DateTime>,
}
```
# Collection # Collection
A Collection represents one or more Albums and/or Tracks that are offered together as a package for Purchase A Collection represents one or more Albums and/or Tracks that are offered together as a package for Purchase

228
SCHEMA.md
View File

@ -13,6 +13,9 @@ CREATE TABLE Persons (
remote_id TEXT, /* field to store an arbitrary remote identifier for this Person if they are not local */ remote_id TEXT, /* field to store an arbitrary remote identifier for this Person if they are not local */
name TEXT, /* "real" name */ name TEXT, /* "real" name */
handle TEXT, /* also commonly refered to as 'display_name' or 'screen_name', optional (if missing, name will be used as handle) */ handle TEXT, /* also commonly refered to as 'display_name' or 'screen_name', optional (if missing, name will be used as handle) */
avatar TEXT, /* optional URL to Person's avatar image / profile pic */
cover TEXT, /* optional URL to Person's cover image / header image */
bio TEXT, /* optional biographical text provided by Person */
is_active INTEGER DEFAULT (1), /* bool, default true */ is_active INTEGER DEFAULT (1), /* bool, default true */
is_blocked INTEGER DEFAULT (0), /* bool, default false */ is_blocked INTEGER DEFAULT (0), /* bool, default false */
created_at INTEGER, /* timestamp */ created_at INTEGER, /* timestamp */
@ -330,23 +333,248 @@ CREATE INDEX Albums_deleted_at_IDX ON Albums (deleted_at);
``` ```
# AlbumArtists # AlbumArtists
The AlbumArtists table will be a one-to-many lookup table mapping Artists to a particular Album.
``` sql
CREATE TABLE AlbumArtists (
album_id TEXT(36),
artist_id TEXT(36),
is_primary INTEGER DEFAULT (0),
CONSTRAINT AlbumArtists_PK PRIMARY KEY (album_id,artist_id),
CONSTRAINT AlbumArtists_FK FOREIGN KEY (album_id) REFERENCES Albums(id) ON DELETE CASCADE,
CONSTRAINT AlbumArtists_FK_1 FOREIGN KEY (artist_id) REFERENCES Artists(id) ON DELETE CASCADE
);
CREATE INDEX AlbumArtists_is_primary_IDX ON AlbumArtists (is_primary);
CREATE INDEX AlbumArtists_album_id_IDX ON AlbumArtists (album_id);
CREATE INDEX AlbumArtists_artist_id_IDX ON AlbumArtists (artist_id);
```
# AlbumTags # AlbumTags
The AlbumTags table will contain Tags that have been assigned to an Album.
``` sql
CREATE TABLE AlbumTags (
album_id TEXT(36),
tag_id TEXT(36),
is_approved INTEGER DEFAULT (0),
CONSTRAINT AlbumTags_PK PRIMARY KEY (album_id,tag_id),
CONSTRAINT AlbumTags_FK FOREIGN KEY (album_id) REFERENCES Albums(id) ON DELETE CASCADE,
CONSTRAINT AlbumTags_FK_1 FOREIGN KEY (tag_id) REFERENCES Tags(id) ON DELETE CASCADE
);
CREATE INDEX AlbumTags_is_approved_IDX ON AlbumTags (is_approved);
CREATE INDEX AlbumTags_album_id_IDX ON AlbumTags (album_id);
CREATE INDEX AlbumTags_tag_id_IDX ON AlbumTags (tag_id);
```
# AlbumTracks
The AlbumTracks table will be a many-to-many lookup table mapping Tracks to Albums
``` sql
CREATE TABLE AlbumTracks (
album_id TEXT(36),
track_id TEXT(36),
track_number INTEGER,
CONSTRAINT AlbumTracks_PK PRIMARY KEY (album_id,track_id),
CONSTRAINT AlbumTracks_FK FOREIGN KEY (album_id) REFERENCES Albums(id) ON DELETE CASCADE,
CONSTRAINT AlbumTracks_FK_1 FOREIGN KEY (track_id) REFERENCES Tracks(id) ON DELETE CASCADE
);
CREATE INDEX AlbumTracks_track_number_IDX ON AlbumTracks (track_number);
CREATE INDEX AlbumTracks_album_id_IDX ON AlbumTracks (album_id);
CREATE INDEX AlbumTracks_track_id_IDX ON AlbumTracks (track_id);
```
# Playlists # Playlists
The Playlists table will contain Playlists!
``` sql
CREATE TABLE Playlists (
id TEXT(36),
title TEXT,
description TEXT,
created_by TEXT(36),
created_at INTEGER,
modified_at INTEGER,
deleted_at INTEGER,
is_public INTEGER DEFAULT (1),
CONSTRAINT Playlists_PK PRIMARY KEY (id),
CONSTRAINT Playlists_FK FOREIGN KEY (created_by) REFERENCES Persons(id)
);
CREATE INDEX Playlists_title_IDX ON Playlists (title);
CREATE INDEX Playlists_description_IDX ON Playlists (description);
CREATE INDEX Playlists_created_by_IDX ON Playlists (created_by);
CREATE INDEX Playlists_created_at_IDX ON Playlists (created_at);
CREATE INDEX Playlists_modified_at_IDX ON Playlists (modified_at);
CREATE INDEX Playlists_deleted_at_IDX ON Playlists (deleted_at);
CREATE INDEX Playlists_is_public_IDX ON Playlists (is_public);
```
# PlaylistTracks # PlaylistTracks
The PlaylistTracks table will be a many-to-many lookup table mapping Tracks to Playlists
``` sql
CREATE TABLE PlaylistTracks (
playlist_track_id TEXT(36),
playlist_id TEXT(36),
track_id TEXT,
track_number INTEGER,
CONSTRAINT PlaylistTracks_PK PRIMARY KEY (playlist_track_id),
CONSTRAINT PlaylistTracks_FK FOREIGN KEY (playlist_id) REFERENCES Playlists(id) ON DELETE CASCADE,
CONSTRAINT PlaylistTracks_FK_1 FOREIGN KEY (track_id) REFERENCES Tracks(id) ON DELETE CASCADE
);
CREATE INDEX PlaylistTracks_track_number_IDX ON PlaylistTracks (track_number);
CREATE INDEX PlaylistTracks_playlist_id_IDX ON PlaylistTracks (playlist_id);
CREATE INDEX PlaylistTracks_track_id_IDX ON PlaylistTracks (track_id);
```
# PlaylistTags # PlaylistTags
The PlaylistTags table will contain Tags that have been assigned to a Playlist.
``` sql
CREATE TABLE PlaylistTags (
playlist_id TEXT(36),
tag_id TEXT(36),
is_approved INTEGER DEFAULT (0),
CONSTRAINT PlaylistTags_PK PRIMARY KEY (playlist_id,tag_id),
CONSTRAINT PlaylistTags_FK FOREIGN KEY (playlist_id) REFERENCES Playlists(id) ON DELETE CASCADE,
CONSTRAINT PlaylistTags_FK_1 FOREIGN KEY (tag_id) REFERENCES Tags(id) ON DELETE CASCADE
);
CREATE INDEX PlaylistTags_is_approved_IDX ON PlaylistTags (is_approved);
CREATE INDEX PlaylistTags_playlist_id_IDX ON PlaylistTags (playlist_id);
CREATE INDEX PlaylistTags_tag_id_IDX ON PlaylistTags (tag_id);
```
# Comments # Comments
The Comments table will contain Comments!
``` sql
CREATE TABLE Comments (
id TEXT(36),
body TEXT,
created_by TEXT(36),
created_at INTEGER,
modified_by TEXT(36),
modified_at INTEGER,
deleted_by TEXT(36),
deleted_at INTEGER,
is_public INTEGER DEFAULT (1),
is_approved INTEGER DEFAULT (0),
in_reply_to TEXT(36),
CONSTRAINT Comments_PK PRIMARY KEY (id),
CONSTRAINT Comments_FK FOREIGN KEY (created_by) REFERENCES Persons(id),
CONSTRAINT Comments_FK_1 FOREIGN KEY (modified_by) REFERENCES Persons(id),
CONSTRAINT Comments_FK_2 FOREIGN KEY (deleted_by) REFERENCES Persons(id)
);
CREATE INDEX Comments_body_IDX ON Comments (body);
CREATE INDEX Comments_created_at_IDX ON Comments (created_at);
CREATE INDEX Comments_modified_at_IDX ON Comments (modified_at);
CREATE INDEX Comments_deleted_at_IDX ON Comments (deleted_at);
CREATE INDEX Comments_is_public_IDX ON Comments (is_public);
CREATE INDEX Comments_is_approved_IDX ON Comments (is_approved);
CREATE INDEX Comments_in_reply_to_IDX ON Comments (in_reply_to);
```
# LabelComments # LabelComments
The LabelComments table will relate Comments to the Label they are about, if pertinent.
``` sql
CREATE TABLE LabelComments (
label_id TEXT(36),
comment_id TEXT(36),
CONSTRAINT LabelComments_PK PRIMARY KEY (label_id,comment_id),
CONSTRAINT LabelComments_FK FOREIGN KEY (label_id) REFERENCES Labels(id) ON DELETE CASCADE,
CONSTRAINT LabelComments_FK_1 FOREIGN KEY (comment_id) REFERENCES Comments(id) ON DELETE CASCADE
);
CREATE INDEX LabelComments_label_id_IDX ON LabelComments (label_id);
CREATE INDEX LabelComments_comment_id_IDX ON LabelComments (comment_id);
```
# ArtistComments # ArtistComments
The ArtistComments table will relate Comments to the Artist they are about, if pertinent.
``` sql
CREATE TABLE ArtistComments (
artist_id TEXT(36),
comment_id TEXT(36),
CONSTRAINT ArtistComments_PK PRIMARY KEY (artist_id,comment_id),
CONSTRAINT ArtistComments_FK FOREIGN KEY (artist_id) REFERENCES Artists(id) ON DELETE CASCADE,
CONSTRAINT ArtistComments_FK_1 FOREIGN KEY (comment_id) REFERENCES Comments(id) ON DELETE CASCADE
);
CREATE INDEX ArtistComments_artist_id_IDX ON ArtistComments (artist_id);
CREATE INDEX ArtistComments_comment_id_IDX ON ArtistComments (comment_id);
```
# TrackComments # TrackComments
The TrackComments table will relate Comments to the Track they are about, if pertinent.
``` sql
CREATE TABLE TrackComments (
track_id TEXT(36),
comment_id TEXT(36),
CONSTRAINT TrackComments_PK PRIMARY KEY (track_id,comment_id),
CONSTRAINT TrackComments_FK FOREIGN KEY (track_id) REFERENCES Tracks(id) ON DELETE CASCADE,
CONSTRAINT TrackComments_FK_1 FOREIGN KEY (comment_id) REFERENCES Comments(id) ON DELETE CASCADE
);
CREATE INDEX TrackComments_track_id_IDX ON TrackComments (track_id);
CREATE INDEX TrackComments_comment_id_IDX ON TrackComments (comment_id);
```
# AlbumComments # AlbumComments
The AlbumComments table will relate Comments to the Album they are about, if pertinent.
``` sql
CREATE TABLE AlbumComments (
album_id TEXT(36),
comment_id TEXT(36),
CONSTRAINT AlbumComments_PK PRIMARY KEY (album_id,comment_id),
CONSTRAINT AlbumComments_FK FOREIGN KEY (album_id) REFERENCES Albums(id) ON DELETE CASCADE,
CONSTRAINT AlbumComments_FK_1 FOREIGN KEY (comment_id) REFERENCES Comments(id) ON DELETE CASCADE
);
CREATE INDEX AlbumComments_album_id_IDX ON AlbumComments (album_id);
CREATE INDEX AlbumComments_comment_id_IDX ON AlbumComments (comment_id);
```
# PlaylistComments # PlaylistComments
The PlaylistComments table will relate Comments to the Playlist they are about, if pertinent.
``` sql
CREATE TABLE PlaylistComments (
playlist_id TEXT(36),
comment_id TEXT(36),
CONSTRAINT PlaylistComments_PK PRIMARY KEY (playlist_id,comment_id),
CONSTRAINT PlaylistComments_FK FOREIGN KEY (playlist_id) REFERENCES Playlists(id) ON DELETE CASCADE,
CONSTRAINT PlaylistComments_FK_1 FOREIGN KEY (comment_id) REFERENCES Comments(id) ON DELETE CASCADE
);
CREATE INDEX PlaylistComments_playlist_id_IDX ON PlaylistComments (playlist_id);
CREATE INDEX PlaylistComments_comment_id_IDX ON PlaylistComments (comment_id);
```
# LabelImages
# ArtistImages
# TrackImages
# AlbumImages
# PlaylistImages
# LabelVideos
# ArtistVideos
# TrackVideos
# AlbumVideos
# ArtistContacts
# Articles
# ArticleTags
# ArticleImages
# ArticleVideos
# ArticleComments