The frontend app for this project is made with Vue.js and is open source
This repository holds the files for the REST API of https://golang.zone
You need to make a config file in the config directory - below is an example of what it could look like. You can also directly use the example file in the config directory just remember to remove the .example extension
{
"env": "local",
"mysql": {
"host": "app_mysql",
"username": "root",
"password": "password",
"database": "app",
"encoding": "utf8mb4",
"port": "3306"
},
"redis": {
"host": "app_redis",
"port": 6379
},
"jwt": {
"secret": "secret",
"public_key_path": "config/api.rsa.pub",
"private_key_path": "config/api.rsa"
},
"port": 8080
}
Generate private key
- openssl genrsa -out api.rsa keysize(2048 or 4096)
Generate public key
- openssl rsa -in api.rsa -pubout > api.rsa.pub
- Go 1.7+
- Mysql
- Redis (To revoke JWTs)
Users:
URL | Method | Info |
---|---|---|
http://127.0.0.1:8080/api/v1/users | GET | Returns an array of users |
http://127.0.0.1:8080/api/v1/users | POST | Endpoint to create a user |
http://127.0.0.1:8080/api/v1/users/{id} | GET | Returns a single user specificed by a id |
http://127.0.0.1:8080/api/v1/users/{id}/posts | GET | Returns an array of posts created by an user |
Posts:
URL | Method | Info |
---|---|---|
http://127.0.0.1:8080/api/v1/posts | GET | Returns an array of posts |
http://127.0.0.1:8080/api/v1/posts | POST | Endpoint to create a post - proctected by a auth middleware that requires the user to be authenticated and be an admin |
http://127.0.0.1:8080/api/v1/images/upload | POST | Endpoint to upload images to a post using a wysiwyg editor - proctected by a auth middleware that require the user to be authenticated and be an admin |
http://127.0.0.1:8080/api/v1/posts/{id} | GET | Endpoint to retrieve a post specified by an id |
http://127.0.0.1:8080/api/v1/posts/{slug} | GET | Endpoint to retrieve a post specified by a slug |
http://127.0.0.1:8080/api/v1/posts/{id} | PUT | Endpoint to update a specific post - proctected by a auth middleware that requires the user to be authenticated and be an admin |
Auth:
URL | Method | Info |
---|---|---|
http://127.0.0.1:8080/api/v1/auth/login | POST | Endpoint to authenticate a user- returns a JWT that last for 24 hours |
http://127.0.0.1:8080/api/v1/auth/update | PUT | Endpoint to update the current user that is logged in - proctected by a auth middleware |
http://127.0.0.1:8080/api/v1/auth/refresh | GET | Endpoint to refresh a JWT - proctected by a auth middleware |
http://127.0.0.1:8080/api/v1/auth/logout | GET | Logout the user from the API by revoking the user's JWT - proctected by a auth middleware |
http://127.0.0.1:8080/api/v1/auth/logout/all | GET | Logout the user from all the places that he/she is logged in - proctected by a auth middleware |
Misc:
URL | Method | Info |
---|---|---|
http://127.0.0.1:8080 | GET | A test endpoint to see the API is working (hello world) |
http://127.0.0.1:8080/api/v1/protected | GET | A test endpoint to see the id of the user that is logged in - proctected by a auth middleware |
Mac users only
Open the file with Paw then set the environment in the upper left corner
- Import the golang.zone.postman_collection.json in Postman
- Setup your environments by clicking the 🔩 icon just next to the 👁️ icon top in the top right corner
- You can also import the environments created by me, golang.zone.Local.postman_environment.json, golang.zone.Prod.postman_environment.json continue at step 8.
- I suggest creating 2 envs on called golang.zone Local and one called golang.zone Prod
- Create 3 keys BASE_URL, ACCESS_TOKEN and REFRESH_TOKEN
- Set the value of BASE_URL to http://localhost:8080 for the local env and https://golang.zone for the Prod env, leave the tokens value empty for now
- Click Add/Update.
- Go to the Login request and open up the Tests tab.
- Insert the code below then save and finally click send.
var jsonData = JSON.parse(responseBody);
postman.setEnvironmentVariable("ACCESS_TOKEN", jsonData.data.tokens.accessToken);
postman.setEnvironmentVariable("REFRESH_TOKEN", jsonData.data.tokens.refreshToken);
- Now when you call endpoints that require authorization it will automatically insert the token value inside the Authorization header
Run the following commands only before boostrapping the application.
# Migrate database
docker-compose run --rm --name app -p 8080:8080 app_api bash
# Inside the app container
# TODO: Clean up the migration
goose -dir ./db/migrations/ mysql "app:password@(app_mysql:3306)/app" up
Development - Since linking the local folder to container we can edit code and run container.
docker-compose up
- Add categories for posts
- Add tags for posts
- Add featured image for posts