# Bandmate
## Table of Contents
1. [Overview](#Overview)
1. [Product Spec](#Product-Spec)
1. [Wireframes](#Wireframes)
2. [Schema](#Schema)
## Overview
### Description
Bandmate is an iOS app intended to connect musicians from all expertise levels. Its intention is to match people with simmilar music interests so they can jam together.
### App Evaluation
- **Category:** Social Networking
- **Mobile:** It is more straight forward using a mobile app than using a website for this case.
- **Story:** Musicians are able to connect with eachother and potentially jam together after they match.
- **Market:** Musicians from all expertice levels. This includes beginners, intermediates and advanced musicians.
- **Habit:** This app is used to connect with other musicians. Could be used often if chatting with eachother.
- **Scope:**
## Product Spec
### 1. User Stories (Required and Optional)
**Required Must-have Stories**
- [x] User can see a stylized launch screen and icon.
- [x] User can login.
- [x] User can create a profile.
- [x] User can connect Spotify account.
- [x] User can match.
- [x] User can see matches.
- [x] User can accept or decline matches.
- [x] User can see bands they are currently on.
- [x] User can change their band's name
- [x] User can change profile picture.
- [x] User can chat with matched bandmates.
- [x] User can see previous chats.
**Optional Nice-to-have Stories**
- [x] User can like a message.
- [ ] User can see unread messages number.
- [x] User can see BandMates' profiles.
- [x] A user can see alerts for network error, database error, API error, etc.
- [ ] User can update settings (Email, password, etc)
### 2. Screen Archetypes
* Login Screen
* User can login.
* Register Screen
* User can create a profile.
* Matches Screen
* User can match.
* User can see matches.
* User can accept or decline matches.
* Your Bands Screen
* User can see bands they are currently on.
* User can chat with band members.
* User can see band members.
* User can see band members profiles.
* Profile Screen
* User can change profile picture.
* User can see name and username.
* User can see top artists.
* User can update settings (Email, password, Spotify Account)
### 3. Navigation
**Tab Navigation** (Tab to Screen)
* Match
* Your Bands
* Profile
**Flow Navigation** (Screen to Screen)
* Login
* If login tapped, jumps to home screen in match tab.
* If register tapped, jumps to register view.
* Match
* If no Spotify account linked jumps to Spotify's OAuth
* If match button tapped, and spotify account linked, displays matches.
* If match clicked, jumps to match details view.
* Your Band
* If cell tapped, goes to chat.
* If people icon tapped goes to band details.
* If user cell tapped, goes to a that user profile.
* If button clicked
* Toggles pop out to update something (Email, Password, Spotify Account)
## Wireframes
<img src="https://i.imgur.com/QAgK5gV.jpeg" width=600>
## Schema [TODO]
### Models
## Data Models
**User**
| Property | Type |Description |
| ----------- | ----------- | ----------- |
| objectId | String | Unique id for the user (default field)
| username | String | Unique username
| email | String | Unique email
| password | String | Password for authentication
| expertiseLevel | String | Beginner, intermidiate or advanced
| instrumentType | String | Instrument which user plays
| matches | Relation | Relation of matches a user has
| bands | Relation | Relation of bands a user is member of
| fav_artists | Array | Array of user's favorite artists
| profileImage | File | Contains user's profile image
| conversations | Relation | Conversations user is part of
**Match**
| Property | Type |Description |
| ----------- | ----------- | ----------- |
| objectId | String | Unique id for the user (default field)
| artistID | String | Artist which the match is based on
| users | Relation | Relation of users in which form the match
| hasSinger | BOOL | For knowing if a match has a singer
| hasDrummer | BOOL | For knowing if a match has a drummer
| hasGuitarist | BOOL | For knowing if a match has a guitarist
| hasBassist | BOOL | For knowing if a match has a bassist
| numberOfMembers | Number | Number of users in the match
| expertiseLevel | String | Level of experience the match has
**Artist**
| Property | Type | Description |
| ----------- | ----------- | ----------- |
| objectId | String | Unique id for conversation |
| createdAt | Date | Timestamp of creation |
| genres | Array | Array of genres |
| followers | Number | Followers in spotify |
| images | Array | Array of image urls |
**Conversation**
| Property | Type | Description |
| ----------- | ----------- | ----------- |
| objectId | String | Unique id for conversation |
| createdAt | Date | Timestamp of creation |
| match | Pointer to match | Match of conversation |
| participants | Relation to User | Users part of conversation |
**Message**
| Property | Type | Description |
| ----------- | ----------- | ----------- |
| objectId | String | Unique id for message |
| createdAt | DateTime | Timestamp for message |
| sender | Pointer to User | User who sent message |
| conversation | Pointer to Conversation | Conversation which is part of|
|content | String | Text message |
|likeCount | Number | Likes a message has |
| usersThatLiked | Array | Array of users' objectId that liked message|