π¨ I'm working on a migration to
spring boot 3, it's not completely done yet, but the branch is this: https://github.com/Throyer/springboot-api-rest-example/tree/spring-boot-3-migration the focus is on making the experience with docker better, 100% test coverage, the rate-limit is in an nginx container and most of the configurations I tried to simplify
A complete user registry, with access permissions, JWT token, integration and unit tests, using the RESTful API pattern.
- Features
 - Requirements
 - Docker
 - Local installation
 - Entities
 - Running a specific test
 - Swagger
 - Database Migrations
 - Environment variables
 
- Postgres: 
^13 - Java: 
^17 - Maven: 
^3.8.4 
This project was started with Spring Initializr.
π¨ create
environmentfile and add permission to execute scriptscp .docker/.env.example .docker/.env && chmod -R +x .docker/scripts
- 
docker-compose for development
- starting containers
 
.docker/scripts/develop up -d --build- removing contaiers
 
.docker/scripts/develop down- show backend logs
 
.docker/scripts/develop logs -f api - 
docker-compose for production
.docker/scripts/production up -d --build.docker/scripts/production down 
π¨ check requirements or if you are using docker check docker development instructions
- clone the repository and access the directory.
git clone git@github.com:Throyer/springboot-api-crud.git crud && cd crud
 - download dependencies
mvn -f api/pom.xml install -DskipTests
 - run the application (available at: localhost:8080)
mvn -f api/pom.xml spring-boot:run
 - running the tests
mvn -f api/pom.xml test - to build for production
mvn -f api/pom.xml clean package
 - to generate the coverage report after testing 
(available at: api/target/site/jacoco/index.html)mvn -f api/pom.xml jacoco:report
 
use the parameter -Dtest=<class>#<method>
- for example the integration test. creating a user:
mvn -f api/pom.xml test -Dtest=UsersControllerTests#should_save_a_new_user 
Once the application is up, it is available at: localhost:8080/docs
π¨ if you set
SWAGGER_USERNAMEandSWAGGER_PASSWORDon application.properties file this route require authentication
Creating database migration files
π¨ check requirements
if you using docker-compose
.docker/scripts/mvn migration:generate -Dname=my-migration-name
- 
Java based migrations
mvn -f api/pom.xml migration:generate -Dname=my-migration-name
 - 
SQL based migrations
mvn -f api/pom.xml migration:generate -Dname=my-migration-name -Dsql
 
| Description | Parameter | Default values | 
|---|---|---|
| server port | SERVER_PORT | 
8080 | 
| database host | DB_HOST | 
localhost | 
| database port | DB_PORT | 
5432 | 
| database name | DB_NAME | 
example | 
| database username | DB_USERNAME | 
root | 
| database user password | DB_PASSWORD | 
root | 
| displays the generated sql in the logger | DB_SHOW_SQL | 
false | 
| set maximum database connections | DB_MAX_CONNECTIONS | 
5 | 
| secret value in token generation | TOKEN_SECRET | 
secret | 
| secret hash ids | HASHID_SECRET | 
secret | 
| token expiration time in hours | TOKEN_EXPIRATION_IN_HOURS | 
24 | 
| refresh token expiry time in days | REFRESH_TOKEN_EXPIRATION_IN_DAYS | 
7 | 
| SMTP server address | SMTP_HOST | 
smtp.gmail.com | 
| SMTP server port | SMTP_PORT | 
587 | 
| SMTP username | SMTP_USERNAME | 
user | 
| SMTP server password | SMTP_PASSWORD | 
secret | 
| time for recovery email to expire | MINUTES_TO_EXPIRE_RECOVERY_CODE | 
20 | 
| max requests per minute | MAX_REQUESTS_PER_MINUTE | 
50 | 
| swagger url | SWAGGER_URL | 
/docs | 
| swagger username | SWAGGER_USERNAME | 
null | 
| swagger password | SWAGGER_PASSWORD | 
null | 
these variables are defined in: application.properties
# to change the value of some environment variable at runtime # on execution, just pass it as a parameter. (like --SERVER_PORT=80). $ java -jar api-5.0.0.jar --SERVER_PORT=80



