Signed-off-by: Vishal Rana <vr@labstack.com>
4.0 KiB
+++ title = "Twitter Like API Example" description = "Twitter Like API example for Echo" [menu.main] name = "Twitter" parent = "recipes" weight = 2 +++
This recipe shows how to create a Twitter like REST API using MongoDB (Database), JWT (API security) and JSON (Data exchange).
Models
user.go
{{< embed "twitter/model/user.go" >}}
post.go
{{< embed "twitter/model/post.go" >}}
Handlers
handler.go
{{< embed "twitter/handler/handler.go" >}}
user.go
{{< embed "twitter/handler/user.go" >}}
post.go
{{< embed "twitter/handler/post.go" >}}
API
Signup
User signup
- Retrieve user credentials from the body and validate against database.
- For invalid email or password, send
400 - Bad Request
response. - For valid email and password, save user in database and send
201 - Created
response.
Request
curl \
-X POST \
http://localhost:1323/signup \
-H "Content-Type: application/json" \
-d '{"email":"jon@labstack.com","password":"shhh!"}'
Response
201 - Created
{
"id": "58465b4ea6fe886d3215c6df",
"email": "jon@labstack.com",
"password": "shhh!"
}
Login
User login
- Retrieve user credentials from the body and validate against database.
- For invalid credentials, send
401 - Unauthorized
response. - For valid credentials, send
200 - OK
response:- Generate JWT for the user and send it as response.
- Each subsequent request must include JWT in the
Authorization
header.
Method: POST
Path: /login
Request
curl \
-X POST \
http://localhost:1323/login \
-H "Content-Type: application/json" \
-d '{"email":"jon@labstack.com","password":"shhh!"}'
Response
200 - OK
{
"id": "58465b4ea6fe886d3215c6df",
"email": "jon@labstack.com",
"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 Request
response. - For valid token:
- If user is not found, send
404 - Not Found
response. - Add a follower to the specified user in the path parameter and send
200 - OK
response.
- 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 Request
response. - If user is not found, send
404 - Not Found
response. - Otherwise save post in the database and return it via
201 - Created
response.
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"
}
]