Skip to content

Commit eb4a159

Browse files
Merge branch 'main' into tests/issue-#103-integration-tests-for-SignUpResource
2 parents b936c75 + 9c070f2 commit eb4a159

File tree

15 files changed

+258
-138
lines changed

15 files changed

+258
-138
lines changed

.github/workflows/pipeline.yml

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ concurrency:
1515

1616
jobs:
1717
timeless-api:
18-
name: Build & Test - Timeless API (Java)
18+
name: Build & Publish - Timeless API (Java)
1919
runs-on: ubuntu-latest
2020
defaults:
2121
run:
22-
working-directory: ./timeless-api
22+
working-directory: timeless-api
2323

2424
steps:
2525
- name: Checkout
@@ -54,17 +54,28 @@ jobs:
5454
- name: Ensure Maven wrapper is executable
5555
run: chmod +x mvnw
5656

57+
- name: Set up Podman
58+
uses: gacts/install-podman@v1
59+
id: podman
60+
61+
- name: Login to Quay.io
62+
uses: docker/login-action@v3
63+
with:
64+
registry: quay.io
65+
username: ${{ secrets.QUAY_USERNAME }}
66+
password: ${{ secrets.QUAY_PASSWORD }}
67+
5768
- name: Build with unit and integration tests
58-
run: ./mvnw -B -ntp formatter:validate impsort:check package
69+
run: mvn -B -ntp formatter:validate impsort:check package -Dquarkus.container-image.build=true -Dquarkus.container-image.registry=quay.io -Dquarkus.container-image.group=timeless -Dquarkus.container-image.name=timeless-api -Dquarkus.container-image.tag=${{ github.sha }}
5970
env:
6071
CHROME_BIN: ${{ steps.chrome.outputs.chrome-path }}
6172

6273
whatsapp:
63-
name: Lint - WhatsApp
74+
name: Build & Publish - WhatsApp
6475
runs-on: ubuntu-latest
6576
defaults:
6677
run:
67-
working-directory: ./whatsapp
78+
working-directory: whatsapp
6879

6980
steps:
7081
- name: Checkout
@@ -83,4 +94,21 @@ jobs:
8394
- name: Check code formatting with Prettier
8495
run: npm run prettier:check
8596

97+
- name: Install pack CLI
98+
uses: buildpacks/github-actions/[email protected]
8699

100+
- name: Login to Quay.io
101+
uses: docker/login-action@v3
102+
with:
103+
registry: quay.io
104+
username: ${{ secrets.QUAY_USERNAME }}
105+
password: ${{ secrets.QUAY_PASSWORD }}
106+
107+
- name: Build and publish WhatsApp image with Buildpacks
108+
run: |
109+
pack build quay.io/timeless/whatsapp:${{ github.sha }} \
110+
--path whatsapp \
111+
--builder paketobuildpacks/builder-jammy-base \
112+
--buildpack paketo-community/apt \
113+
--buildpack paketo-buildpacks/nodejs \
114+
--publish

timeless-api/pom.xml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
53
<modelVersion>4.0.0</modelVersion>
64
<groupId>dev.matheuscruz</groupId>
75
<artifactId>timeless-api</artifactId>
@@ -14,10 +12,10 @@
1412
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
1513
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
1614
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
17-
<quarkus.platform.version>3.30.2</quarkus.platform.version>
15+
<quarkus.platform.version>3.30.3</quarkus.platform.version>
1816
<skipITs>true</skipITs>
1917
<surefire-plugin.version>3.5.4</surefire-plugin.version>
20-
<quarkus-quinoa.version>2.7.0</quarkus-quinoa.version>
18+
<quarkus-quinoa.version>2.7.1</quarkus-quinoa.version>
2119
<jbcrypt.version>0.4</jbcrypt.version>
2220
<quarkus-langchain4j-openai.version>1.4.2</quarkus-langchain4j-openai.version>
2321
<assertj.version>3.27.6</assertj.version>
@@ -107,6 +105,10 @@
107105
<artifactId>quarkus-scheduler</artifactId>
108106
</dependency>
109107
<!-- test dependencies -->
108+
<dependency>
109+
<groupId>io.quarkus</groupId>
110+
<artifactId>quarkus-container-image-buildpack</artifactId>
111+
</dependency>
110112
<dependency>
111113
<groupId>org.assertj</groupId>
112114
<artifactId>assertj-core</artifactId>
@@ -173,9 +175,7 @@
173175
</executions>
174176
<configuration>
175177
<systemPropertyVariables>
176-
<native.image.path>
177-
${project.build.directory}/${project.build.finalName}-runner
178-
</native.image.path>
178+
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
179179
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
180180
<maven.home>${maven.home}</maven.home>
181181
</systemPropertyVariables>

