---
# System prepended metadata

title: CHATTER BACKEND API

---

# CHATTER BACKEND API
## Table of Contents
[ToC]
## HOW TO RUN
### 1. Set up environment
- Add config.js file
- Run npm
``` 
npm install
```
### 2. Run server
```
nodemon server.js
```
### 3. Test APIs on Postman
- Import this json file to Postman: CHATTER.postman_collection.json
- Test API requests and responses as following 
### 4. Run unit test
- user-test.js
``` 
npm test -- test/user-test.js
```
- tweet-test.js
```
npm test -- test/user-test.js
```
- Auto run all unit tests
```
npm test
```
## APIs
### I. JWT Token Authentication
- middleware.js
- Check for token in request header 'Authorization' to verify valid login sesson of user before create, update, delete tweets.

### II. USER
####    [POST] /api/user/login
-Response:
``` 
{
    "status": 200,
    "message": "Successfully logged in!",
    "data": {
        "dataUser": {
            "id": string,
            "username": string
        },
        "token": string
    }
} 
```
### [POST] /api/user/register
```
{
    "status": 201,
    "message": "Register successful!",
    "data": {
        "user": {
            "id": string,
            "username": string
        }
    }
}
```

### III. TWEET
### 1. Create New Tweet
#### [POST] /api/tweet/create
- Request header: 'Authorization':'[token]'
- Request body:
    ```
    {
    "content":string,
    "userId":string 
    }
    ```
- Successful response:
    ```
    {
    "status": 200, 
    "message": "Success!",
    "newTweet": {
        "_id": string,
        "content": string,
        "created": Date.now(),
        "updated": Date.now(),
        "postedBy": userId,
        "__v": 0
    }
    ```
### 2. Read All Tweets
#### [GET] /api/tweet/readAll
- Request body:
    ```
   {
    "userId":string
    }
    ```
- Successful response:
    ```
   [ {
        "_id": string,
        "content": string,
        "created": Date.now(),
        "updated": Date.now(),
        "postedBy": userId,
        "__v": 0
    },
    {
        "_id": string,
        "content": string,
        "created": Date.now(),
        "updated": Date.now(),
        "postedBy": userId,
        "__v": 0
    },
    ...
    ]
    ```
### 3. Read a Tweet
#### [POST] /api/tweet/read/:tweet-id
- Successful response:
    ```
    {
        "_id": 'params.tweet-id',
        "content": string,
        "created": Date.now(),
        "updated": Date.now(),
        "postedBy": userId,
        "__v": 0
    }
### 4. Update Tweet
#### [PUT] /api/tweet/update/:tweet-id
- Request header: 'Authorization':'[token]'
- Request body:
    ```
    {
    "content":string,
    }
    ```
- Successful response:
    ```
    {
    "status": 200, 
    "message": "Success!",
    "newUpdatedTweet": {
        "_id": string,
        "content": string,
        "created": Date.now(),
        "updated": Date.now(),
        "postedBy": userId,
        "__v": 0
    }
    ```
### 5. Delete Tweet
#### [DELETE] /api/tweet/delete/:tweet-id
- Request header: 'Authorization':'[token]'
- Successful response:
    ```
    {
    "status": 200,
    "message": "Deleted tweet!"
    }
    ```

## UNIT TESTS
### 1. user-test.js
```
decribe('/POST Login', function(){...});
decribe('/POST Register', function(){...});
```

### 2. tweet-test.js

```
describe('/POST Create Tweet', function(){...});
describe('/GET Read all tweets of a user', function(){...});
describe('/GET Read a tweet', function() {...});
describe('/PUT Update Tweet', function() {...});
describe('/DELETE delete Tweet', function() {...});;

