polygram-backend
                                
                                
                                
                                    polygram-backend copied to clipboard
                            
                            
                            
                        The REST API for Polygram
Polygram: Rest API
Official Rest api of Polygram
Setup
Requirements
Installation
Clone the repo locally then install all the dependencies using NPM
git clone https://github.com/aromalanil/polygram-backend.git
cd polygram-backend
npm install
Local Development
- Create a 
.envfile in the project root and add all the environment variables mentioned here - Execute the following command.
 
npm run dev
This will start a local server at http://localhost:5000
Production
- Create a 
.envfile in the project root and add all the envrionment variables mentioned here - Execute the following command.
 
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
{
    "email":"[email protected]",
    "first_name":"Aromal",
    "last_name":"Anil",
    "password":"Passw0rd1@3",
    "username":"aromalanil"
}
  EXAMPLE RESPONSE
{
  "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
{
  "username": "aromalanil",
  "otp": "060690"
}
 EXAMPLE RESPONSE
{
  "message": "Account verified & Logged In"
}
Login POST
/api/users/login
Use this route to make the user login.
▶️ Example
 EXAMPLE REQUEST BODY
{
  "username": "aromalanil",
  "password": "Passw0rd1@3"
}
 EXAMPLE RESPONSE
{
  "message": "Successfully Logged In"
}
Logout POST
/api/users/logout
Use this route to logout the user
▶️ Example
 EXAMPLE RESPONSE
{
  "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
{
  "email": "[email protected]"
}
 EXAMPLE RESPONSE
{
  "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
{
  "otp": "678668",
  "new_password": "1@qwerty",
  "username": "aromalanil"
}
 EXAMPLE RESPONSE
{
  "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
{
    "old_password":"1@qwerty",
    "new_password":"Passw0rd1@3"
}
 EXAMPLE RESPONSE
{
  "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
{
  "first_name": "Tony"
}
 EXAMPLE RESPONSE
{
  "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
{
  "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
{
  "token": "<TOKEN GENERATED BY GOOGLE CLIENT>"
}
Add Profile Picture POST
/api/users/profile_picture
Update the profile picture of the user
▶️ Example
 EXAMPLE REQUEST BODY
{
  "image": "<Image as Base64 encoded string>"
}
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
{
  "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
{
  "msg": "Question successfully created"
}
Find Questions GET
/api/questions
Get questions posted, by default the latest question comes first
▶️ Example
 EXAMPLE RESPONSE
{
  "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
{
  "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
{
  "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
{
  "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
'{
    "topics":["Cricket","Fiction"]
}'
 EXAMPLE RESPONSE
{
  "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
'{
    "topics":["Fiction"]
}'
 EXAMPLE RESPONSE
{
  "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
{
  "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
 '{
    "question_id":"6084282a8ab5f82bdb3bbb55",
    "content":"Sachin is the god of cricket",
    "option":"Sachin"
}'
 EXAMPLE RESPONSE
{
  "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
{
  "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
{
  "msg": "Downvote removed successfully",
  "data": {
    "downvote_count": 0
  }
}
Remove Upvote DEL
/api/opinions/60842a368ab5f82bdb3bbb56/upvote
Remove your upvote from an opinion
▶️ Example
 EXAMPLE RESPONSE
{
  "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 - see the LICENSE file for details.