Skip to content

Commit 2504506

Browse files
author
Jonathan Henrique Medeiros
committed
enhancements
1 parent ab07589 commit 2504506

File tree

11 files changed

+99
-78
lines changed

11 files changed

+99
-78
lines changed

Dockerfile

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,28 @@ COPY pom.xml .
44
RUN mvn dependency:go-offline
55

66
COPY src src
7-
RUN mvn package
7+
RUN mvn package -DskipTests
88

99
FROM azul/zulu-openjdk:21 AS release
1010

11-
COPY --from=build /target/*.jar /app.jar
11+
ARG OTEL_AGENT_VERSION=v1.32.0
1212

13-
ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.30.0/opentelemetry-javaagent.jar /
13+
WORKDIR /
1414

15-
COPY docker-entrypoint.sh /
15+
COPY --from=build /target/*.jar app.jar
1616

17-
RUN chmod +x /docker-entrypoint.sh
17+
COPY docker-entrypoint.sh .
18+
19+
RUN useradd billionaire && \
20+
chmod +x docker-entrypoint.sh && \
21+
apt-get update && \
22+
apt-get install -y curl && \
23+
curl -fsSL -o opentelemetry-javaagent.jar https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/${OTEL_AGENT_VERSION}/opentelemetry-javaagent.jar && \
24+
apt-get purge -y --auto-remove curl && \
25+
rm -rf /var/lib/apt/lists/*
26+
27+
USER billionaire
28+
29+
EXPOSE 8080
1830

1931
ENTRYPOINT ["/docker-entrypoint.sh"]

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ install:
66
test:
77
@mvn clean test
88

9+
build:
10+
@VERSION=$$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) && \
11+
docker build . -t "billionaire-api:$$VERSION" --file Dockerfile
12+
913
version:
1014
@mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$1
1115

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Esta arquitetura consiste em diminuir a concorrência entre transações da API
1717
</br>
1818

1919
[![node](https://img.shields.io/badge/Azul_Zulu_OpenJDK-21-red.svg)](https://www.azul.com/downloads/?package=jdk#zulu)
20-
[![node](https://img.shields.io/badge/Spring_Boot-3.1.4-green.svg)](https://spring.io/)
20+
[![node](https://img.shields.io/badge/Spring_Boot-3.2.2-green.svg)](https://spring.io/)
2121
[![node](https://img.shields.io/badge/MySQL-8.0.28-blue.svg)](https://www.mysql.com/)
2222

2323

docker-entrypoint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://host.docker.internal:4317
1212
export OTEL_LOGS_EXPORTER=none
1313
export OTEL_SERVICE_NAME=billionaire-api
1414

15-
exec java -Dspring.profiles.active=docker -javaagent:/opentelemetry-javaagent.jar -jar /app.jar
15+
exec java -Dspring.profiles.active=docker -javaagent:opentelemetry-javaagent.jar -jar app.jar

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>3.1.4</version>
8+
<version>3.2.2</version>
99
<relativePath/>
1010
</parent>
1111

1212
<groupId>br.com.multidatasources</groupId>
1313
<artifactId>multidatasources</artifactId>
14-
<version>0.0.1-SNAPSHOT</version>
14+
<version>0.0.1</version>
1515
<name>multidatasources</name>
1616

1717
<properties>
@@ -20,7 +20,7 @@
2020
<maven.compiler.target>${java.version}</maven.compiler.target>
2121
<mapstruct.version>1.5.5.Final</mapstruct.version>
2222
<logstash-logback-encoder.version>7.4</logstash-logback-encoder.version>
23-
<springdoc-openapi-starter-webmvc-ui.version>2.2.0</springdoc-openapi-starter-webmvc-ui.version>
23+
<springdoc-openapi-starter-webmvc-ui.version>2.3.0</springdoc-openapi-starter-webmvc-ui.version>
2424
<snakeyaml.version>2.2</snakeyaml.version>
2525
<h2.version>2.2.220</h2.version>
2626
<opentelemetry.version>1.30.0</opentelemetry.version>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package br.com.multidatasources.service.v1.idempotency;
2+
3+
public enum Algorithm {
4+
5+
SHA_256("SHA-256");
6+
7+
private final String value;
8+
9+
Algorithm(final String value) {
10+
this.value = value;
11+
}
12+
13+
public String value() {
14+
return this.value;
15+
}
16+
17+
}
Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
package br.com.multidatasources.service.v1.idempotency.impl;
22

33
import br.com.multidatasources.model.IdempotentEntity;
4+
import br.com.multidatasources.service.v1.idempotency.Algorithm;
45
import br.com.multidatasources.service.v1.idempotency.IdempotencyGenerator;
6+
import br.com.multidatasources.util.JsonUtils;
57
import org.springframework.stereotype.Component;
68

7-
import java.nio.ByteBuffer;
9+
import java.nio.charset.StandardCharsets;
10+
import java.security.MessageDigest;
11+
import java.security.NoSuchAlgorithmException;
812
import java.util.UUID;
913

1014
@Component
1115
public class UUIDIdempotencyGenerator implements IdempotencyGenerator {
1216

1317
@Override
1418
public UUID generate(final IdempotentEntity data) {
15-
final var byteBuffer = ByteBuffer.allocate(Long.BYTES);
16-
final var bytes = byteBuffer.putLong(data.hashCode()).array();
17-
return UUID.nameUUIDFromBytes(bytes);
19+
try {
20+
final var messageDigest = MessageDigest.getInstance(Algorithm.SHA_256.value());
21+
final var jsonDataBytes = JsonUtils.toJson(data).getBytes(StandardCharsets.UTF_8);
22+
return UUID.nameUUIDFromBytes(messageDigest.digest(jsonDataBytes));
23+
} catch (final NoSuchAlgorithmException ex) {
24+
throw new IllegalStateException("Algorithm not found", ex);
25+
}
1826
}
1927

2028
}

src/test/java/br/com/multidatasources/service/v1/BillionaireServiceNewTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import br.com.multidatasources.model.Billionaire;
44
import br.com.multidatasources.repository.BillionaireRepository;
5-
import br.com.multidatasources.service.v1.BillionaireService;
65
import br.com.multidatasources.service.v1.idempotency.impl.UUIDIdempotencyGenerator;
76
import jakarta.persistence.EntityExistsException;
87
import jakarta.persistence.EntityNotFoundException;
@@ -23,7 +22,6 @@
2322
import static org.mockito.ArgumentMatchers.any;
2423
import static org.mockito.Mockito.doNothing;
2524
import static org.mockito.Mockito.mock;
26-
import static org.mockito.Mockito.times;
2725
import static org.mockito.Mockito.verify;
2826

2927
class BillionaireServiceNewTest {
@@ -115,7 +113,7 @@ void givenAnExistentBillionaire_whenSave_thenThrowsEntityExistsException() {
115113
.then()
116114
.exceptionAsserter()
117115
.isInstanceOf(EntityExistsException.class)
118-
.messageIsEqualTo("Register has exists with idempotency ID: c2ea0bd8-516b-34d1-bc47-7645b8c2e524");
116+
.messageIsEqualTo("Register has exists with idempotency ID: 6a93b53d-93fc-302d-af9e-0c6d4dc80d43");
119117
}
120118

121119
@Test
@@ -301,7 +299,7 @@ void careerIsEqualTo(final String expected) {
301299
}
302300

303301
void verifyRepositoryDeleteMethodHasCalled() {
304-
verify(billionaireRepository, times(1)).delete(expected);
302+
verify(billionaireRepository).delete(expected);
305303
}
306304

307305
}

src/test/java/br/com/multidatasources/service/v1/BillionaireServiceOldTest.java

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
import br.com.multidatasources.model.Billionaire;
44
import br.com.multidatasources.model.factory.BillionaireBuilder;
55
import br.com.multidatasources.repository.BillionaireRepository;
6-
import br.com.multidatasources.service.v1.BillionaireService;
76
import br.com.multidatasources.service.v1.idempotency.IdempotencyGenerator;
87
import jakarta.persistence.EntityExistsException;
98
import jakarta.persistence.EntityNotFoundException;
10-
import org.junit.jupiter.api.Assertions;
119
import org.junit.jupiter.api.Test;
1210
import org.junit.jupiter.api.extension.ExtendWith;
1311
import org.mockito.InjectMocks;
@@ -25,7 +23,7 @@
2523
import static org.mockito.ArgumentMatchers.any;
2624
import static org.mockito.ArgumentMatchers.anyLong;
2725
import static org.mockito.Mockito.doNothing;
28-
import static org.mockito.Mockito.times;
26+
import static org.mockito.Mockito.never;
2927
import static org.mockito.Mockito.verify;
3028
import static org.mockito.Mockito.when;
3129

@@ -43,7 +41,7 @@ class BillionaireServiceOldTest {
4341

4442
@Test
4543
void givenAValidBillionaireId_whenFindBillionaireById_thenReturnASameBillionaireInformed() {
46-
Billionaire expected = BillionaireBuilder.builder()
44+
final var expected = BillionaireBuilder.builder()
4745
.id(1L)
4846
.firstName("John")
4947
.lastName("Doe")
@@ -52,35 +50,33 @@ void givenAValidBillionaireId_whenFindBillionaireById_thenReturnASameBillionaire
5250

5351
when(billionaireRepository.findById(anyLong())).thenReturn(Optional.of(expected));
5452

55-
Billionaire actual = subject.findById(1L);
53+
final var actual = subject.findById(1L);
5654

5755
assertThat(actual).usingRecursiveComparison().isEqualTo(expected);
5856
}
5957

6058
@Test
6159
void givenAInvalidBillionaireId_whenFindBillionaireById_thenThrowEntityNotFoundException() {
62-
when(billionaireRepository.findById(anyLong())).thenThrow(new EntityNotFoundException());
60+
when(billionaireRepository.findById(anyLong())).thenReturn(Optional.empty());
6361

64-
Assertions.assertThrows(
65-
EntityNotFoundException.class,
66-
() -> subject.findById(2L),
67-
"Register with id 2 not found"
68-
);
62+
assertThatThrownBy(() -> subject.findById(2L))
63+
.isExactlyInstanceOf(EntityNotFoundException.class)
64+
.hasMessage("Register with id 2 not found");
6965
}
7066

7167
@Test
7268
void givenATwoBillionaires_whenFindAll_thenReturnListWithTwoRegistries() {
73-
Billionaire billionaireOne = BillionaireBuilder.builder()
69+
final var billionaireOne = BillionaireBuilder.builder()
7470
.id(1L)
7571
.firstName("John")
7672
.lastName("Doe")
7773
.career("Software Developer")
7874
.build();
7975

80-
Billionaire billionaireTwo = BillionaireBuilder.builder()
76+
final var billionaireTwo = BillionaireBuilder.builder()
8177
.id(2L)
8278
.firstName("Richard")
83-
.lastName("Roe")
79+
.lastName("Doe")
8480
.career("Software Developer")
8581
.build();
8682

@@ -90,15 +86,16 @@ void givenATwoBillionaires_whenFindAll_thenReturnListWithTwoRegistries() {
9086

9187
List<Billionaire> actual = subject.findAll();
9288

93-
assertThat(actual).hasSize(2);
94-
assertThat(actual).usingRecursiveComparison().isEqualTo(actual);
89+
assertThat(actual)
90+
.hasSize(2)
91+
.containsExactlyElementsOf(expected);
9592
}
9693

9794
@Test
9895
void givenEmptyDataBillionaires_whenFindAll_thenReturnListWithZeroRegistries() {
9996
when(billionaireRepository.findAll()).thenReturn(Collections.emptyList());
10097

101-
List<Billionaire> actual = subject.findAll();
98+
final var actual = subject.findAll();
10299

103100
assertThat(actual).isEmpty();
104101
}
@@ -120,8 +117,8 @@ void givenANewBillionaire_whenSave_thenReturnASameBillionaireSaved() {
120117

121118
Billionaire actual = subject.save(expected);
122119

123-
assertThat(actual).usingRecursiveComparison().isEqualTo(expected);
124-
verify(billionaireRepository, times(1)).save(any(Billionaire.class));
120+
assertThat(actual).isEqualTo(expected);
121+
verify(billionaireRepository).save(any(Billionaire.class));
125122
}
126123

127124
@Test
@@ -142,23 +139,24 @@ void givenAnExistentBillionaire_whenSave_thenThrowsEntityExistsException() {
142139
.isExactlyInstanceOf(EntityExistsException.class)
143140
.hasMessage("Register has exists with idempotency ID: %s".formatted(idempotencyId));
144141

145-
verify(billionaireRepository, times(0)).save(any(Billionaire.class));
142+
verify(billionaireRepository, never()).save(any(Billionaire.class));
146143
}
147144

148145
@Test
149146
void givenAValidBillionaire_whenDelete_thenRepositoryDeleteMethodHasCalledOneTimes() {
150-
Billionaire billionaire = BillionaireBuilder.builder()
147+
final var billionaire = BillionaireBuilder.builder()
151148
.id(1L)
152149
.firstName("John")
153150
.lastName("Doe")
154151
.career("Software Developer")
155152
.build();
156153

157-
doNothing().when(billionaireRepository).delete(any(Billionaire.class));
154+
doNothing()
155+
.when(billionaireRepository).delete(any(Billionaire.class));
158156

159157
subject.delete(billionaire);
160158

161-
verify(billionaireRepository, times(1)).delete(any(Billionaire.class));
159+
verify(billionaireRepository).delete(any(Billionaire.class));
162160
}
163161

164162
}

src/test/resources/application-test.properties

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

0 commit comments

Comments
 (0)