# M3 - README Example (BCN/Uros)
<br>
# Quick Compo
<br>
## Description
This is an app to manage unofficial tournaments within communities. The app helps to organize, manage and track competitions.
## User Stories
- **404:** As a user I get to see a 404 page with a feedback message if I try to reach a page that does not exist so that I know it's my fault.
- **Signup:** As an anonymous user I can sign up on the platform so that I can start creating and managing tournaments.
- **Login:** As a user I can login to the platform so that I can access my profile and start creating and managing tournaments.
- **Logout:** As a logged in user I can logout from the platform so no one else can use it.
- **Profile Page**: As a logged in user I can visit my profile page so that I can access the edit page and see the list of tournaments I have created.
- **Add Tournaments:** As a logged in user I can access the add tournament page so that I can create a new tournament.
- **Edit Tournaments:** As a logged in user I can access the edit tournament page so that I can edit the tournament I created.
- **Add Players:** As a user I can add players to a tournament.
- **View Tournament Table:** As a user I want to see the tournament details, players list and the time table.
- **View Ranks:** As a user I can see the rankings list for the tournament.
## Backlog
- Add weather widget
- lottie interactions
- users can bet
- add geolocation to events when creating
<br>
# Client / Frontend
## React Router Routes (React App)
| Path | Component | Permissions | Behavior |
| ---------------------------- | -------------------- | -------------------------- | --------------------------------------------------------- |
| `/login` | LoginPage | anon only `<AnonRoute>` | Login form, navigates to home page after login. |
| `/signup` | SignupPage | anon only `<AnonRoute>` | Signup form, navigates to home page after signup. |
| `/` | HomePage | public `<Route>` | Home page. |
| `/user-profile` | ProfilePage | user only `<PrivateRoute>` | User and player profile for the current user. |
| `/user-profile/edit` | EditProfilePage | user only `<PrivateRoute>` | Edit user profile form. |
| `/tournaments/add` | CreateTournamentPage | user only `<PrivateRoute>` | Create new tournament form. |
| `/tournaments` | TournamentListPage | user only `<PrivateRoute>` | Tournaments list. |
| `/tournaments/:tournamentId` | TournamentDetailPage | user only `<PrivateRoute>` | Tournament details. Shows players list and other details. |
| `/tournament/players/:id` | PlayerDetailsPage | user only `<PrivateRoute>` | Single player details. |
| `/rankings/:tournamentId` | RankingsPage | user only `<PrivateRoute>` | Tournament rankings list. |
## Components
Pages:
- LoginPage
- SignupPage
- HomePage
- ProfilePage
- EditProfilePage
- CreateTournamentPage
- TournamentListPage
- TournamentDetailsPage
- PlayerDetailsPage
- RankingsPage
Components:
- PlayerCard
- TournamentCard
- Navbar
## Services
- **Auth Service**
- `authService` :
- `.login(user)`
- `.signup(user)`
- `.logout()`
- `.validate()`
- **User Service**
- `userService` :
- `.updateCurrentUser(id, userData)`
- `.getCurrentUser()`
- **Tournament Service**
- `tournamentService` :
- `.addTournament(tournamentData)`
- `.getTournaments()`
- `.getOneTournament(id)`
- `.deleteTournament(id)`
- **Player Service**
- `playerService` :
- `.createPlayer(id)`
- `.getPlayerDetails(id)`
<br>
# Server / Backend
## Models
**User model**
```javascript
{
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
playerProfile: { type: Schema.Types.ObjectId, ref:'Player' },
createdTournaments: [ { type: Schema.Types.ObjectId, ref:'Tournament' } ]
}
```
**Tournament model**
```javascript
{
name: { type: String, required: true },
img: { type: String },
players: [ { type: Schema.Types.ObjectId, ref:'Player' } ],
games: [],
rankings: []
}
```
**Player model**
```javascript
{
firstName: { type: String, required: true },
lastName: { type: String, required: true },
profileImage: { type: String },
scores: []
}
```
<br>
## API Endpoints (backend routes)
| HTTP Method | URL | Request Body | Success status | Error Status | Description |
| ----------- | ---------------------- | ---------------------------- | -------------- | ------------ | ------------------------------------------------------------ |
| GET | `/auth/profile ` | Saved session | 200 | 404 | Check if user is logged in and return profile page |
| POST | `/auth/signup` | {name, email, password} | 201 | 404 | Checks if fields not empty (422) and user not exists (409), then create user with encrypted password, and store user in session |
| POST | `/auth/login` | {username, password} | 200 | 401 | Checks if fields not empty (422), if user exists (404), and if password matches (404), then stores user in session |
| POST | `/auth/logout` | | 204 | 400 | Logs out the user |
| GET | `/api/tournaments` | | | 400 | Show all tournaments |
| GET | `/api/tournaments/:id` | | | | Show specific tournament |
| POST | `/api/tournaments` | { name, img, players } | 201 | 400 | Create and save a new tournament |
| PUT | `/api/tournaments/:id` | { name, img, players } | 200 | 400 | edit tournament |
| DELETE | `/api/tournaments/:id` | | 201 | 400 | delete tournament |
| GET | `/api/players/:id` | | | | show specific player |
| POST | `/api/players` | { name, img, tournamentId } | 200 | 404 | add player |
| PUT | `/api/players/:id` | { name, img } | 201 | 400 | edit player |
| DELETE | `/api/players/:id` | | 200 | 400 | delete player |
| GET | `/api/games` | | 201 | 400 | show games |
| GET | `/api/games/:id` | | | | show specific game |
| POST | `/api/games` | {player1,player2,winner,img} | | | add game |
| PUT | `/api/games/:id` | {winner,score} | | | edit game |
<br>
## Links
### Trello/Kanban
[Link to your trello board](https://trello.com/b/PBqtkUFX/curasan) or a picture of your physical board
### Git
The url to your repository and to your deployed project
[Client repository Link](https://github.com/screeeen/project-client)
[Server repository Link](https://github.com/screeeen/project-server)
[Deployed App Link](http://heroku.com)
### Slides
[Slides Link](http://slides.com) - The url to your *public* presentation slides