diff --git a/.gitignore b/.gitignore index afea6911..59d0e90e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,10 @@ *.ear *.db +# Environment variables +.env +*.env + ### IntelliJ IDEA ### .idea *.iws @@ -29,4 +33,4 @@ /nbbuild/ /dist/ /nbdist/ -/.nb-gradle/ \ No newline at end of file +/.nb-gradle/docker-entrypoint-initdb.d/*.sql diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..5480842b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "kiroAgent.configureMCP": "Disabled" +} \ No newline at end of file diff --git a/README.md b/README.md index 2906f0fd..4f85b318 100644 --- a/README.md +++ b/README.md @@ -11,19 +11,28 @@ Build Restful CRUD API for a blog using Spring Boot, Mysql, JPA and Hibernate. ```bash git clone https://github.com/coma123/Spring-Boot-Blog-REST-API.git ``` +**2. Environment Variables** +Create a `.env` file or set these environment variables: +```bash +DB_HOST=localhost +DB_PORT=3306 +DB_NAME=blogapi +DB_USERNAME=root +DB_PASSWORD=your_password +``` -**2. Create Mysql database** +**3. Create Mysql database** ```bash create database blogapi ``` - run `src/main/resources/blogapi.sql` -**3. Change mysql username and password as per your installation** +**4. Change mysql username and password as per your installation** + open `src/main/resources/application.properties` + change `spring.datasource.username` and `spring.datasource.password` as per your mysql installation -**4. Run the app using maven** +**5. Run the app using maven** ```bash mvn spring-boot:run diff --git a/docker-compose.yml b/docker-compose.yml index 9bd9053e..9edeb822 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,24 +1,29 @@ version: '3.8' + services: db: - image: mysql + image: mysql:8.0 container_name: blogapi-db restart: always environment: - MYSQL_DATABASE: 'blogapi' - MYSQL_PASSWORD: 'root' - MYSQL_ROOT_PASSWORD: 'root' + MYSQL_DATABASE: ${DB_NAME:-blogapi} + MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-root} + MYSQL_USER: ${DB_USERNAME:-blogapiuser} + MYSQL_PASSWORD: ${DB_PASSWORD:-password} ports: - '3306:3306' networks: - blogapi-network healthcheck: - test: "/usr/bin/mysql --user=root --password=root --execute \"SHOW DATABASES;\"" - interval: 2s - timeout: 20s - retries: 10 + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"] + interval: 10s + timeout: 5s + retries: 5 volumes: - - ./data:/docker-entrypoint-initdb.d + - mysql_data:/var/lib/mysql + - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d + + application: container_name: blogapi-application build: @@ -26,11 +31,22 @@ services: dockerfile: Dockerfile ports: - "8080:8080" + environment: + DB_HOST: db + DB_PORT: 3306 + DB_NAME: ${DB_NAME:-blogapi} + DB_USERNAME: ${DB_USERNAME:-root} + DB_PASSWORD: ${DB_ROOT_PASSWORD:-root} + depends_on: + db: + condition: service_healthy networks: - blogapi-network - depends_on: - - "db" + networks: blogapi-network: name: blogapi-network driver: bridge + +volumes: + mysql_data: \ No newline at end of file diff --git a/docker-entrypoint-initdb.d/01-init-roles.sql b/docker-entrypoint-initdb.d/01-init-roles.sql new file mode 100644 index 00000000..aad3ea67 --- /dev/null +++ b/docker-entrypoint-initdb.d/01-init-roles.sql @@ -0,0 +1,11 @@ +USE blogapi; + +-- Create roles table and insert default roles +CREATE TABLE IF NOT EXISTS roles ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(60) UNIQUE NOT NULL +); + +-- Insert default roles +INSERT IGNORE INTO roles (name) VALUES ('ROLE_USER'); +INSERT IGNORE INTO roles (name) VALUES ('ROLE_ADMIN'); diff --git a/pom.xml b/pom.xml index 4b6fd187..2a94ef72 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ org.projectlombok lombok - 1.18.12 + 1.18.30 provided diff --git a/src/main/resources/.env.example b/src/main/resources/.env.example new file mode 100644 index 00000000..ceb0a8da --- /dev/null +++ b/src/main/resources/.env.example @@ -0,0 +1,5 @@ +DB_HOST=hostname +DB_PORT=port +DB_NAME=your_db_name +DB_USERNAME=your_username +DB_PASSWORD=your_db_password \ No newline at end of file diff --git a/src/main/resources/_application.properties b/src/main/resources/_application.properties deleted file mode 100644 index d7d7b14c..00000000 --- a/src/main/resources/_application.properties +++ /dev/null @@ -1,12 +0,0 @@ -spring.jpa.hibernate.ddl-auto=none -spring.datasource.url=jdbc:mysql://localhost:3306/blogapi?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true -spring.datasource.username=root -spring.datasource.password=root -spring.jpa.show-sql=true -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect -app.jwtSecret=secret -# Expiration in milliseconds - 1 Hour -app.jwtExpirationInMs=3600000 -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false -spring.jackson.time-zone=UTC -cors.allowedOrings=* diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..41e3a1e8 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,13 @@ +spring.jpa.hibernate.ddl-auto=update +spring.datasource.url=jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:blogapi}?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true +spring.datasource.username=${DB_USERNAME:root} +spring.datasource.password=${DB_PASSWORD:root} +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect +app.jwtSecret=secret +# Expiration in milliseconds - 1 Hour +app.jwtExpirationInMs=3600000 +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false +spring.jackson.time-zone=UTC +spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false +cors.allowedOrings=*