From e19a55e8d3ff793d5982798fc0da637f3cd77584 Mon Sep 17 00:00:00 2001 From: Dmitri Date: Sat, 11 Apr 2026 23:26:23 +0200 Subject: [PATCH] start using jooq --- Makefile | 60 ++++++++++++++ pom.xml | 79 ++++++++++++++++--- .../dev/kanopo/rhythm/RhythmApplication.java | 4 +- .../java/dev/kanopo/rhythm/db/model/User.java | 37 ++------- .../rhythm/db/repository/UserRepository.java | 21 ++++- src/main/resources/application.yaml | 10 +-- 6 files changed, 156 insertions(+), 55 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..448300b --- /dev/null +++ b/Makefile @@ -0,0 +1,60 @@ +# Makefile for rhythm-backend +# Uses Maven wrapper (./mvnw) + +# Load .env if exists (for DB credentials, etc.) +ifneq ($(wildcard .env),) + include .env + export +endif + +DB_HOST ?= localhost +DB_PORT ?= 5432 +DB_NAME ?= rhythm +DB_USERNAME ?= postgres +DB_PASSWORD ?= postgres + +.PHONY: help install migrate codegen setup build run clean test + +help: + @echo "Available commands:" + @echo " make install - Install Maven wrapper" + @echo " make migrate - Run Flyway migrations" + @echo " make codegen - Generate jOOQ classes from DB schema" + @echo " make setup - Install wrapper + migrate + codegen (combined)" + @echo " make build - Compile the project" + @echo " make run - Run the application" + @echo " make clean - Clean build artifacts" + @echo " make test - Run tests" + +install: + ./mvnw -v || mvn -v wrapper:wrapper -Dmaven=${MAVEN_VERSION:-3.9.9} + +migrate: + ./mvnw flyway:migrate \ + -DDB_HOST=$(DB_HOST) \ + -DDB_PORT=$(DB_PORT) \ + -DDB_NAME=$(DB_NAME) \ + -DDB_USERNAME=$(DB_USERNAME) \ + -DDB_PASSWORD=$(DB_PASSWORD) + +codegen: + ./mvnw jooq-codegen:generate \ + -DDB_HOST=$(DB_HOST) \ + -DDB_PORT=$(DB_PORT) \ + -DDB_NAME=$(DB_NAME) \ + -DDB_USERNAME=$(DB_USERNAME) \ + -DDB_PASSWORD=$(DB_PASSWORD) + +setup: install migrate codegen + +build: + ./mvnw compile + +run: + ./mvnw spring-boot:run + +clean: + ./mvnw clean + +test: + ./mvnw test \ No newline at end of file diff --git a/pom.xml b/pom.xml index c0ccc25..7b69930 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ dev.kanopo rhythm - 0.0.1-SNAPSHOT + 0.0.0-SNAPSHOT @@ -36,16 +36,12 @@ org.springframework.boot - spring-boot-starter-data-jpa + spring-boot-starter-jooq org.springframework.boot spring-boot-starter-flyway - - org.springframework.boot - spring-boot-starter-mail - org.springframework.boot spring-boot-starter-security @@ -83,11 +79,7 @@ spring-boot-starter-actuator-test test - - org.springframework.boot - spring-boot-starter-data-jpa-test - test - + org.springframework.boot spring-boot-starter-flyway-test @@ -95,7 +87,7 @@ org.springframework.boot - spring-boot-starter-mail-test + spring-boot-starter-jooq-test test @@ -151,6 +143,25 @@ + + org.codehaus.mojo + build-helper-maven-plugin + 3.4.0 + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/jooq + + + + + org.springframework.boot spring-boot-maven-plugin @@ -163,6 +174,50 @@ + + org.flywaydb + flyway-maven-plugin + 11.20.2 + + jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME} + ${DB_USERNAME} + ${DB_PASSWORD} + + + + org.jooq + jooq-codegen-maven + ${jooq.version} + + + generate-jooq + generate-sources + + generate + + + + + + org.postgresql.Driver + jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME} + ${DB_USERNAME} + ${DB_PASSWORD} + + + + org.jooq.meta.postgres.PostgresDatabase + public + .* + flyway_schema_history + + + dev.kanopo.rhythm.jooq + ${project.build.directory}/generated-sources/jooq + + + + diff --git a/src/main/java/dev/kanopo/rhythm/RhythmApplication.java b/src/main/java/dev/kanopo/rhythm/RhythmApplication.java index f41e51f..f2c81ae 100644 --- a/src/main/java/dev/kanopo/rhythm/RhythmApplication.java +++ b/src/main/java/dev/kanopo/rhythm/RhythmApplication.java @@ -2,14 +2,12 @@ package dev.kanopo.rhythm; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication -@EnableJpaAuditing public class RhythmApplication { public static void main(String[] args) { SpringApplication.run(RhythmApplication.class, args); } -} +} \ No newline at end of file diff --git a/src/main/java/dev/kanopo/rhythm/db/model/User.java b/src/main/java/dev/kanopo/rhythm/db/model/User.java index 9efd304..dd032fa 100644 --- a/src/main/java/dev/kanopo/rhythm/db/model/User.java +++ b/src/main/java/dev/kanopo/rhythm/db/model/User.java @@ -3,38 +3,13 @@ package dev.kanopo.rhythm.db.model; import java.time.Instant; import java.util.UUID; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.PreUpdate; -import jakarta.persistence.Table; import lombok.Data; -@Entity @Data -@Table(name = "users") public class User { - @Id - @GeneratedValue - @Column(name = "id", updatable = false, nullable = false) - private UUID id; - - @Column(nullable = false) - private String email; - - @Column - private String password; - - @Column(name = "created_at", nullable = false, updatable = false) - private Instant createdAt; - - @Column(name = "updated_at", nullable = false) - private Instant updatedAt; - - @PreUpdate - void onUpdate() { - this.updatedAt = Instant.now(); - } - -} + private UUID id; + private String email; + private String password; + private Instant createdAt; + private Instant updatedAt; +} \ No newline at end of file diff --git a/src/main/java/dev/kanopo/rhythm/db/repository/UserRepository.java b/src/main/java/dev/kanopo/rhythm/db/repository/UserRepository.java index a78a73c..66818fe 100644 --- a/src/main/java/dev/kanopo/rhythm/db/repository/UserRepository.java +++ b/src/main/java/dev/kanopo/rhythm/db/repository/UserRepository.java @@ -1,11 +1,28 @@ package dev.kanopo.rhythm.db.repository; +import static dev.kanopo.rhythm.jooq.tables.Users.USERS; + +import java.util.Optional; import java.util.UUID; -import org.springframework.data.repository.Repository; +import org.jooq.DSLContext; +import org.springframework.stereotype.Repository; import dev.kanopo.rhythm.db.model.User; -public interface UserRepository extends Repository { +@Repository +public class UserRepository { + private final DSLContext dsl; + + public UserRepository(DSLContext dsl) { + this.dsl = dsl; + } + + public Optional findById(UUID id) { + return dsl.selectFrom(USERS) + .where(USERS.ID.eq(id)) + .fetchOptional() + .map(r -> r.into(User.class)); + } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index ab4d121..39952f4 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -10,18 +10,14 @@ spring: username: ${DB_USERNAME} password: ${DB_PASSWORD} driver-class-name: org.postgresql.Driver - jpa: - hibernate: - ddl-auto: validate - open-in-view: false - properties: - hibernate: - dialect: org.hibernate.dialect.PostgreSQLDialect flyway: enabled: true baseline-on-migrate: true +jooq: + sql-dialect: POSTGRES + server: port: ${APP_PORT:8080} error: