It's an API Skeleton project based on Echo framework. Our aim is reducing development time on default features that you can meet very often when your work on API. There is a useful set of tools that described below. Feel free to contribute!
- Registration
- Authentication with JWT
- CRUD API for posts
- Migrations
- Request validation
- Swagger docs
- Environment configuration
- Docker development environment
-
Copy .env.dist to .env and set the environment variables. There are examples for all the environment variables except COMPOSE_USER_ID, COMPOSE_GROUP_ID which are used by the linter. To get the current user ID, run in terminal:
echo $UID
In the .env file set these variables:
COMPOSE_USER_ID="username in current system"
- your username in systemCOMPOSE_GROUP_ID="user uid"
- the user ID which you got in the terminal -
Run your application using the command in the terminal:
docker-compose up
-
Browse to {HOST}:{PORT}/swagger/index.html. You will see Swagger 2.0 API documents.
-
Using the API documentation, make requests to register a user (if necessary) and login.
-
After the successful login, copy a token from the response, then click "Authorize" and in a popup that opened, enter the value for "apiKey" in a form: "Bearer {token}". For example:
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODk0NDA5NjYsIm9yaWdfaWF0IjoxNTg5NDM5OTY2LCJ1c2VyX2lkIjo1fQ.f8dSG3NxFLHwyA5-XIYALT5GtXm4eiH-motqtqAUBOI
Then, click "Authorize" and close the popup. Now, you are able to make requests which require authentication.
-
/cmd entry points.
-
/config has structures which contains service config.
-
/db has seeders and method for connecting to the database.
-
/deploy contains the container (Docker) package configuration and template(docker-compose) for project deployment.
-
/development includes Docker and docker-compose files for setup linter.
-
/migrations has files for run migrations.
-
/models includes structures describing data models.
-
/repositories contains methods for selecting entities from the database.
-
/requests has structures describing the parameters of incoming requests, and validator.
-
/responses includes structures describing the parameters of outgoing response.
-
/server is the main project folder. This folder contains the executable server.go.
-
/server/builders contains builders for initializing entities.
-
/server/handlers contains request handlers.
-
/server/routes has a file for configuring routes.
-
/services contains methods for creating entities.
-
/tests includes tests and test data.
For control code quality we are use golangci-lint. Golangci-lint is a linters aggregator.
Why we use linters? Linters help us:
- Finding critical bugs
- Finding bugs before they go live
- Finding performance errors
- To speed up the code review, because reviewers do not spend time searching for syntax errors and searching for violations of generally accepted code style
- The quality of the code is guaranteed at a fairly high level.
Linter tool wrapped to docker-compose and first of all need to build container with linters
make lint-build
Next you need to run linter to check bugs ant errors
make lint-check
- it will log to console what bugs and errors linters found
Finally, you need to fix all problems manually or using autofixing (if it's supported by the linter)
make lint-fix
Migrations - https://github.com/ShkrutDenis/go-migrations
Jwt - https://github.com/golang-jwt/jwt/v5
Swagger - https://github.com/swaggo/echo-swagger
Mocking db - https://github.com/selvatico/go-mocket
Orm - https://gorm.io/gorm
The project is developed by NIX and distributed under MIT LICENSE