timeless-api/src/main/java/dev/matheuscruz/domain/User.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,29 @@ public class User {
3232
@Column(unique = true, name = "phone_number")
3333
private String phoneNumber;
3434

35-
public static User create(String email, String password, String firstName, String lastName) {
35+
public static User create(String email, String password, String firstName, String lastName, String phoneNumber) {
3636
return new User(Objects.requireNonNull(email), Objects.requireNonNull(password),
37-
Objects.requireNonNull(firstName), Objects.requireNonNull(lastName));
37+
Objects.requireNonNull(firstName), Objects.requireNonNull(lastName),
38+
Objects.requireNonNull(phoneNumber));
39+
}
40+
41+
public void update(String firstName, String lastName, String email, String phoneNumber) {
42+
this.firstName = Objects.requireNonNull(firstName);
43+
this.lastName = Objects.requireNonNull(lastName);
44+
this.email = Objects.requireNonNull(email);
45+
this.phoneNumber = Objects.requireNonNull(phoneNumber);
3846
}
3947

4048
protected User() {
4149
}
4250

43-
private User(String email, String password, String firstName, String lastName) {
51+
private User(String email, String password, String firstName, String lastName, String phoneNumber) {
4452
this.id = UUID.randomUUID().toString();
4553
this.email = email;
4654
this.password = password;
4755
this.firstName = firstName;
4856
this.lastName = lastName;
57+
this.phoneNumber = phoneNumber;
4958
}
5059

5160
public String getId() {
@@ -79,8 +88,4 @@ public String fullName() {
7988
public void addPhoneNumber(String phoneNumber) {
8089
this.phoneNumber = phoneNumber;
8190
}
82-
83-
public Boolean hasPhoneNumber() {
84-
return this.phoneNumber != null;
85-
}
8691
}

timeless-api/src/main/java/dev/matheuscruz/presentation/SignInResource.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,12 @@ public Response signIn(@Valid SignInRequest req) {
4141
String token = Jwt.upn(user.getId()).groups(Set.of(Groups.USER.groupName())).expiresIn(Duration.ofDays(1))
4242
.sign();
4343

44-
return Response.ok(new SignInResponse(token, user.getId(), user.fullName(), req.email(), user.hasPhoneNumber()))
45-
.build();
44+
return Response.ok(new SignInResponse(token, user.getId(), user.fullName(), req.email())).build();
4645
}
4746

4847
public record SignInRequest(@Email String email, @NotBlank @Size(min = 8, max = 32) String password) {
4948
}
5049

51-
public record SignInResponse(String token, String id, String name, String email, Boolean hasPhoneNumber) {
50+
public record SignInResponse(String token, String id, String name, String email) {
5251
}
5352
}

timeless-api/src/main/java/dev/matheuscruz/presentation/SignUpResource.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public Response signUp(@Valid SignUpRequest req) {
3636
.entity(new Problem("Este nome de usuário já foi usado. Tente outro.")).build();
3737
}
3838

39-
User user = User.create(req.email(), BCryptAdapter.encrypt(req.password()), req.firstName(), req.lastName());
39+
User user = User.create(req.email(), BCryptAdapter.encrypt(req.password()), req.firstName(), req.lastName(),
40+
req.phoneNumber());
4041

4142
QuarkusTransaction.requiringNew().run(() -> {
4243
this.userRepository.persist(user);
@@ -45,7 +46,7 @@ public Response signUp(@Valid SignUpRequest req) {
4546
return Response.status(Response.Status.CREATED).entity(new SignUpResponse(user.getId(), user.getEmail()))
4647
.build();
4748
}
48-
49+
4950
public record SignUpRequest(@NotBlank @Email String email, @NotBlank @Size(min = 8, max = 32) String password,
5051
@NotBlank String firstName, @NotBlank String lastName) {
5152
}

timeless-api/src/main/java/dev/matheuscruz/presentation/UserResource.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import jakarta.ws.rs.ForbiddenException;
88
import jakarta.ws.rs.GET;
99
import jakarta.ws.rs.NotFoundException;
10-
import jakarta.ws.rs.PATCH;
10+
import jakarta.ws.rs.PUT;
1111
import jakarta.ws.rs.Path;
1212
import jakarta.ws.rs.PathParam;
1313
import jakarta.ws.rs.core.Response;
@@ -21,14 +21,14 @@ public UserResource(UserRepository userRepository) {
2121
this.userRepository = userRepository;
2222
}
2323

24-
@PATCH
24+
@PUT
2525
@Transactional
26-
public Response update(PatchUserRequest req) {
26+
public Response update(UpdateUserRequest req) {
2727

2828
User user = this.userRepository.find("id = :id", Parameters.with("id", req.id())).firstResultOptional()
2929
.orElseThrow(NotFoundException::new);
3030

31-
user.addPhoneNumber(req.phoneNumber());
31+
user.update(req.firstName(), req.lastName(), req.email(), req.phoneNumber());
3232

3333
this.userRepository.persistAndFlush(user);
3434

@@ -46,7 +46,7 @@ public Response getUserInfo(@PathParam("id") String userId) {
4646
user.getFirstName(), user.getLastName(), user.getPhoneNumber() != null)).build();
4747
}
4848

49-
public record PatchUserRequest(String phoneNumber, String id) {
49+
public record UpdateUserRequest(String firstName, String lastName, String email, String phoneNumber, String id) {
5050
}
5151

5252
public record UserInfoResponse(String id, String email, String phoneNumber, String firstName, String lastName,

0 commit comments

Comments
 (0)