---
# System prepended metadata

title: Chat App Documentation

---


 # Chat App Documentation
 ## Models
 ### 1. Users 
 ```javascript=1
 const UserSchema = new Schema({
    name: {
        type: String,
        required: true,
    },
    username: {
        type: String,
        required: true,
    },
    password: {
        type: String,
        required: true,
    },
   date: {
        type: String,
        default: Date.now,
    },
})
```
  ###  2. Messages
```javascript=19
 const MessageSchema = new Schema({
    body: {
        type: String,
        required: true,
    },
    media: {
        type: String,
    },
    date: {
        type: Date,
        default: Date.now(),
    },
   sender: {
       type: Schema.Types.ObjectId,
       ref: 'Users',
       required:true,
       
   },
   receiver: {
       type: Schema.Types.ObjectId,
       ref: 'Users',
       required:true,
       
   },
   type: {
       type: String,
       required: true,
   },
})
```

  ### 3. Chats
  ```javascript=48

const ChatSchema = new Schema({
users: [{type:Schema.Types.ObjectId, 
                   ref: 'Users' }]

messages: [{type:Schema.Types.ObjectId, 
                   ref: 'Messages' }]
})
```
 
 
 


    
## End points
### **1.Users**

#### 1.1
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /register | post | email, name, password |   jwt token |

<br/>


| Status Codes          | Message             |
| ----------------- |:----------------------- |
| 200          | Success |
| 400               | Email Already Exists
| 500               | Internal Server Error|
 :bulb: **what it does:** help register a new user by adding the details in the user table 


#### 1.2
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /login | post | email, password |   jwt token |

<br/>


| Status Codes | Message                     |
| ------------ |:--------------------------- |
| 200          | Success |
| 404          | Email Does not Exist        |
| 401             |Invalid Credentials       |
| 500               | Internal Server Error|

:bulb: **what it does:** helps login a registered user by matching the password
<br/>
### **2.Chats**

#### 2.1
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /chats| get | user id of logged in user |   list of conversations |

<br/>


| Status Codes | Message           |
| ------------ |:----------------- |
| 200          | Success |
| 401             |Authorization Error                   |
| 500               | Internal Server Error|


:bulb: **what it does:** Gets all the pre-existing chats of he user if there are any in chats database
<br/>
#### 2.2
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /chat| post | [users] |   chat-id|

<br/>


| Status Codes | Message           |
| ------------ |:----------------- |
| 200          | Success |
| 401              | Authorization Error                  |
| 500               | Internal Server Error|


:bulb: **what it does:** it will add a new chat into the existing chats of the user
<br/>

#### 2.3
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /message| post |MessageData,Sender_id,Chat_id,type |   string |

<br/>


| Status Codes | Message           |
| ------------ |:----------------- |
| 200          | Success | 
|401| Authorization Error 
| 500               | Internal Server Error|


:bulb: **what it does:** it will add a new transaction if the type is create,delete,edit with the data.
<br/>

#### 2.4
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /messages| get |Chat id,lastTransaction_id |  messages of a chat |

<br/>


| Status Codes | Message           |
| ------------ |:----------------- |
| 200          | Success  | 
|401| Authorization Error 
| 500               | Internal Server Error|


:bulb: **what it does:** it will get all the messages from the table if lastTransaction_id is null and if not then from (lastTransaction_id till the end) which will give me only newer  messages.
<br/>
<!-- #### 2.5
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /getNewMessages| get |Chat id,lastTransaction_id| all messages of a chat |

<br/>


| Status Codes | Message           |
| ------------ |:----------------- |
| 200          | Succes | 
|401| Authorization Error 
| 404          | Server Error      |


:bulb: **what it does:** it will get all the messages from the table starting from lastTransaction_id till the end which will give me only newer  messages.
<br/>
 -->
<!-- #### 2.5
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /message/edit| put |Message id | Edit a message |

<br/>


| Status Codes | Message           |
| ------------ |:----------------- |
| 200          | Succes | 
|401| Authorization Error 
| 404          | Server Error      |


:bulb: **what it does:** it will edit the body of the message in messages table
<br/> -->
<!-- 
#### 2.6
| Name      | Type |  Request              |   Response  |
| --------- |:---- | --- | ---             |
| /message/delete| delete |Message id | Delete a message |

<br/>


| Status Codes | Message           |
| ------------ |:----------------- |
| 200          | Succes | 
|401| Authorization Error 
| 404          | Server Error      |


:bulb: **what it does:** it will delete the message from the messages table
<br/> -->

## Socket.io events 

### 1) Create/Edit/Delete Message:
- If the user writes anything a component,in the listener of the component we need to emit a event from client to the server.
- in the on connect function whenever a client connects to the server push into a global array ,pair of [{user_name,socket.id}] and whenever the user disconnects pop that out.
- Event name and data(message_id,user_name,type) will be sent to the server where type is edit or delete or create message
- call post message route and make changes in chat route on the client side
- the server will catch the event and send that to receivers's socket id(extracted from that array of pairs).
- there will be listener to the event at the client side which will display the message on the front end and notify the user about it.


### 2) Typing:
- A typing event will be triggered when the user is typing in message box in the client side.Event name and the data(user_name) will be sent to the server.
- on the server side we will catch that event and it will be sent to the receiver's socket id.
- In front end listener, we will display the "user_name( extracted from the data) is typing" on the screen.


### 3) Message Delivered:
- Whenever the client is connected to the server and gets a message from the server , a event should be triggered which will take the data message_id and sender's user_name
- on the back end side it will emitt a message to the sender socket that message with message has been delivered to receiver.


### 3) Message Seen:
- whenever the client opens up any message a event should be triggered which takes the data message_id and sender'suser_name.
- on the server side it will emitt a message to the sender that message with message_id has been read by receiver.


### 4)Online:
- whenever the client connectes to the server it will trigger a event "online" to the server along with user_name of the client.
- on the server it will listen to the event and emit a message "user_name" is online to all the connected sockets
- and listener at the client side will show the message on the front end.

### 5)Last seen:
- whenever the client disconnects to the server,it should trigger a event along with the data user_name and the timeStamp from the client side.
- on the server it will listen and emit a message "user_name" Last seen at timeSTamp to all the connected sockets.
- and listener at the client side will show this on the interface.

 :bulb: **About the Edge Cases** :
 - Whenever user calls api getMessages,it will keep a react state lastTransaction_id which will be the index of the record which was the last fetched.
- If the internet goes away and there is a change in event,when the internet comes back,it will fetch only the newer messages.
- All the users are notifed when an older message is deleted.


### FLOW CHART
![](https://i.imgur.com/tHKAALR.png)

























