updates models, makes them more accurate and rusty
This commit is contained in:
		
							
								
								
									
										182
									
								
								MODELS.md
									
									
									
									
									
								
							
							
						
						
									
										182
									
								
								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<String>,
 | 
			
		||||
    email: Option<Vec<String>>,
 | 
			
		||||
    is_active: bool,
 | 
			
		||||
    created_at: chrono::DateTime,
 | 
			
		||||
    modified_at: chrono::DateTime,
 | 
			
		||||
    modified_by: PersonId,
 | 
			
		||||
    deleted_at: Option<chrono::DateTime>,
 | 
			
		||||
    deleted_by: Option<PersonId>,
 | 
			
		||||
    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<Artist>,
 | 
			
		||||
    tags: HashMap<Tag>,
 | 
			
		||||
    comments: HashMap<Comment>,
 | 
			
		||||
    tags: Option<Vec<Tag>>,
 | 
			
		||||
    comments: Option<Vec<Comment>>,
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -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<Tag>,
 | 
			
		||||
    comments: HashMap<Comment>,
 | 
			
		||||
    tags: Option<Vec<Tag>>,
 | 
			
		||||
    comments: Option<Vec<Comment>>,
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -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<Artist>,
 | 
			
		||||
    created_by: String,
 | 
			
		||||
    is_public: bool,
 | 
			
		||||
    preview_source: Option<String>,
 | 
			
		||||
    source: String,
 | 
			
		||||
    price: Option<rusty_money::Money>,
 | 
			
		||||
    created_by: PersonId,
 | 
			
		||||
    created_at: chrono::DateTime,
 | 
			
		||||
    modified_by: String,
 | 
			
		||||
    modified_by: PersonId,
 | 
			
		||||
    modified_at: chrono::DateTime,
 | 
			
		||||
    deleted_by: Option<String>,
 | 
			
		||||
    deleted_by: Option<PersonId>,
 | 
			
		||||
    deleted_at: Option<chrono::DateTime>,
 | 
			
		||||
    tags: HashMap<Tag>,
 | 
			
		||||
    comments: HashMap<Comment>,
 | 
			
		||||
    lyrics: String,
 | 
			
		||||
    cover: String,
 | 
			
		||||
    images: HashMap<String>,
 | 
			
		||||
    tags: Option<Vec<Tag>>,
 | 
			
		||||
    comments: Option<Vec<Comment>>,
 | 
			
		||||
    lyrics: Option<String>,
 | 
			
		||||
    cover: Option<String>,
 | 
			
		||||
    images: Option<Vec<String>>,
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -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<Artist>,
 | 
			
		||||
    tracks: HashMap<Track>,
 | 
			
		||||
    created_by: String,
 | 
			
		||||
    is_public: bool,
 | 
			
		||||
    preview_source: Option<String>,
 | 
			
		||||
    source: String,
 | 
			
		||||
    price: Option<rusty_money::Money>,
 | 
			
		||||
    created_by: PersonId,
 | 
			
		||||
    created_at: chrono::DateTime,
 | 
			
		||||
    modified_by: String,
 | 
			
		||||
    modified_by: PersonId,
 | 
			
		||||
    modified_at: chrono::DateTime,
 | 
			
		||||
    deleted_by: Option<String>,
 | 
			
		||||
    deleted_by: Option<PersonId>,
 | 
			
		||||
    deleted_at: Option<chrono::DateTime>,
 | 
			
		||||
    tags: HashMap<Tag>,
 | 
			
		||||
    comments: HashMap<Comment>,
 | 
			
		||||
    cover: String,
 | 
			
		||||
    images: HashMap<String>,
 | 
			
		||||
    tags: Option<Vec<Tag>>,
 | 
			
		||||
    comments: Option<Vec<Comment>>,
 | 
			
		||||
    cover: Option<String>,
 | 
			
		||||
    images: Option<Vec<String>>,
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -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<chrono::DateTime>
 | 
			
		||||
    is_public: bool,
 | 
			
		||||
    cover: String,
 | 
			
		||||
    tracks: HashMap<Track>,
 | 
			
		||||
    tags: HashMap<Tag>,
 | 
			
		||||
    comments: HashMap<Comment>,
 | 
			
		||||
    cover: Option<String>,
 | 
			
		||||
    tracks: Vec<Track>,
 | 
			
		||||
    tags: Option<Vec<Tag>>,
 | 
			
		||||
    comments: Option<Vec<Comment>>,
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
# 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<String>,
 | 
			
		||||
    created_by: PersonId,
 | 
			
		||||
    created_at: chrono::DateTime,
 | 
			
		||||
    modified_at: chrono::DateTime,
 | 
			
		||||
    deleted_at: Option<chrono::DateTime>
 | 
			
		||||
    is_public: bool,
 | 
			
		||||
    cover: Option<String>,
 | 
			
		||||
    images: Option<Vec<String>>,
 | 
			
		||||
    tracks: Option<Vec<Track>>,
 | 
			
		||||
    tags: Option<Vec<Tag>>,
 | 
			
		||||
    comments: Option<Vec<Comment>>,
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@ -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<LabelId>,
 | 
			
		||||
    artist_id: Option<ArtistId>,
 | 
			
		||||
    album_id: Option<AlbumId>,
 | 
			
		||||
    track_id: Option<TrackId>,
 | 
			
		||||
    playlist_id: Option<PlaylistId>,
 | 
			
		||||
    comment_id: Option<CommentId>,
 | 
			
		||||
}
 | 
			
		||||
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<chrono::DateTime>
 | 
			
		||||
    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<AlbumId>,
 | 
			
		||||
    track_id: Option<TrackId>,
 | 
			
		||||
    collection_id: Option<CollectionId>,
 | 
			
		||||
    other_product_id: Option<OtherProductId>,
 | 
			
		||||
}
 | 
			
		||||
struct PurchaseItem {
 | 
			
		||||
    id: PurchaseItemId,
 | 
			
		||||
    type: PurchaseItemType,
 | 
			
		||||
    sku: SkuId,
 | 
			
		||||
    quantity: usize,
 | 
			
		||||
    discount_percentage: usize,
 | 
			
		||||
}
 | 
			
		||||
struct Purchase {
 | 
			
		||||
    id: String,
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user