README.md
[![Maintainability](https://api.codeclimate.com/v1/badges/9b3d0af20438824ee812/maintainability)](https://codeclimate.com/github/Lambda-School-Labs/signlingo-be/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/9b3d0af20438824ee812/test_coverage)](https://codeclimate.com/github/Lambda-School-Labs/signlingo-be/test_coverage)
# Sign Lingo
## Table of Contents
- **[Overview](#overview)**<br>
- **[API Endpoints](#api-endpoints)**<br>
- **[Credits](#credits)**<br>
## <a name='overview'></a>Overview
This database allows users to login, register, and participate in american sign language flashcard lessons, exercises, and quizzes. Currently the only levels available are for the alphabet. <br><br> **Note** <br>If you are going to change the database and push those changes to master, remember to run the following commands in the heroku console: <br> **knex migrate:rollback** <br> **knex migrate:latest** <br> **knex seed:run** <br> You need the seeds ran especially because we store level information here.
- Type **yarn install** to download all deps<br>
- Type **nodemon index.js** to continously run dev env server (you will need to have nodemon installed globally -> "**npm install -g nodemon**"), we were having problems running nodemon locally<br>
- Back end is deployed to production (even thought it says staging in the name) at [Heroku](https://signlingo-staging.herokuapp.com/) <br>
- Data Base Schema is here: [DB SCHEMA](https://dbdesigner.page.link/iEg1SoCNyGXD7KEt6)<br>
## API Endpoints
### Authentication
| Method | Endpoint | Body/Params (required) | Body (optional) | Notes |
| ------ | ------------ | ---------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------- |
| POST | /user/signup | okta access token | N/A | Finds user in database via okta_uid, or adds them to the database and initializes their levels. Returns the users okta_uid |
### Authentication Request and Response Body Examples
- **/user/signup** --- POST user request body example (okta access token)
```
{
"accessToken": {
"value": "eyJraWQiOiJsaThvR2dYNUNiTXQtcjdCb2ZvQkZUNEY2YlhXNUxyY1hkckRydFd2ME93IiwiYWxnIjoiUlMyNTYifQ.eyJ2ZXIiOjEsImp0aSI6IkFULlhyVzBOWGlTYXo3TkdFRkxYLWYtWFpJdThtUy0xUHJ3YkxZQVZkS0ctSUUiLCJpc3MiOiJodHRwczovL2Rldi0xMDcyODkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQiLCJhdWQiOiJhcGk6Ly9kZWZhdWx0IiwiaWF0IjoxNTkxOTgyODIxLCJleHAiOjE1OTE5ODY0MjEsImNpZCI6IjBvYWVudG92bUMyemtZeUZaNHg2IiwidWlkIjoiMDB1ZTc4ZWw0T2ZjNEg0N3A0eDYiLCJzY3AiOlsiZW1haWwiLCJwcm9maWxlIiwib3BlbmlkIl0sInN1YiI6ImphY2tzb24ub2dsZXMyOEBnbWFpbC5jb20ifQ.nPiPx5p80dFJpQGLLqGrvALS3qKefuta8wWYpjYBxA0bm_qLICgebJe2jgJxx90LcYMHM6UDvz6DFgBz6JXv38qchY-Mk-rraOAltwL9__o4sN1UU4IoB3_3a5xv5w-ffXqY87zypAXzejGZKHcy7CRurgkMM6J232XN08p8GktG3H1cUf23vJKFsnsPyU5kpEf9CJVwWgluA8ca3Nsuwovfg4cJq5U_FhYHt5OxOOAQe9pKPseKEnfOnMsldqRkcbSsNOony1IYbqzuZMcg40OMLDuifGFGs4AS9inW9Tr8DC6C-EcYJXmwtz6TQDOtMcysis9m4VA1xeCaGNw42g",
"accessToken": "eyJraWQiOiJsaThvR2dYNUNiTXQtcjdCb2ZvQkZUNEY2YlhXNUxyY1hkckRydFd2ME93IiwiYWxnIjoiUlMyNTYifQ.eyJ2ZXIiOjEsImp0aSI6IkFULlhyVzBOWGlTYXo3TkdFRkxYLWYtWFpJdThtUy0xUHJ3YkxZQVZkS0ctSUUiLCJpc3MiOiJodHRwczovL2Rldi0xMDcyODkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQiLCJhdWQiOiJhcGk6Ly9kZWZhdWx0IiwiaWF0IjoxNTkxOTgyODIxLCJleHAiOjE1OTE5ODY0MjEsImNpZCI6IjBvYWVudG92bUMyemtZeUZaNHg2IiwidWlkIjoiMDB1ZTc4ZWw0T2ZjNEg0N3A0eDYiLCJzY3AiOlsiZW1haWwiLCJwcm9maWxlIiwib3BlbmlkIl0sInN1YiI6ImphY2tzb24ub2dsZXMyOEBnbWFpbC5jb20ifQ.nPiPx5p80dFJpQGLLqGrvALS3qKefuta8wWYpjYBxA0bm_qLICgebJe2jgJxx90LcYMHM6UDvz6DFgBz6JXv38qchY-Mk-rraOAltwL9__o4sN1UU4IoB3_3a5xv5w-ffXqY87zypAXzejGZKHcy7CRurgkMM6J232XN08p8GktG3H1cUf23vJKFsnsPyU5kpEf9CJVwWgluA8ca3Nsuwovfg4cJq5U_FhYHt5OxOOAQe9pKPseKEnfOnMsldqRkcbSsNOony1IYbqzuZMcg40OMLDuifGFGs4AS9inW9Tr8DC6C-EcYJXmwtz6TQDOtMcysis9m4VA1xeCaGNw42g",
"expiresAt": 1591986423,
"tokenType": "Bearer",
"scopes": [
"openid",
"profile",
"email"
],
"authorizeUrl": "https://dev-107289.okta.com/oauth2/default/v1/authorize",
"userinfoUrl": "https://dev-107289.okta.com/oauth2/default/v1/userinfo"
}
}
```
- **/user/signup** --- POST user successful LOGIN response example
```
{
"foundUser": true,
"userFound": "Found the user already in users table",
"foundit": [
{
"id": 7,
"okta_uid": "00ue78el4Ofc4H47p4x6"
}
],
"okta_uid": "00ue78el4Ofc4H47p4x6"
}
```
### Levels
| Method | Endpoint | Body/Params (required) | Body (optional) | Notes |
| ------ | --------- | ---------------------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| GET | levels/ | N/A | N/A | Returns all the levels in the database. |
| GET | levels/:oktaUID | okta_uid in params | N/A | Returns all user_level table data for a particular user via okta_uid passed as param. |
| POST | levels/:oktaUID | array of level id's to add, okta_uid in params | N/A | Adds missing levels to user account informed by levels ids inside levels array, and the okta_uid passed as params, this endpoint will only be reached if an old user logs in and is missing newly added levels in database |
| PUT | levels/flashcard/:levelID | level_id in params, and okta_uid in req.body | N/A | Edits "completed_flashcards" field in the user_levels entry as specified by level_id and okta_uid |
| PUT | levels/exercise/:levelID | level_id in params, and okta_uid in req.body | N/A | Edits "completed_flashcards" field in the user_levels entry as specified by level_id and okta_uid |
| PUT | levels/quiz/:levelID | level_id in params, and okta_uid in req.body | N/A | Edits "completed_flashcards" field in the user_levels entry as specified by level_id and okta_uid |
### Levels Request and Response Body Examples
- **/levels** --- GET all levels in database -> successful response example
```
[
{
"id": 1,
"name": "ABCDE"
},
{
"id": 2,
"name": "FGHIJ"
},
{
"id": 3,
"name": "KLMNO"
},
{
"id": 4,
"name": "PQRST"
},
{
"id": 5,
"name": "UVWXYZ"
}
]
```
- **/levels/:oktaUID** --- GET all user levels for single user -> successful response example
```
[
{
"id": 4,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 1,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
{
"id": 5,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 2,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
{
"id": 6,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 5,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
{
"id": 7,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 3,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
{
"id": 8,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 4,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
}
]
```
- **/levels/:oktaUID** --- POST missing levels to user account (assuming these levels are new to database) -> Successful response body example
```
[
{
"id": 24,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 1,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
{
"id": 25,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 2,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
{
"id": 26,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 3,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
{
"id": 27,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 4,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
{
"id": 28,
"okta_uid": "00ue78el4Ofc4H47p4x6",
"level_id": 5,
"completed_flashcards": null,
"completed_exercises": null,
"completed_quiz": null
},
]
```
- **/flashcard/:levelID** --- PUT change completed_flashcard field to timestamp instead of null -> successful response example
```
1
```
- **/exercise/:levelID** --- PUT change completed_flashcard field to timestamp instead of null -> successful response example
```
1
```
- **/quiz/:levelID** --- PUT change completed_flashcard field to timestamp instead of null -> successful response example
```
1
```
### Flashcards
| Method | Endpoint | Body/Params (required) | Body (optional) | Notes |
| ------ | --------- | ---------------------- | --------------- | ------------------------------------------------------- |
| GET | /:levelID | level_id in params | N/A | Returns all the flashcards in the database by level_id. |
### Flashcards Request and Response Body Examples for level_id 1
- **/flashcards/:levelID** --- GET all flashcards in database -> successful response example
```
[
{
id: 1,
level_id: 1,
sign: "A",
visual: "https://i.postimg.cc/8CfWd09K/A-big.png",
},
{
id: 2,
level_id: 1,
sign: "B",
visual: "https://i.postimg.cc/x14Mz2xN/B-big.png",
},
{
id: 3,
level_id: 1,
sign: "C",
visual: "https://i.postimg.cc/MTkB9Y8W/C-big.png",
},
{
id: 4,
level_id: 1,
sign: "D",
visual: "https://i.postimg.cc/bJQtW2z1/D-big.png",
},
{
id: 5,
level_id: 1,
sign: "E",
visual: "https://i.postimg.cc/gjmZWkJQ/E-big.png",
},
]
```
## Credits
### Project Manager
[Michael Famurewa](https://github.com/viscountfam)
### Full Stack Devs
[Jackson Ogles](https://github.com/cjogles) <br>
[Natalia Beckstead](https://github.com/NataliaBeckstead) <br>
[Bryan Bilek](https://github.com/bryanbilek) <br>
[Krisda Luengthada](https://github.com/biskoi) <br>
## Environment Variables
ISSUER<br>
DB_ENV<br>
## Contributing
When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change.
Please note we have a [code of conduct](./code_of_conduct.md). Please follow it in all your interactions with the project.
### Issue/Bug Request
**If you are having an issue with the existing project code, please submit a bug report under the following guidelines:**
- As of 5-26-2020 all code is up to date and working 100%.
### Feature Requests
- Adding the ability to allow users to register/login via Google and Facebook.
- Updating schema, I have provided a video and db design in the Signlingo channel.
### Pull Requests
If you have developed a patch, bug fix, or new feature that would improve this app, please submit a pull request. It is best to communicate your ideas with the developers first before investing a great deal of time into a pull request to ensure that it will mesh smoothly with the project.
Remember that this project is licensed under the MIT license, and by submitting a pull request, you agree that your work will be, too.
#### Pull Request Guidelines
- Ensure any install or build dependencies are removed before the end of the layer when doing a build.
- Update the README.md with details of changes to the interface, including new plist variables, exposed ports, useful file locations and container parameters.
- Ensure that your code conforms to our existing code conventions and test coverage.
- Include the relevant issue number, if applicable.
- You may merge the Pull Request in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you.
### Attribution
These contribution guidelines have been adapted from [this good-Contributing.md-template](https://gist.github.com/PurpleBooth/b24679402957c63ec426).
## Documentation
See [Frontend Documentation](https://github.com/Lambda-School-Labs/signlingo-fe/blob/master/README.md) for details on the fronend of our project.