This repository provides a template for building a RESTful API using Go with features like JWT Authentication, rate limiting, Swagger documentation, and database operations using GORM. The application uses the Gin Gonic web framework and is containerized using Docker.
- RESTful API endpoints for CRUD operations.
- JWT Authentication.
- Rate Limiting.
- Swagger Documentation.
- PostgreSQL database integration using GORM.
- Redis cache.
- MongoDB for logging storage.
- Dockerized application for easy setup and deployment.
golang-rest-api-template/
├── bin
│ └── server
├── cmd
│ └── server
│ └── main.go
├── docker-compose.yml
├── Dockerfile
├── docs
│ ├── docs.go
│ ├── swagger.json
│ └── swagger.yaml
├── go.mod
├── go.sum
├── LICENSE
├── Makefile
├── pkg
│ ├── api
│ │ ├── books.go
│ │ ├── books_test.go
│ │ ├── router.go
│ │ └── user.go
│ ├── auth
│ │ ├── auth.go
│ │ └── auth_test.go
│ ├── cache
│ │ ├── cache.go
│ │ ├── cache_mock.go
│ │ └── cache_test.go
│ ├── database
│ │ ├── db.go
│ │ ├── db_mock.go
│ │ └── db_test.go
│ ├── middleware
│ │ ├── api_key.go
│ │ ├── authenticateJWT.go
│ │ ├── cors.go
│ │ ├── rate_limit.go
│ │ ├── security.go
│ │ └── xss.go
│ └── models
│ ├── book.go
│ └── user.go
├── README.md
├── scripts
│ ├── generate_key
│ └── generate_key.go
└── vendor
- Go 1.21+
- Docker
- Docker Compose
- Clone the repository
git clone https://github.com/araujo88/golang-rest-api-template
- Navigate to the directory
cd golang-rest-api-template
- Build and run the Docker containers
make setup && make build && make up
You can set the environment variables in the .env
file. Here are some important variables:
POSTGRES_HOST
POSTGRES_DB
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_PORT
JWT_SECRET
API_SECRET_KEY
The API is documented using Swagger and can be accessed at:
http://localhost:8001/swagger/index.html
GET /api/v1/books
: Get all books.GET /api/v1/books/:id
: Get a single book by ID.POST /api/v1/books
: Create a new book.PUT /api/v1/books/:id
: Update a book.DELETE /api/v1/books/:id
: Delete a book.POST /api/v1/login
: Login.POST /api/v1/register
: Register a new user.
To use authenticated routes, you must include the Authorization
header with the JWT token.
curl -H "Authorization: Bearer <YOUR_TOKEN>" http://localhost:8001/api/v1/books
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
This project contains end-to-end (E2E) tests to verify the functionality of the API. The tests are written in Python using the pytest
framework.
Before running the tests, ensure you have the following:
- Python 3.x installed
pip
(Python package manager)- The API service running locally or on a staging server
- API key available
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
The main dependency is requests
, but you may need to include it in your requirements.txt
file if it's not already listed.
You need to set the BASE_URL
and API_KEY
as environment variables before running the tests.
For a local API service:
export BASE_URL=http://localhost:8001/api/v1
export API_KEY=your-api-key-here
For a staging server:
export BASE_URL=https://staging-server-url.com/api/v1
export API_KEY=your-api-key-here
On Windows, you can use:
set BASE_URL=http://localhost:8001/api/v1
set API_KEY=your-api-key-here
Once the environment variables are set, you can run the tests using pytest
:
pytest test_e2e.py
The tests will perform the following actions:
- Register a new user and obtain a JWT token.
- Create a new book in the system.
- Retrieve all books and verify the created book is present.
- Retrieve a specific book by its ID.
- Update the book's details.
- Delete the book and verify it is no longer accessible.
Each test includes assertions to ensure that the API behaves as expected.