DATA MODELS =========== This document describes the key top-level entities this application will be working with and the attributes of each. This is a work-in-progress. Other top-level entities will be introduced to the application as necessary. Representations in this document are in application context; for database structure, see SCHEMA.md in this directory. # Person 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 { id: String, remote_id: String, name: String, } ``` # Tag 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 { id: String, name: String, } ``` # Label A Label represents a record label (a group of people who handle promotion and/or distribution for one or more Artists). ``` rust struct Label { id: String, name: String, description: String, website: String, artists: HashMap, tags: HashMap, comments: HashMap, } ``` # Artist An Artist represents a musical artist. ``` rust struct Artist { id: String, name: String, bio: String, website: String, tags: HashMap, comments: HashMap, } ``` # Track A Track represents a single piece of work by an Artist that is contained in an audio file. ``` rust struct Track { id: String, title: String, description: String, duration: chrono::Duration, artists: HashMap, created_by: String, created_at: chrono::DateTime, modified_by: String, modified_at: chrono::DateTime, deleted_by: Option, deleted_at: Option, tags: HashMap, comments: HashMap, lyrics: String, cover: String, images: HashMap, } ``` # Album An Album represents a work by an Artist that contains one or more Tracks. ``` rust struct Album { id: String, title: String, description: String, artists: HashMap, tracks: HashMap, created_by: String, created_at: chrono::DateTime, modified_by: String, modified_at: chrono::DateTime, deleted_by: Option, deleted_at: Option, tags: HashMap, comments: HashMap, cover: String, images: HashMap, } ``` # Playlist A Playlist represents an ordered collection of Tracks assembled by a Person. ``` rust struct Playlist { id: String, title: String, description: String, created_by: String, created_at: chrono::DateTime, modified_at: chrono::DateTime, deleted_at: Option is_public: bool, cover: String, tracks: HashMap, tags: HashMap, comments: HashMap, } ``` # Comment 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 { id: String, body: String, } ``` # Purchase A Purchase represents one or more Tracks or Albums that a Person purchases from an Artist or Label through the server. ``` rust struct Purchase { id: String, } ```