Clean Architecture with Gin Web Framework
- Clean Architecture written in Go
- Application backbone with Gin Web Framework
- Dependency injection using uber-go/fx
- API endpoints documentation with Swagger-UI
- Uses fully featured GORM
Need Python3 to setup linter in git pre-commit hook.
make lint-setup- Setup environment variables
cp .env.example .env- Update your database credentials environment variables in
.envfile - Setup
serviceAccountKey.json. To get one create a firebase project. Go to Settings > Service Accounts and then click "Generate New Private Key". and then confirm by clicking "Generate Key". Copy the key toserviceAccountKey.jsonfile. You can see the example atserviceAccountKey.json.examplefile.
- Run
go run main.go app:serveto start the server. - There are other commands available as well. You can run
go run main.go -helpto know about other commands available.
Ensure Docker is already installed in the machine.
- Start server using command
docker-compose up -dorsudo docker-compose up -dif there are permission issues.
| Folder Path | Description |
|---|---|
/api |
contains all the middlwares, controllers and routes of the server in their respective folders |
/api-errors |
server error handlers |
/bootstrap |
contains modules required to start the application |
/console |
server commands, run go run main.go -help for all the available server commands |
/constants |
global application constants |
/docker |
docker files required for docker compose |
/docs |
API endpoints documentation using swagger |
/hooks |
git hooks |
/infrastructure |
third-party services connections like gmail, firebase, s3-bucket, ... |
/lib |
contains library code |
/migration |
database migration files |
/models |
ORM models |
/repository |
contains repository part of clean architecture. Mainly database queries are added here. |
/seeds |
seeds for already migrated tables |
/services |
service layers, contains the functionality that compounds the core of the application |
/tests |
includes application tests |
/utils |
global utility/helper functions |
.env.example |
sample environment variables |
dbconfig.yml |
database configuration file for sql-migrate command |
docker-compose.yml |
docker compose file for service application via Docker |
main.go |
entry-point of the server |
Makefile |
stores frequently used commands; can be invoked using make command |
serviceAccountKey.json.example |
sample credentials file for accessing Google Cloud |
⚓️ If you want to run the migration runner from the host environment instead of the docker environment; ensure that sql-migrate is installed on your local machine.
You can skip this step if
sql-migratehas already been installed on your local machine.
Note: Starting in Go 1.17, installing executables with go get is deprecated. go install may be used instead. Read more
go install github.com/rubenv/sql-migrate/...@latestIf you're using Go version below 1.18
go get -v github.com/rubenv/sql-migrate/...Add argument p=host after make command to run migration commands on local environment
Example:
make p=host migrate-upAvailable migration commands
| Command | Desc |
|---|---|
make migrate-status |
Show migration status |
make migrate-up |
Migrates the database to the most recent version available |
make migrate-down |
Undo a database migration |
make redo |
Reapply the last migration |
make create |
Create new migration file |
The framework comes with unit and integration testing support out of the box. You can check examples written in tests directory.
To run the test just run:
go test ./... -vgo test ./... -v -coverprofile cover.txt -coverpkg=./...
go tool cover -html=cover.txt -o index.htmlBrowse to http://localhost:${SWAGGER_PORT}
- You can see all the documented endpoints in Swagger-UI from the API specification
- You can execute/test endpoint. Read article
Steps to Update Dependencies
go get -u- Remove all the dependencies packages that has
// indirectfrom the modules go mod tidy
Discovering available updates
List all of the modules that are dependencies of your current module, along with the latest version available for each:
go list -m -u allDisplay the latest version available for a specific module:
go list -m -u example.com/theirmoduleExample:
go list -m -u cloud.google.com/go/firestore
cloud.google.com/go/firestore v1.2.0 [v1.6.1]Getting a specific dependency version
To get a specific numbered version, append the module path with an @ sign followed by the version you want:
go get example.com/theirmodule@v1.3.4To get the latest version, append the module path with @latest:
go get example.com/theirmodule@latestSynchronizing your code’s dependencies
go mod tidy