https://github.com/aromalanil/polygram-backend
The REST API for Polygram
https://github.com/aromalanil/polygram-backend
Last synced: 17 days ago
JSON representation
The REST API for Polygram
- Host: GitHub
- URL: https://github.com/aromalanil/polygram-backend
- Owner: aromalanil
- Created: 2021-04-01T12:48:39.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2023-02-18T12:01:13.000Z (over 2 years ago)
- Last Synced: 2025-03-31T13:27:42.801Z (about 2 months ago)
- Language: JavaScript
- Homepage: https://polygram.netlify.app
- Size: 142 KB
- Stars: 9
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Polygram: Rest API
Official Rest api of [Polygram](https://polygram.netlify.app)
## Setup
### Requirements
- [Node.js](https://nodejs.org/)
- [Git](https://git-scm.com/)### Installation
Clone the repo locally then install all the dependencies using [NPM](https://npmjs.org/)
```bash
git clone https://github.com/aromalanil/polygram-backend.git
cd polygram-backend
npm install
```### Local Development
1. Create a `.env` file in the project root and add all the environment variables mentioned [here](#environment-variables)
2. Execute the following command.```bash
npm run dev
```This will start a local server at [http://localhost:5000](http://localhost:5000)
### Production
1. Create a `.env` file in the project root and add all the envrionment variables mentioned [here](#environment-variables)
2. Execute the following command.```bash
npm start
```## Environment Variables
| Variable | Description |
| ---------------------------- | --------------------------------------------------------------------------------- |
| `PORT` | The port in which the server should run |
| `NODE_ENV` | `development` or `production` |
| `HOSTNAME` | The url to which the server is deployed |
| `GOOGLE_OAUTH_CLIENT_SECRET` | OAuth secret from Google |
| `JWT_SECRET` | A long random string, to sign the JWT |
| `GOOGLE_OAUTH_CLIENT_ID` | Client ID from Google |
| `ALLOWED_ORIGINS` | All origins to which CORS will be enabled. (Origins should be seperated by space) |
| `GOOGLE_REFRESH_TOKEN` | Refresh token from Google |
| `VAPID_PUBLIC_KEY` | Public key generated using `webpush` library |
| `VAPID_PRIVATE_KEY` | Private key generated using `webpush` library |
| `GOOGLE_REFRESH_TOKEN` | Refresh token from Google |
| `MASTER_PASSWORD` | Master password for adding topics |
| `DATABASE_URL` | Connection link for mongoDB |## Documentation
## User
- Every user related routes falls here
### Register `POST`
/api/users/register
Register a user to Poly by providing the necessary details. This route will send an OTP to the given email id, which can be used to verify the user
▶️ Example
#####EXAMPLE REQUEST BODY
```json
{
"email":"[email protected]",
"first_name":"Aromal",
"last_name":"Anil",
"password":"Passw0rd1@3",
"username":"aromalanil"
}
```
#####EXAMPLE RESPONSE
```json
{
"msg": "User created successfully"
}
```
### Verify `POST`
/api/users/verify
After the user registration is completed, use this route to verify the user. OTP send to the user must also be included in the request.▶️ Example
#####
EXAMPLE REQUEST BODY
```json
{
"username": "aromalanil",
"otp": "060690"
}
```#####
EXAMPLE RESPONSE
```json
{
"message": "Account verified & Logged In"
}
```### Login `POST`
/api/users/login
Use this route to make the user login.
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
{
"username": "aromalanil",
"password": "Passw0rd1@3"
}
```#####
EXAMPLE RESPONSE
```json
{
"message": "Successfully Logged In"
}
```### Logout `POST`
/api/users/logout
Use this route to logout the user
▶️ Example
#####
EXAMPLE RESPONSE
```json
{
"message": "Successfully Logged Out"
}
```### Send OTP `POST`
/api/users/send-otp
Verified users can use this send an OTP to their email. This OTP may be used for functions like change password etc
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
{
"email": "[email protected]"
}
```#####
EXAMPLE RESPONSE
```json
{
"message": "OTP send"
}
```### Forgot Password `POST`
/api/users/forgot-password
If you forgot your password, first generate an OTP (POST request to/users/send-otp). Then provide the new password along with the generated OTP to this route to change your password
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
{
"otp": "678668",
"new_password": "1@qwerty",
"username": "aromalanil"
}
```#####
EXAMPLE RESPONSE
```json
{
"message": "Password changed successfully"
}
```### Change Password `POST`
/api/users/change-password
Use this route to change your password. Provide your old password so that we can verify it's really you 😉
▶️ Example
#####EXAMPLE REQUEST BODY
```json
{
"old_password":"1@qwerty",
"new_password":"Passw0rd1@3"
}
```
#####EXAMPLE RESPONSE
```json
{
"message": "Password changed successfully"
}
```### Edit Details `POST`
/api/users/edit
Logged in user can use this route to change their details.
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
{
"first_name": "Tony"
}
```#####
EXAMPLE RESPONSE
```json
{
"msg": "User details updated successfully"
}
```### Find Single User `GET`
/api/users/aromalanil
Use this route to get details of a single user
▶️ Example
#####
EXAMPLE RESPONSE
```json
{
"msg": "User Found",
"data": {
"user": {
"_id": "608419f19c5d2720bc6118da",
"followed_topics": [],
"email": "[email protected]",
"username": "aromalanil",
"last_name": "Anil",
"first_name": "Aromal",
"profile_picture": "https://avatar.oxro.io/avatar.png?name=Aromal&background=2D2D2D&caps=3"
}
}
}
```### Google OAuth `POST`
/api/users/auth/google
Use this route to register you as a new user/ login if you are an existing user
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
{
"token": ""
}
```### Add Profile Picture `POST`
/api/users/profile_picture
Update the profile picture of the user
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
{
"image": ""
}
```## Question
Every question related routes falls here
### Create Question `POST`
/api/questions
Logged in user can use this route to create a new question.
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
{
"title": "Who is best? Sachin or Dhoni?",
"content": "Even though this may seem like a silly question for many, I'm just curious to find out",
"topics": ["Cricket", "Celebrity"],
"options": ["Sachin", "Dhoni"]
}
```#####
EXAMPLE RESPONSE
```json
{
"msg": "Question successfully created"
}
```### Find Questions `GET`
/api/questions
Get questions posted, by default the latest question comes first
▶️ Example
#####
EXAMPLE RESPONSE
```json
{
"msg": "Questions found",
"questions": [
{
"options": ["Sachin", "Dhoni"],
"opinions": [],
"topics": ["Cricket", "Celebrity"],
"_id": "6084240e4ec3ff27d2439a8e",
"title": "Who is best? Sachin or Dhoni?",
"author": "608419f19c5d2720bc6118da",
"content": "Even though this may seem like a silly question for many, I'm just curious to find out",
"created_at": "2021-04-24T13:58:38.152Z",
"__v": 0
}
]
}
```#### PARAMETERS
| Parameters | Description |
| ---------- | --------------------------------------------------------------------------------------------- |
| following | Set this to true to show questions from the topics you follow (Only valid for Logged in user) |
| topic | Get topics which falls under this topic |
| page_size | Limit the number of entries in a response |
| before_id | Show questions posted after the question with this id |
| after_id | Show questions posted before the question with this id |
| search | Only include questions having this keyword in it's title/content |### Find Single Question `GET`
/api/questions/6084240e4ec3ff27d2439a8e
Find details of a single question using question ID
- The result will also contain the percentages of each options based on the opinions received
▶️ Example
#####
EXAMPLE RESPONSE
```json
{
"msg": "Question Found",
"question": {
"_id": "6084240e4ec3ff27d2439a8e",
"options": [
{
"option": "Sachin",
"percentage": 0
},
{
"option": "Dhoni",
"percentage": 0
}
],
"opinions": [],
"topics": ["Cricket", "Celebrity"],
"title": "Who is best? Sachin or Dhoni?",
"author": "608419f19c5d2720bc6118da",
"content": "Even though this may seem like a silly question for many, I'm just curious to find out",
"created_at": "2021-04-24T13:58:38.152Z",
"__v": 0
}
}
```### Remove Question `DEL`
/api/questions/6084280a8ab5f82bdb3bbb54
The user can delete a question that they posted using this route
▶️ Example
#####
EXAMPLE RESPONSE
```json
{
"msg": "Question deleted successfully"
}
```## Topics
Every topic related routes falls here
### Get Topics `GET`
/api/topics
Get details of topics
▶️ Example
#### PARAMETERS
| Parameters | Description |
| ---------- | ----------------------------------------------------------------------------------- | --- |
| count | Set count to true to get the total number of questions posted under this topic | |
| search | Search for certain topics using search. Note: Search & count cannot be used at once | |#####
EXAMPLE RESPONSE
```json
{
"topics": [
{
"_id": "608420c9d8d31f24dba51d13",
"name": "Cricket"
},
{
"_id": "608420c9d8d31f24dba51d14",
"name": "Tech"
},
{
"_id": "608420c9d8d31f24dba51d15",
"name": "Art"
},
{
"_id": "608420c9d8d31f24dba51d16",
"name": "Fiction"
},
{
"_id": "608420c9d8d31f24dba51d17",
"name": "Celebrity"
}
]
}
```### Follow Topic `POST`
/api/topics/follow
Logged in user can use this route to follow a list of topics
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
'{
"topics":["Cricket","Fiction"]
}'
```#####
EXAMPLE RESPONSE
```json
{
"msg": "Updated followed topics successfully"
}
```### Unfollow Topic `POST`
/api/topics/unfollow
Logged in user can use this route to unfollow a list of topics
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
'{
"topics":["Fiction"]
}'
```#####
EXAMPLE RESPONSE
```json
{
"msg": "Updated followed topics successfully"
}
```### Get Single Topic `GET`
/api/topics/608420c9d8d31f24dba51d14
The above route is used to get information of a single topic
▶️ Example
#####
EXAMPLE RESPONSE
```javascript
{
"msg": "Topic Found",
"data": {
"topic": {
"_id": "608420c9d8d31f24dba51d14",
"name": "Tech",
"created_at": "2021-04-24T13:44:41.620Z"
}
}
}
```## Opinions
Every opinion related routes falls here
### Find Opinions `GET`
/api/opinions?question_id=607fbf0ca30d471a8e48b621
▶️ Example
#### PARAMETERS
| Parameters | Description |
| ----------- | ------------------------ |
| question_id | 607fbf0ca30d471a8e48b621 |### Create Opinion `POST`
/api/opinions/
Use this route to add your opinion to a question
▶️ Example
#####
EXAMPLE REQUEST BODY
```json
'{
"question_id":"6084282a8ab5f82bdb3bbb55",
"content":"Sachin is the god of cricket",
"option":"Sachin"
}'
```#####
EXAMPLE RESPONSE
```json
{
"msg": "Opinion created successfully",
"data": {
"opinion": {
"upvotes": ["608419f19c5d2720bc6118da"],
"downvotes": [],
"_id": "60842a368ab5f82bdb3bbb56",
"option": "Sachin",
"content": "Sachin is the god of cricket",
"question_id": "6084282a8ab5f82bdb3bbb55",
"author": "608419f19c5d2720bc6118da",
"created_at": "2021-04-24T14:24:54.539Z",
"__v": 0,
"upvote_count": 1,
"downvote_count": 0,
"id": "60842a368ab5f82bdb3bbb56"
}
}
}
```### Add Upvote `POST`
/api/opinions/60842a368ab5f82bdb3bbb56/upvote
Add upvote to an opinion
- This will remove your downvote to the opinion, if it exist
▶️ Example
#####
EXAMPLE RESPONSE
```json
{
"msg": "Upvote added successfully",
"data": {
"upvote_count": 1,
"downvote_count": 0
}
}
```### Add Downvote `POST`
/api/opinions/60842a368ab5f82bdb3bbb56/downvote
Add downvote to an opinion
- This will remove your upvote to the opinion, if it exist
### Remove Downvote `DEL`
/api/opinions/60842a368ab5f82bdb3bbb56/downvote
Remove your downvote from an opinion
▶️ Example
#####
EXAMPLE RESPONSE
```json
{
"msg": "Downvote removed successfully",
"data": {
"downvote_count": 0
}
}
```### Remove Upvote `DEL`
/api/opinions/60842a368ab5f82bdb3bbb56/upvote
Remove your upvote from an opinion
▶️ Example
#####
EXAMPLE RESPONSE
```json
{
"msg": "Upvote removed successfully",
"data": {
"upvote_count": 0
}
}
```## Pictures
Every picture related routes falls here
### Find Picture `GET`
/api/pictures/608428b8853d53307a7bc169
Get picture based on the id
## License
This project is licensed under [GNU GPL v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html) - see the [`LICENSE`](https://github.com/aromalanil/polygram-backend/blob/main/LICENSE) file for details.