diff --git a/MODELS.md b/MODELS.md index 95d32d2..eed6f0e 100644 --- a/MODELS.md +++ b/MODELS.md @@ -12,10 +12,22 @@ Representations in this document are in application context; for database struct A Person represents a person! Specifically, a Person is a person who is using/has used the web application. Many applications call this entity a "User". We call them a Person. ``` rust -struct Person { +struct PersonId { id: String, +} +struct Person { + id: PersonId, remote_id: String, name: String, + handle: Option, + email: Option>, + is_active: bool, + created_at: chrono::DateTime, + modified_at: chrono::DateTime, + modified_by: PersonId, + deleted_at: Option, + deleted_by: Option, + last_seen: chrono::DateTime, } ``` @@ -24,8 +36,12 @@ struct Person { A Tag is a classification label that a Person wants to associate to a Label, an Artist, an Album, a Track, or a Playlist, used as a way of grouping entities together via some commonality the context of which is not programmatically relevant. ``` rust -struct Tag { +struct TagId { + host: String, id: String, +} +struct Tag { + id: TagId, name: String, } ``` @@ -35,14 +51,17 @@ struct Tag { A Label represents a record label (a group of people who handle promotion and/or distribution for one or more Artists). ``` rust -struct Label { +struct LabelId { id: String, +} +struct Label { + id: LabelId, name: String, description: String, website: String, artists: HashMap, - tags: HashMap, - comments: HashMap, + tags: Option>, + comments: Option>, } ``` @@ -51,13 +70,16 @@ struct Label { An Artist represents a musical artist. ``` rust -struct Artist { +struct ArtistId { id: String, +} +struct Artist { + id: ArtistId, name: String, bio: String, website: String, - tags: HashMap, - comments: HashMap, + tags: Option>, + comments: Option>, } ``` @@ -66,23 +88,30 @@ struct Artist { A Track represents a single piece of work by an Artist that is contained in an audio file. ``` rust -struct Track { +struct TrackId { id: String, +} +struct Track { + id: TrackId, title: String, description: String, duration: chrono::Duration, artists: HashMap, - created_by: String, + is_public: bool, + preview_source: Option, + source: String, + price: Option, + created_by: PersonId, created_at: chrono::DateTime, - modified_by: String, + modified_by: PersonId, modified_at: chrono::DateTime, - deleted_by: Option, + deleted_by: Option, deleted_at: Option, - tags: HashMap, - comments: HashMap, - lyrics: String, - cover: String, - images: HashMap, + tags: Option>, + comments: Option>, + lyrics: Option, + cover: Option, + images: Option>, } ``` @@ -91,22 +120,29 @@ struct Track { An Album represents a work by an Artist that contains one or more Tracks. ``` rust -struct Album { +struct AlbumId { id: String, +} +struct Album { + id: AlbumId, title: String, description: String, artists: HashMap, tracks: HashMap, - created_by: String, + is_public: bool, + preview_source: Option, + source: String, + price: Option, + created_by: PersonId, created_at: chrono::DateTime, - modified_by: String, + modified_by: PersonId, modified_at: chrono::DateTime, - deleted_by: Option, + deleted_by: Option, deleted_at: Option, - tags: HashMap, - comments: HashMap, - cover: String, - images: HashMap, + tags: Option>, + comments: Option>, + cover: Option, + images: Option>, } ``` @@ -115,8 +151,11 @@ struct Album { A Playlist represents an ordered collection of Tracks assembled by a Person. ``` rust -struct Playlist { +struct PlaylistId { id: String, +} +struct Playlist { + id: PlaylistId, title: String, description: String, created_by: String, @@ -124,10 +163,36 @@ struct Playlist { modified_at: chrono::DateTime, deleted_at: Option is_public: bool, - cover: String, - tracks: HashMap, - tags: HashMap, - comments: HashMap, + cover: Option, + tracks: Vec, + tags: Option>, + comments: Option>, +} +``` + +# Article + +An Article represents a "blog post" style article written by a Person. + +``` rust +struct ArticleId { + id: String, +} +struct Article { + id: ArticleId, + title: String, + body: String, + description: Option, + created_by: PersonId, + created_at: chrono::DateTime, + modified_at: chrono::DateTime, + deleted_at: Option + is_public: bool, + cover: Option, + images: Option>, + tracks: Option>, + tags: Option>, + comments: Option>, } ``` @@ -136,9 +201,35 @@ struct Playlist { A Comment represents a textual comment that a Person wants to attach contextually to an Artist, an Album, a Track, or a Playlist. ``` rust -struct Comment { +enum CommentTargetType { + Label, + Artist, + Album, + Track, + Playlist, + Comment, +} +struct CommentTargetId { + label_id: Option, + artist_id: Option, + album_id: Option, + track_id: Option, + playlist_id: Option, + comment_id: Option, +} +struct CommentId { id: String, +} +struct Comment { + id: CommentId, body: String, + target_type: CommentTargetType, + target_id: CommentTargetId, + created_by: PersonId, + created_at: chrono::DateTime, + modified_at: chrono::DateTime, + deleted_at: Option + is_public: bool, } ``` @@ -147,7 +238,34 @@ struct Comment { A Purchase represents one or more Tracks or Albums that a Person purchases from an Artist or Label through the server. ``` rust -struct Purchase { +enum PurchaseItemType { + Album, + Track, + Collection, + OtherProduct, +} +struct PurchaseItemId { id: String, } +struct SkuId { + id: String, +} +struct Sku { + id: SkuId, + album_id: Option, + track_id: Option, + collection_id: Option, + other_product_id: Option, +} +struct PurchaseItem { + id: PurchaseItemId, + type: PurchaseItemType, + sku: SkuId, + quantity: usize, + discount_percentage: usize, +} +struct Purchase { + id: String, + +} ```