Twitter Like API Recipe
This recipe demonstrates how to create a Twitter like REST API using MongoDB (Database), JWT (API security) and JSON (Data exchange).
Models
user.go
post.go
Handlers
handler.go
user.go
post.go
Server
server.go
API
Signup
User signup
- Retrieve user credentials from the body and validate against database.
- For invalid email or password, send 400 - Bad Requestresponse.
- For valid email and password, save user in database and send 201 - Createdresponse.
Request
curl \
  -X POST \
  http://localhost:1323/signup \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"shhh!"}'
Response
201 - Created
{
  "id": "58465b4ea6fe886d3215c6df",
  "email": "[email protected]",
  "password": "shhh!"
}
Login
User login
- Retrieve user credentials from the body and validate against database.
- For invalid credentials, send 401 - Unauthorizedresponse.
- For valid credentials, send 200 - OKresponse:- Generate JWT for the user and send it as response.
- Each subsequent request must include JWT in the Authorizationheader.
 
Method: POST
Path: /login
Request
curl \
  -X POST \
  http://localhost:1323/login \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"shhh!"}'
Response
200 - OK
{
  "id": "58465b4ea6fe886d3215c6df",
  "email": "[email protected]",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0ODEyNjUxMjgsImlkIjoiNTg0NjViNGVhNmZlODg2ZDMyMTVjNmRmIn0.1IsGGxko1qMCsKkJDQ1NfmrZ945XVC9uZpcvDnKwpL0"
}
Client should store the token, for browsers, you may use local storage.
Follow
Follow a user
- For invalid token, send 400 - Bad Requestresponse.
- For valid token:
- If user is not found, send 404 - Not Foundresponse.
- Add a follower to the specified user in the path parameter and send 200 - OKresponse.
 
- If user is not found, send 
Method: POST 
Path: /follow/:id
Request
curl \
  -X POST \
  http://localhost:1323/follow/58465b4ea6fe886d3215c6df \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0ODEyNjUxMjgsImlkIjoiNTg0NjViNGVhNmZlODg2ZDMyMTVjNmRmIn0.1IsGGxko1qMCsKkJDQ1NfmrZ945XVC9uZpcvDnKwpL0"
Response
200 - OK
Post
Post a message to specified user
- For invalid request payload, send 400 - Bad Requestresponse.
- If user is not found, send 404 - Not Foundresponse.
- Otherwise save post in the database and return it via 201 - Createdresponse.
Method: POST 
Path: /posts
Request
curl \
  -X POST \
  http://localhost:1323/posts \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0ODEyNjUxMjgsImlkIjoiNTg0NjViNGVhNmZlODg2ZDMyMTVjNmRmIn0.1IsGGxko1qMCsKkJDQ1NfmrZ945XVC9uZpcvDnKwpL0" \
  -H "Content-Type: application/json" \
  -d '{"to":"58465b4ea6fe886d3215c6df","message":"hello"}'
Response
201 - Created
{
  "id": "584661b9a6fe8871a3804cba",
  "to": "58465b4ea6fe886d3215c6df",
  "from": "58465b4ea6fe886d3215c6df",
  "message": "hello"
}
Feed
List most recent messages based on optional page and limit query parameters
Method: GET 
Path: /feed?page=1&limit=5
Request
curl \
  -X GET \
  http://localhost:1323/feed \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0ODEyNjUxMjgsImlkIjoiNTg0NjViNGVhNmZlODg2ZDMyMTVjNmRmIn0.1IsGGxko1qMCsKkJDQ1NfmrZ945XVC9uZpcvDnKwpL0"
Response
200 - OK
[
  {
    "id": "584661b9a6fe8871a3804cba",
    "to": "58465b4ea6fe886d3215c6df",
    "from": "58465b4ea6fe886d3215c6df",
    "message": "hello"
  }
]