Skip to content

Commit 606fe22

Browse files
committed
feat: jpa-adapter
1 parent 2e2c8d2 commit 606fe22

17 files changed

+490
-1
lines changed

cookiecutter.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
"app_title": "{{cookiecutter.app_name.capitalize()}}",
44
"domain": "{{cookiecutter.domain}}",
55
"domain_capitalized": "{{cookiecutter.domain.capitalize()}}",
6+
"domain_uppercase": "{{cookiecutter.domain.upper()}}",
67
"domain_plural": "{%- if cookiecutter.app_name.endswith('y') -%}{{cookiecutter.domain.replace('y','')}}ies{% else %}{{cookiecutter.domain.lower()}}s{% endif %}",
78
"domain_plural_capitalized": "{{cookiecutter.domain_plural.capitalize()}}",
9+
"domain_plural_uppercase": "{{cookiecutter.domain_plural.upper()}}",
810
"group_id": "org.{{cookiecutter.domain}}",
911
"artifact_id": "{{cookiecutter.domain}}",
1012
"package_name": "{{cookiecutter.domain}}"
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<groupId>{{cookiecutter.group_id}}</groupId>
7+
<artifactId>{{cookiecutter.artifact_id}}-parent</artifactId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
<artifactId>jpa-adapter</artifactId>
12+
<dependencies>
13+
<!-- Domain -->
14+
<dependency>
15+
<groupId>{{cookiecutter.group_id}}</groupId>
16+
<artifactId>domain-api</artifactId>
17+
</dependency>
18+
<!-- Frameworks & Libraries -->
19+
<dependency>
20+
<groupId>org.springframework.boot</groupId>
21+
<artifactId>spring-boot-starter-data-jpa</artifactId>
22+
</dependency>
23+
<dependency>
24+
<groupId>org.liquibase</groupId>
25+
<artifactId>liquibase-core</artifactId>
26+
</dependency>
27+
<dependency>
28+
<groupId>org.springframework.data</groupId>
29+
<artifactId>spring-data-envers</artifactId>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.postgresql</groupId>
33+
<artifactId>postgresql</artifactId>
34+
</dependency>
35+
<dependency>
36+
<groupId>net.lbruun.springboot</groupId>
37+
<artifactId>preliquibase-spring-boot-starter</artifactId>
38+
</dependency>
39+
<!-- Test -->
40+
<dependency>
41+
<groupId>org.springframework.boot</groupId>
42+
<artifactId>spring-boot-starter-test</artifactId>
43+
<scope>test</scope>
44+
</dependency>
45+
<dependency>
46+
<groupId>com.h2database</groupId>
47+
<artifactId>h2</artifactId>
48+
<scope>test</scope>
49+
</dependency>
50+
</dependencies>
51+
<build>
52+
<plugins>
53+
<plugin>
54+
<groupId>com.societegenerale.commons</groupId>
55+
<artifactId>arch-unit-maven-plugin</artifactId>
56+
<configuration>
57+
<rules>
58+
<preConfiguredRules>
59+
<rule>com.societegenerale.commons.plugin.rules.NoJunitAssertRuleTest</rule>
60+
<rule>com.societegenerale.commons.plugin.rules.NoPowerMockRuleTest</rule>
61+
<rule>com.societegenerale.commons.plugin.rules.NoTestIgnoreRuleTest</rule>
62+
<rule>com.societegenerale.commons.plugin.rules.NoTestIgnoreWithoutCommentRuleTest
63+
</rule>
64+
<rule>com.societegenerale.commons.plugin.rules.NoStandardStreamRuleTest</rule>
65+
<rule>com.societegenerale.commons.plugin.rules.NoJodaTimeRuleTest</rule>
66+
<rule>com.societegenerale.commons.plugin.rules.NoJavaUtilDateRuleTest</rule>
67+
<rule>com.societegenerale.commons.plugin.rules.NoPrefixForInterfacesRuleTest</rule>
68+
<rule>com.societegenerale.commons.plugin.rules.NoPublicFieldRuleTest</rule>
69+
<rule>com.societegenerale.commons.plugin.rules.NoInjectedFieldTest</rule>
70+
<rule>com.societegenerale.commons.plugin.rules.NoAutowiredFieldTest</rule>
71+
</preConfiguredRules>
72+
</rules>
73+
</configuration>
74+
</plugin>
75+
</plugins>
76+
</build>
77+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package {{cookiecutter.package_name}}.repository.config;
2+
3+
import org.springframework.boot.autoconfigure.domain.EntityScan;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean;
7+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
8+
import {{cookiecutter.package_name}}.domain.port.Obtain{{cookiecutter.domain_capitalized}};
9+
import {{cookiecutter.package_name}}.repository.{{cookiecutter.domain_capitalized}}Repository;
10+
import {{cookiecutter.package_name}}.repository.dao.{{cookiecutter.domain_capitalized}}Dao;
11+
12+
@Configuration
13+
@EntityScan("{{cookiecutter.package_name}}.repository.entity")
14+
@EnableJpaRepositories(
15+
basePackages = "{{cookiecutter.package_name}}.repository.dao",
16+
repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
17+
public class JpaAdapterConfig {
18+
19+
@Bean
20+
public Obtain{{cookiecutter.domain_capitalized}} get{{cookiecutter.domain_capitalized}}Repository({{cookiecutter.domain_capitalized}}Dao {{cookiecutter.domain}}Dao) {
21+
return new {{cookiecutter.domain_capitalized}}Repository({{cookiecutter.domain}}Dao);
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package {{cookiecutter.package_name}}.repository.dao;
2+
3+
import java.util.Optional;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.repository.history.RevisionRepository;
6+
import org.springframework.stereotype.Repository;
7+
import {{cookiecutter.package_name}}.repository.entity.{{cookiecutter.domain_capitalized}}Entity;
8+
9+
@Repository
10+
public interface {{cookiecutter.domain_capitalized}}Dao
11+
extends JpaRepository<{{cookiecutter.domain_capitalized}}Entity, Long>, RevisionRepository<{{cookiecutter.domain_capitalized}}Entity, Long, Long> {
12+
13+
Optional<{{cookiecutter.domain_capitalized}}Entity> findByCode(Long code);
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package {{cookiecutter.package_name}}.repository.entity;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.SequenceGenerator;
9+
import jakarta.persistence.Table;
10+
import lombok.AllArgsConstructor;
11+
import lombok.Builder;
12+
import lombok.Data;
13+
import lombok.NoArgsConstructor;
14+
15+
@Table(name = "REVISION_INFO", schema = "{{cookiecutter.domain_uppercase}}_AUDIT")
16+
@Entity
17+
@Data
18+
@Builder
19+
@AllArgsConstructor
20+
@NoArgsConstructor
21+
@SequenceGenerator(
22+
schema = "{{cookiecutter.domain_uppercase}}_AUDIT",
23+
name = "SEQ_REVISION_INFO",
24+
sequenceName = "{{cookiecutter.domain_uppercase}}_AUDIT.SEQ_REVISION_INFO",
25+
allocationSize = 1)
26+
public class EnversRevisionEntity {
27+
@Id
28+
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_REVISION_INFO")
29+
@Column(name = "REV")
30+
private Long rev;
31+
32+
@Column(name = "TIMESTAMP")
33+
private Long code;
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package {{cookiecutter.package_name}}.repository.entity;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.SequenceGenerator;
9+
import jakarta.persistence.Table;
10+
import lombok.AllArgsConstructor;
11+
import lombok.Builder;
12+
import lombok.Data;
13+
import lombok.NoArgsConstructor;
14+
import org.hibernate.envers.Audited;
15+
import {{cookiecutter.package_name}}.domain.model.{{cookiecutter.domain_capitalized}};
16+
17+
@Table(name = "T_{{cookiecutter.domain_uppercase}}")
18+
@Entity
19+
@Data
20+
@Builder
21+
@AllArgsConstructor
22+
@NoArgsConstructor
23+
@Audited
24+
public class {{cookiecutter.domain_capitalized}}Entity {
25+
26+
@Id
27+
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_T_{{cookiecutter.domain_uppercase}}")
28+
@SequenceGenerator(
29+
name = "SEQ_T_{{cookiecutter.domain_uppercase}}",
30+
sequenceName = "SEQ_T_{{cookiecutter.domain_uppercase}}",
31+
allocationSize = 1,
32+
initialValue = 1)
33+
@Column(name = "TECH_ID")
34+
private Long techId;
35+
36+
@Column(name = "CODE")
37+
private Long code;
38+
39+
@Column(name = "DESCRIPTION")
40+
private String description;
41+
42+
public {{cookiecutter.domain_capitalized}} toModel() {
43+
return {{cookiecutter.domain_capitalized}}.builder().code(code).description(description).build();
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package {{cookiecutter.package_name}}.repository;
2+
3+
import java.util.List;
4+
import java.util.Optional;
5+
import java.util.stream.Collectors;
6+
import {{cookiecutter.package_name}}.domain.model.{{cookiecutter.domain_capitalized}};
7+
import {{cookiecutter.package_name}}.domain.port.Obtain{{cookiecutter.domain_capitalized}};
8+
import {{cookiecutter.package_name}}.repository.dao.{{cookiecutter.domain_capitalized}}Dao;
9+
import {{cookiecutter.package_name}}.repository.entity.{{cookiecutter.domain_capitalized}}Entity;
10+
11+
public class {{cookiecutter.domain_capitalized}}Repository implements Obtain{{cookiecutter.domain_capitalized}} {
12+
13+
private final {{cookiecutter.domain_capitalized}}Dao {{cookiecutter.domain}}Dao;
14+
15+
public {{cookiecutter.domain_capitalized}}Repository({{cookiecutter.domain_capitalized}}Dao {{cookiecutter.domain}}Dao) {
16+
this.{{cookiecutter.domain}}Dao = {{cookiecutter.domain}}Dao;
17+
}
18+
19+
@Override
20+
public List<{{cookiecutter.domain_capitalized}}> getAll{{cookiecutter.domain_plural_capitalized}}() {
21+
return {{cookiecutter.domain}}Dao.findAll().stream().map({{cookiecutter.domain_capitalized}}Entity::toModel).collect(Collectors.toList());
22+
}
23+
24+
@Override
25+
public Optional<{{cookiecutter.domain_capitalized}}> get{{cookiecutter.domain_capitalized}}ByCode(Long code) {
26+
var {{cookiecutter.domain}}Entity = {{cookiecutter.domain}}Dao.findByCode(code);
27+
return {{cookiecutter.domain}}Entity.map({{cookiecutter.domain_capitalized}}Entity::toModel);
28+
}
29+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
spring:
2+
datasource:
3+
driver-class-name: ${database.driver-class-name:org.postgresql.Driver}
4+
url: ${database.url}
5+
username: ${database.username}
6+
password: ${database.password}
7+
jpa:
8+
generate-ddl: false
9+
hibernate:
10+
ddl-auto: none
11+
database-platform: org.hibernate.dialect.PostgreSQLDialect
12+
show-sql: ${database.show_sql:false}
13+
properties:
14+
hibernate:
15+
default_schema: ${database.default_schema:{{cookiecutter.domain_uppercase}}}
16+
show_sql: ${database.show_sql:false}
17+
use_sql_comments: ${database.use_sql_comments:false}
18+
format_sql: ${database.format_sql:false}
19+
org:
20+
hibernate:
21+
envers:
22+
default_schema: ${database.default_audit_schema:{{cookiecutter.domain_uppercase}}_AUDIT}
23+
store_data_at_delete: true
24+
liquibase:
25+
enabled: true
26+
liquibase-schema: ${database.liquibase_schema:LIQUIBASE}
27+
default-schema: ${database.default_schema:{{cookiecutter.domain_uppercase}}}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
databaseChangeLog:
2+
- include:
3+
file: db/changelog/includes/240720211408009-create-revision.yaml
4+
- include:
5+
file: db/changelog/includes/110720212155010-create-{{cookiecutter.domain}}.yaml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
databaseChangeLog:
2+
- changeSet:
3+
id: create-table-t_{{cookiecutter.domain}}
4+
author: Paul WILLIAMS
5+
changes:
6+
- createTable:
7+
tableName: T_{{cookiecutter.domain_uppercase}}
8+
columns:
9+
- column:
10+
name: TECH_ID
11+
type: BIGINT
12+
constraints:
13+
primaryKey: true
14+
nullable: false
15+
- column:
16+
name: CODE
17+
type: BIGINT
18+
constraints:
19+
nullable: false
20+
- column:
21+
name: DESCRIPTION
22+
type: VARCHAR(255)
23+
constraints:
24+
nullable: false
25+
createSequence:
26+
sequenceName: SEQ_T_{{cookiecutter.domain_uppercase}}
27+
startValue: 1
28+
incrementBy: 1
29+
rollback:
30+
- dropSequence:
31+
sequenceName: SEQ_T_{{cookiecutter.domain_uppercase}}
32+
- dropTable:
33+
tableName: T_{{cookiecutter.domain_uppercase}}
34+
- changeSet:
35+
id: create-table-t_{{cookiecutter.domain}}_aud
36+
author: Paul WILLIAMS
37+
changes:
38+
- createTable:
39+
schemaName: {{cookiecutter.domain_uppercase}}_AUDIT
40+
tableName: T_{{cookiecutter.domain_uppercase}}_AUD
41+
columns:
42+
- column:
43+
name: TECH_ID
44+
type: BIGINT
45+
constraints:
46+
nullable: false
47+
- column:
48+
name: CODE
49+
type: BIGINT
50+
constraints:
51+
nullable: false
52+
- column:
53+
name: DESCRIPTION
54+
type: VARCHAR(255)
55+
constraints:
56+
nullable: false
57+
- column:
58+
name: REV
59+
type: BIGINT
60+
constraints:
61+
nullable: false
62+
foreignKeyName: FK_T_{{cookiecutter.domain_uppercase}}_AUD_REV
63+
references: {{cookiecutter.domain_uppercase}}_AUDIT.REVINFO(REV)
64+
- column:
65+
name: REVTYPE
66+
type: INTEGER
67+
constraints:
68+
nullable: false
69+
- addPrimaryKey:
70+
schemaName: {{cookiecutter.domain_uppercase}}_AUDIT
71+
tableName: T_{{cookiecutter.domain_uppercase}}_AUD
72+
columnNames: TECH_ID, REV
73+
rollback:
74+
- dropTable:
75+
schemaName: {{cookiecutter.domain_uppercase}}_AUDIT
76+
tableName: T_{{cookiecutter.domain_uppercase}}_AUD
77+
cascadeConstraints: true

0 commit comments

Comments
 (0)