Skip to content

Commit 1e10ccd

Browse files
committed
Java template simplified and updated
1 parent c9c27ce commit 1e10ccd

22 files changed

+123
-267
lines changed

README.md

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
# Шаблон приложения Kora Java CRUD
44

5-
Пример сервиса реализованного на Kora с HTTP [CRUD](https://github.com/swagger-api/swagger-petstore) API,
6-
в качестве базы данных выступает Postgres, используется кэш Caffeine, а также другие модули которые использовались бы в реальном приложении в бою.
5+
Шаблон для быстрого старта нового проекта на Java и Kora с базовым настроенным HTTP [CRUD](https://github.com/swagger-api/swagger-petstore) API для одной сущности.
6+
В качестве базы данных выступает Postgres, используется кэш Caffeine,
7+
а также другие модули которые использовались бы в реальном приложении в бою.
78

8-
В примере использовались модули:
9+
В шаблоне используются модули:
910
- [HTTP сервер](https://kora-projects.github.io/kora-docs/ru/documentation/http-server/)
1011
- [OpenAPI HTTP серверная генерация](https://kora-projects.github.io/kora-docs/ru/documentation/openapi-codegen/)
1112
- [Пробы](https://kora-projects.github.io/kora-docs/ru/documentation/probes/)
@@ -31,13 +32,27 @@
3132
./gradlew openApiGenerateHttpServer
3233
```
3334

35+
### Image
36+
37+
Собрать образ приложения:
38+
```shell
39+
docker build -t kora-java-crud .
40+
```
41+
3442
## Run
3543

3644
Запустить локально:
3745
```shell
3846
./gradlew run
3947
```
4048

49+
## Migration
50+
51+
Миграции вызываются с помощью Flyway Gradle Plugin:
52+
```shell
53+
./gradlew flywayMigrate
54+
```
55+
4156
## Test
4257

4358
Тесты используют [Testcontainers](https://java.testcontainers.org/), требуется [Docker](https://docs.docker.com/engine/install/) окружение для запуска тестов или аналогичные контейнерные окружения ([colima](https://github.com/abiosoft/colima) / итп)

build.gradle

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ plugins {
1616
id "com.diffplug.spotless" version "6.19.0"
1717
}
1818

19-
applicationName = "application"
20-
mainClassName = "ru.tinkoff.kora.java.crud.Application"
21-
2219
group = groupId
2320
version = koraVersion
2421

@@ -27,13 +24,14 @@ targetCompatibility = JavaVersion.VERSION_21
2724

2825
repositories {
2926
mavenCentral()
30-
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
3127
}
3228

3329
configurations {
3430
koraBom
35-
implementation.extendsFrom(koraBom)
3631
annotationProcessor.extendsFrom(koraBom)
32+
compileOnly.extendsFrom(koraBom)
33+
implementation.extendsFrom(koraBom)
34+
api.extendsFrom(koraBom)
3735
}
3836

3937
dependencies {
@@ -58,22 +56,32 @@ dependencies {
5856
testImplementation "org.json:json:20231013"
5957
testImplementation "org.skyscreamer:jsonassert:1.5.1"
6058

61-
testImplementation "org.mockito:mockito-core:5.6.0"
59+
testImplementation "org.mockito:mockito-core:5.7.0"
6260
testImplementation "ru.tinkoff.kora:test-junit5"
63-
testImplementation "io.goodforgod:testcontainers-extensions-postgres:0.11.0"
64-
testImplementation "org.testcontainers:junit-jupiter:1.17.6"
61+
testImplementation "io.goodforgod:testcontainers-extensions-postgres:0.12.0"
62+
testImplementation "org.testcontainers:junit-jupiter:1.19.8"
6563
}
6664

67-
// for snapshot dependencies
68-
configurations {
69-
configureEach {
70-
resolutionStrategy {
71-
cacheChangingModulesFor 0, "seconds" // check for updates every build
72-
}
73-
}
65+
application {
66+
applicationName = "application"
67+
mainClassName = "ru.tinkoff.kora.java.crud.Application"
68+
applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"]
69+
}
70+
71+
distTar {
72+
archiveFileName = "application.tar"
73+
}
74+
75+
//noinspection GroovyAssignabilityCheck
76+
run {
77+
environment([
78+
"POSTGRES_JDBC_URL": "jdbc:postgresql://$postgresHost:$postgresPort/$postgresDatabase",
79+
"POSTGRES_USER" : "$postgresUser",
80+
"POSTGRES_PASS" : "$postgresPassword",
81+
])
7482
}
7583

76-
openApiGenerate {
84+
tasks.register("openApiGenerateHttpServer", GenerateTask) {
7785
generatorName = "kora"
7886
group = "openapi tools"
7987
inputSpec = "$projectDir/src/main/resources/openapi/http-server.yaml"
@@ -87,21 +95,12 @@ openApiGenerate {
8795
]
8896
}
8997

90-
compileJava.dependsOn tasks.openApiGenerate
91-
test.dependsOn tasks.distTar
92-
93-
application {
94-
applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"]
98+
sourceSets.main {
99+
java.srcDirs += "$buildDir/generated/openapi"
95100
}
96101

97-
//noinspection GroovyAssignabilityCheck
98-
run {
99-
environment([
100-
"POSTGRES_JDBC_URL": "jdbc:postgresql://$postgresHost:$postgresPort/$postgresDatabase",
101-
"POSTGRES_USER" : "$postgresUser",
102-
"POSTGRES_PASS" : "$postgresPassword",
103-
])
104-
}
102+
compileJava.dependsOn tasks.openApiGenerateHttpServer
103+
test.dependsOn tasks.distTar
105104

106105
test {
107106
jvmArgs += [
@@ -130,9 +129,11 @@ test {
130129
}
131130
}
132131

133-
sourceSets {
134-
main {
135-
java.srcDirs += "$buildDir/generated/openapi"
132+
check.dependsOn jacocoTestReport
133+
jacocoTestReport {
134+
reports {
135+
xml.required = true
136+
html.outputLocation = layout.buildDirectory.dir("jacocoHtml")
136137
}
137138
}
138139

@@ -143,16 +144,19 @@ flyway {
143144
locations = ["classpath:db/migration"]
144145
}
145146

146-
distTar {
147-
archiveFileName = "application.tar"
148-
}
149-
150147
compileJava {
151148
options.encoding("UTF-8")
152149
options.incremental(true)
153150
options.fork = false
154151
}
155152

153+
javadoc {
154+
options.encoding = "UTF-8"
155+
if (JavaVersion.current().isJava9Compatible()) {
156+
options.addBooleanOption("html5", true)
157+
}
158+
}
159+
156160
spotless {
157161
java {
158162
encoding("UTF-8")
@@ -162,18 +166,3 @@ spotless {
162166
targetExclude("**/proto/**", "**/generated/openapi/**", "**/generated/soap/**", "**/generated/grpc/**",)
163167
}
164168
}
165-
166-
check.dependsOn jacocoTestReport
167-
jacocoTestReport {
168-
reports {
169-
xml.required = true
170-
html.outputLocation = layout.buildDirectory.dir("jacocoHtml")
171-
}
172-
}
173-
174-
javadoc {
175-
options.encoding = "UTF-8"
176-
if (JavaVersion.current().isJava9Compatible()) {
177-
options.addBooleanOption("html5", true)
178-
}
179-
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
groupId=ru.tinkoff.kora
2-
koraVersion=1.1.9
2+
koraVersion=1.1.11
33

44

55
##### GRADLE #####

settings.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ pluginManagement {
22
repositories {
33
gradlePluginPortal()
44
mavenCentral()
5-
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
65
}
76
}
87

src/main/java/ru/tinkoff/kora/java/crud/controller/HttpExceptionHandler.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package ru.tinkoff.kora.java.crud.controller;
22

33
import io.micrometer.core.instrument.config.validate.ValidationException;
4+
import java.util.concurrent.CompletionStage;
5+
import java.util.concurrent.TimeoutException;
46
import ru.tinkoff.kora.common.Component;
57
import ru.tinkoff.kora.common.Context;
68
import ru.tinkoff.kora.common.Tag;
7-
import ru.tinkoff.kora.java.crud.openapi.http.server.model.MessageTO;
89
import ru.tinkoff.kora.http.common.body.HttpBody;
910
import ru.tinkoff.kora.http.server.common.*;
11+
import ru.tinkoff.kora.java.crud.openapi.http.server.model.MessageTO;
1012
import ru.tinkoff.kora.json.common.JsonWriter;
1113

12-
import java.util.concurrent.CompletionStage;
13-
import java.util.concurrent.TimeoutException;
14-
1514
@Tag(HttpServerModule.class)
1615
@Component
1716
public final class HttpExceptionHandler implements HttpServerInterceptor {

src/main/java/ru/tinkoff/kora/java/crud/controller/PetDelegate.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import ru.tinkoff.kora.common.Component;
44
import ru.tinkoff.kora.java.crud.model.mapper.PetMapper;
55
import ru.tinkoff.kora.java.crud.openapi.http.server.api.PetApiDelegate;
6-
import ru.tinkoff.kora.java.crud.service.PetService;
76
import ru.tinkoff.kora.java.crud.openapi.http.server.api.PetApiResponses;
87
import ru.tinkoff.kora.java.crud.openapi.http.server.model.MessageTO;
98
import ru.tinkoff.kora.java.crud.openapi.http.server.model.PetCreateTO;
109
import ru.tinkoff.kora.java.crud.openapi.http.server.model.PetUpdateTO;
10+
import ru.tinkoff.kora.java.crud.service.PetService;
1111

1212
@Component
1313
public final class PetDelegate implements PetApiDelegate {
@@ -64,7 +64,8 @@ public PetApiResponses.DeletePetApiResponse deletePet(long petId) {
6464
}
6565

6666
if (petService.delete(petId)) {
67-
return new PetApiResponses.DeletePetApiResponse.DeletePet200ApiResponse(new MessageTO("Successfully deleted pet with ID: " + petId));
67+
return new PetApiResponses.DeletePetApiResponse.DeletePet200ApiResponse(
68+
new MessageTO("Successfully deleted pet with ID: " + petId));
6869
} else {
6970
return new PetApiResponses.DeletePetApiResponse.DeletePet404ApiResponse(notFound(petId));
7071
}

src/main/java/ru/tinkoff/kora/java/crud/model/dao/Pet.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
@Table("pets")
88
public record Pet(@Id @Column("id") long id,
99
@Column("name") String name,
10-
@Column("status") Status status,
11-
@Column("category_id") long categoryId) {
10+
@Column("status") Status status) {
1211

1312
public enum Status {
1413

src/main/java/ru/tinkoff/kora/java/crud/model/dao/PetCategory.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/main/java/ru/tinkoff/kora/java/crud/model/dao/PetWithCategory.java

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
package ru.tinkoff.kora.java.crud.model.mapper;
22

33
import org.mapstruct.Mapper;
4-
import ru.tinkoff.kora.java.crud.model.dao.PetCategory;
5-
import ru.tinkoff.kora.java.crud.model.dao.PetWithCategory;
6-
import ru.tinkoff.kora.java.crud.openapi.http.server.model.CategoryTO;
4+
import ru.tinkoff.kora.java.crud.model.dao.Pet;
75
import ru.tinkoff.kora.java.crud.openapi.http.server.model.PetTO;
86

97
@Mapper
108
public interface PetMapper {
119

12-
PetTO asDTO(PetWithCategory pet);
13-
14-
CategoryTO asDTO(PetCategory category);
10+
PetTO asDTO(Pet pet);
1511
}

0 commit comments

Comments
 (0)