Add documentation and correct typo
This commit is contained in:
parent
31bbcb52c7
commit
0c70ee8771
282
README.md
282
README.md
@ -16,48 +16,268 @@ Sleep Tracker is intended for anyone interested in improving their sleep and hea
|
|||||||
- Make recommendations not only based on sleep time, but also on bed time (some reasearch will need to be done in that area)
|
- Make recommendations not only based on sleep time, but also on bed time (some reasearch will need to be done in that area)
|
||||||
- Connect to third party sleep tracking services
|
- Connect to third party sleep tracking services
|
||||||
|
|
||||||
## Database Schemas
|
## API Documentation
|
||||||
|
___
|
||||||
|
> Values required in **`bold`**.
|
||||||
|
|
||||||
### Users Schema `users`
|
> All requests need to provide with a JSON Web Token for authentication, except for **`/api/auth/register`** and **`/api/auth/login`**.
|
||||||
| field | data type | metadata |
|
|
||||||
| :--------| :--------------- | :-------------------------------------------------- |
|
|
||||||
| id | unsigned integer | primary key, auto-increments, generated by database |
|
|
||||||
| email | string | required |
|
|
||||||
| username | string | required |
|
|
||||||
| password | string | required |
|
|
||||||
|
|
||||||
### Sleep Sessions Schema `sessions`
|
### USERS SCHEMA | **`users`**
|
||||||
| field | data type | metadata |
|
| field | data type | metadata |
|
||||||
| :------------ | :--------------- | :-------------------------------------------------- |
|
| :--------| :---------------- | :-------------------------------------------------- |
|
||||||
| id | unsigned integer | primary key, auto-increments, generated by database |
|
| id | unsigned integer | primary key, auto-increments, generated by database |
|
||||||
| user_id | unsigned integer | foreign key referencing `users.id`, required |
|
| email | **`string`** | required |
|
||||||
| bed_time | unsigned integer | timestamp with date, required |
|
| username | **`string`** | required |
|
||||||
| wake_time | unsigned integer | timestamp with date, required |
|
| password | **`string`** | required |
|
||||||
|
|
||||||
|
#### Add a new user
|
||||||
|
**`POST /api/auth/register`**
|
||||||
|
|
||||||
|
##### Request
|
||||||
|
A json object with **`email`**, **`username`** and **`password`**.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"email": "gabe@ls.com",
|
||||||
|
"username": "gabe",
|
||||||
|
"password": "long-and-complicated-random-password"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
##### Response
|
||||||
|
A json object with the the newly created user with `id`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"email": "gabe@ls.com",
|
||||||
|
"username": "gabe"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Login with user/password
|
||||||
|
**`POST /api/auth/login`**
|
||||||
|
|
||||||
|
##### Request
|
||||||
|
A json object with **`username`** and **`password`**.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"username": "gabe",
|
||||||
|
"password": "long-and-complicated-random-password"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
##### Response
|
||||||
|
A json object with a `message` and a JSON Web `token`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"message": "Welcome gabe!",
|
||||||
|
"token": "JWT Token"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Fetch a user
|
||||||
|
**`GET /api/users/:id`**
|
||||||
|
> User **id** as params in the URL.
|
||||||
|
|
||||||
|
##### Response
|
||||||
|
A json object with the user `id`, `email` and `username`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"email": "gabe@ls.com",
|
||||||
|
"username": "gabe"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Update a user
|
||||||
|
**`PUT /api/users/:id`**
|
||||||
|
> User **id** as params in the URL.
|
||||||
|
|
||||||
|
##### Request
|
||||||
|
A json object with `email` and/or `username`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"email": "gabe@ls.com",
|
||||||
|
"username": "gabe"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Response
|
||||||
|
A json object with the updated user `id`, `email` and `username`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"email": "gabe@ls.com",
|
||||||
|
"username": "gabe"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### delete a user
|
||||||
|
**`DELETE /api/users/:id`**
|
||||||
|
> User **id** as params in the URL.
|
||||||
|
|
||||||
|
##### Response
|
||||||
|
A json object with a confirmation `message`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"message": 'The user was successfully deleted.'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
___
|
||||||
|
### SESSIONS SCHEMA | **`sessions`**
|
||||||
|
| field | data type | metadata |
|
||||||
|
| :-------------- | :--------------- | :-------------------------------------------------- |
|
||||||
|
| id | unsigned integer | primary key, auto-increments, generated by database |
|
||||||
|
| **`user_id`** | unsigned integer | foreign key referencing `users.id`, required |
|
||||||
|
| **`bed_time`** | unsigned integer | timestamp with date, required |
|
||||||
|
| **`wake_time`** | unsigned integer | timestamp with date, required |
|
||||||
| bed_tiredness | unsigned integer | |
|
| bed_tiredness | unsigned integer | |
|
||||||
| wake_mood | unsigned integer | |
|
| wake_mood | unsigned integer | |
|
||||||
| day_mood | unsigned integer | |
|
| day_mood | unsigned integer | |
|
||||||
|
|
||||||
### Average Mood per Sleep Session Schema `dailyAverages`
|
#### Fetch list of all sessions by user id
|
||||||
|
**`GET /api/users/:id/sessions`**
|
||||||
|
|
||||||
|
> User **id** as params in the URL.
|
||||||
|
|
||||||
|
##### Response
|
||||||
|
An array of json objects containing sessions related to the user with the provided `id`.
|
||||||
|
```
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"user_id": 1,
|
||||||
|
"bed_time": "2019-07-05 22:10:25",
|
||||||
|
"wake_time": "2019-07-06 07:10:25",
|
||||||
|
"wake_mood": 3,
|
||||||
|
"day_mood": 3,
|
||||||
|
"bed_tiredness": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"user_id": 1,
|
||||||
|
"bed_time": "2019-07-05 22:10:25",
|
||||||
|
"wake_time": "2019-07-06 07:10:25",
|
||||||
|
"wake_mood": 5,
|
||||||
|
"day_mood": 5,
|
||||||
|
"bed_tiredness": 5
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Add a session
|
||||||
|
**`POST /api/users/sessions`**
|
||||||
|
|
||||||
|
##### Request
|
||||||
|
A json object with **`user_id`**, **`bed_time`**, **`wake_time`** and optionnally `wake_mood`, `day_mood`, `bed_tiredness`.
|
||||||
|
|
||||||
|
> NB: **`wake_mood`**, **`day_mood`**, and **`bed_tiredness`** are required for calculating daily average mood and sleep duration, but can be added later by updating the session.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"user_id": 1,
|
||||||
|
"bed_time": "2019-07-05 22:10:25",
|
||||||
|
"wake_time": "2019-07-06 07:10:25",
|
||||||
|
"wake_mood": 3,
|
||||||
|
"day_mood": 3,
|
||||||
|
"bed_tiredness": 3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
##### Response
|
||||||
|
A json object with the newly created session.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"user_id": 1,
|
||||||
|
"bed_time": "2019-07-05 22:10:25",
|
||||||
|
"wake_time": "2019-07-06 07:10:25",
|
||||||
|
"wake_mood": 3,
|
||||||
|
"day_mood": 3,
|
||||||
|
"bed_tiredness": 3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Update a session by id
|
||||||
|
**`PUT /api/users/sessions/:id`**
|
||||||
|
|
||||||
|
> Session **id** as params in the URL.
|
||||||
|
|
||||||
|
##### Request
|
||||||
|
A json object with **`user_id`**, **`bed_time`**, **`wake_time`** and optionnally `wake_mood`, `day_mood`, `bed_tiredness`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"user_id": 1,
|
||||||
|
"bed_time": "2019-07-05 22:10:25",
|
||||||
|
"wake_time": "2019-07-06 07:10:25",
|
||||||
|
"wake_mood": 5,
|
||||||
|
"day_mood": 5,
|
||||||
|
"bed_tiredness": 5
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Response
|
||||||
|
A json object with the updated session with `id`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"user_id": 1,
|
||||||
|
"bed_time": "2019-07-05 22:10:25",
|
||||||
|
"wake_time": "2019-07-06 07:10:25",
|
||||||
|
"wake_mood": 5,
|
||||||
|
"day_mood": 5,
|
||||||
|
"bed_tiredness": 5
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Delete a session by id
|
||||||
|
**`DELETE /api/users/sessions/:id`**
|
||||||
|
|
||||||
|
> Session **id** as params in the URL.
|
||||||
|
|
||||||
|
##### Response
|
||||||
|
A json object with a confirmation `message`.
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"message": 'The session has been successfully deleted.'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
___
|
||||||
|
### DAILY AVERAGES SCHEMA | **`dailyAverages`**
|
||||||
| field | data type | metadata |
|
| field | data type | metadata |
|
||||||
| :------------- | :--------------- | :-------------------------------------------------- |
|
| :------------------- | :--------------- | :-------------------------------------------------- |
|
||||||
| id | unsigned integer | primary key, auto-increments, generated by database |
|
| id | unsigned integer | primary key, auto-increments, generated by database |
|
||||||
| session_id | unsigned integer | foreign key referencing `sessions.id` |
|
| **`session_id`** | unsigned integer | foreign key referencing `sessions.id`, required |
|
||||||
| user_id | unsigned integer | foreign key referencing `users.id` |
|
| **`user_id`** | unsigned integer | foreign key referencing `users.id`, required |
|
||||||
| sleep_duration | unsigned integer | |
|
| **`sleep_duration`** | unsigned integer | required |
|
||||||
| average_mood | float | |
|
| **`average_mood`** | float | required |
|
||||||
|
|
||||||
## API Endpoints
|
> Daily averages are automatically created by the backend server when all values of a session are filled in.
|
||||||
|
|
||||||
- `POST /api/auth/register` - add a new user
|
#### Fetch a list of last 30 (if possible) daily averages by user id
|
||||||
- `POST /api/auth/login` - login with user/password
|
**`GET /api/users/:id/averages`**
|
||||||
|
|
||||||
- `GET /api/users/:id` - fetch a user
|
> User **id** as params in the URL.
|
||||||
- `PUT /api/users/:id` - update a user
|
|
||||||
- `DELETE /api/users/:id` - delete a user
|
|
||||||
|
|
||||||
- `GET /api/users/:id/sessions` - fetch list of all sessions by user id
|
##### Response
|
||||||
- `POST /api/users/sessions` - add a session
|
An array of json objects containing sessions related to the user with the provided `id`.
|
||||||
- `PUT /api/users/sessions/:id` - update a session by id
|
```
|
||||||
- `DELETE /api/users/sessions/:id` - delete a session by id
|
[
|
||||||
|
{
|
||||||
- `GET /api/users/:id/averages` - fetch a list of last 30 daily averages by user id
|
"id": 1,
|
||||||
|
"session_id": 18,
|
||||||
|
"user_id": 1,
|
||||||
|
"sleep_duration": 8.58,
|
||||||
|
"average_mood": 2.67
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
Binary file not shown.
@ -5,6 +5,6 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getDailyAverages(id) {
|
function getDailyAverages(id) {
|
||||||
return db('sessions')
|
return db('dailyAverages')
|
||||||
.where({ id });
|
.where({ id });
|
||||||
}
|
}
|
@ -27,7 +27,7 @@ router.put('/sessions/:id', async (req, res) => {
|
|||||||
if (session) {
|
if (session) {
|
||||||
res.status(200).json(session);
|
res.status(200).json(session);
|
||||||
} else {
|
} else {
|
||||||
res.status(404).json({ message: 'The session could not be found' });
|
res.status(404).json({ message: 'The session could not be found.' });
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
@ -37,7 +37,7 @@ router.put('/sessions/:id', async (req, res) => {
|
|||||||
|
|
||||||
router.delete("/sessions/:id", async (req, res) => {
|
router.delete("/sessions/:id", async (req, res) => {
|
||||||
Sessions.removeSession(req.params.id)
|
Sessions.removeSession(req.params.id)
|
||||||
.then(() => res.status(200).json({ message: 'The session has been successfully deleted' }))
|
.then(() => res.status(200).json({ message: 'The session has been successfully deleted.' }))
|
||||||
.catch(err => res.json(err));
|
.catch(err => res.json(err));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -19,12 +19,12 @@ router.put('/:id', async (req, res) => {
|
|||||||
res.status(404).json({ message: 'The user could not be found' });
|
res.status(404).json({ message: 'The user could not be found' });
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(err => res.status(500).json({ message: 'Error updating the user' }));
|
.catch(() => res.status(500).json({ message: 'Error updating the user' }));
|
||||||
});
|
});
|
||||||
|
|
||||||
router.delete("/:id", (req, res) => {
|
router.delete("/:id", (req, res) => {
|
||||||
Users.removeUser(req.params.id)
|
Users.removeUser(req.params.id)
|
||||||
.then(data => res.status(200).json(data))
|
.then(() => res.status(200).json({ message: 'The user was successfully deleted.'}))
|
||||||
.catch(err => res.json(err));
|
.catch(err => res.json(err));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user