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: