Skip to content

zubroide/go-api-boilerplate

Repository files navigation

Go API Boilerplate

Features

  • Framework for API: Gin
  • Package manager: go mod
  • DI: Based on service container
  • Layers: Controller->Service->Repository->Entity
  • Routes: Gin
  • Process controller results and convert them into JSON/XML according to request headers
  • Logger: logrus
  • Environment variables, config: Viper
  • ORM: GORM
  • Migrations: gorm-goose
  • Base CRUD service
  • Base CRUD repository
  • Base CRUD controller
  • Request validation (Gin)
  • Console commands: Cobra
  • Unit tests with overriding of services in DI (go test)
  • Code coverage by tests (go tool cover)
  • Logger integration with Sentry: logrus_sentry
  • Setup alerting for unhandled errors
  • Swagger
  • Docker compose

Folders structure

  • command/: Console commands.
  • controller/: Controllers for web requests processing.
  • db/: Migrations.
  • dic/: Dependency Injection Container.
  • doc/: Swagger documentation.
  • docker/: Docker containers description.
  • install/: Scripts for environment preparing.
  • logger/: Logger and client for Sentry.
  • model/: Business logic.
  • model/db/: DB connection.
  • model/entity/: GORM entities.
  • model/repository/: Repositories for access to storage.
  • model/service/: Business logic.
  • route/: Web requests routes.
  • test/: Unit tests.
  • vendor/: Packages used in application.
  • .env: Environment variables for current environment.
  • base.env: Base environment variables.

How to use (Docker)

docker-compose up --build

Check http://localhost:8080

How to use (without Docker)

Prepare environment for Go projects if you do not done it early

sudo apt update
sudo apt upgrade
# See last version here: https://golang.org/dl/
wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
sudo tar -xvf go1.12.5.linux-amd64.tar.gz
sudo mv go /usr/local
sudo mcedit /etc/profile

And add last line:

export PATH=$PATH:/usr/local/go/bin

Update environment variables:

source /etc/profile

Check Go version:

go version

Now create folder for Go projects:

mkdir ~/go
cd ~/go
touch init.sh
mcedit init.sh

Paste next code into this file:

#!/bin/bash

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

Execute file:

chmod +x init.sh
source init.sh

Clone repo

git clone [email protected]:zubroide/go-api-boilerplate.git
cd go-api-boilerplate

Install necessary packages

./install/install.sh

Create and edit config

cp .env.example .env
mcedit .env

Download vendor packages

go mod download

Run migrations

Create database go-api-boilerplate.

And run migrations:

make migrate

Run application

make server

Or:

go run main.go server --port=8080

Check http://localhost:8080

Run tests

Run all tests:

go test ./... -v -coverpkg=./... -coverprofile=coverage.out
go tool cover -html=coverage.out

Run test for one package:

go test go-api-boilerplate/test/unit -v -coverpkg=./... -coverprofile=coverage.out

Run one test:

go test test/unit/user_service_test.go -v -coverpkg=./... -coverprofile=coverage.out

Using make:

make test

Generate Swagger documentation

Generate swagger.json:

make swagger

Documentation must be available at url http://localhost:8080/swagger/index.html

Requirements

  • Go 1.12+