---
# System prepended metadata

title: Bandmate

---

# 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|