Skip to content

Commit 28ad373

Browse files
committed
Find users query fixes
1 parent 0f1dc5c commit 28ad373

File tree

10 files changed

+67
-41
lines changed

10 files changed

+67
-41
lines changed

src/main/java/com/github/throyer/common/springboot/domain/repositories/RoleRepository.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public interface RoleRepository extends SoftDeleteRepository<Role> {
2828
),
2929
initials = NULL,
3030
deleted_at = CURRENT_TIMESTAMP,
31-
active = 0,
31+
active = false,
3232
deleted_by = ?#{principal?.id}
3333
WHERE id = ?1
3434
""")

src/main/java/com/github/throyer/common/springboot/domain/services/email/MailService.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class MailService {
2222
private JavaMailSender sender;
2323

2424
private static Logger LOGGER = LoggerFactory.getLogger(MailService.class);
25-
private static String ERROR_MESSAGE = "Erro ao enviar email.";
25+
private static String ERROR_MESSAGE = "Error sending email.";
2626
private static final Boolean CONTENT_IS_HTML = true;
2727

2828
public void send(Email email) {
@@ -33,7 +33,7 @@ public void send(Email email) {
3333
helper.setSubject(email.getSubject());
3434
helper.setText(engine.process(email.getTemplate(), email.getContext()), CONTENT_IS_HTML);
3535
sender.send(message);
36-
LOGGER.info("Email enviado com sucesso para: {}", email.getDestination());
36+
LOGGER.info("Email successfully sent to: {}", email.getDestination());
3737
} catch (MessagingException | MailException exception) {
3838
LOGGER.error(ERROR_MESSAGE, exception);
3939
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, ERROR_MESSAGE);

src/main/java/com/github/throyer/common/springboot/domain/services/security/dto/RefreshTokenRequest.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package com.github.throyer.common.springboot.domain.services.security.dto;
22

33
import javax.validation.constraints.NotEmpty;
4-
import javax.validation.constraints.NotNull;
54

65
import com.fasterxml.jackson.annotation.JsonProperty;
76

87
public class RefreshTokenRequest {
98

10-
@NotNull(message = "refresh_token não pode NULO.")
11-
@NotEmpty(message = "refresh_token invalido.")
9+
@NotEmpty(message = "Invalid refresh_token.")
1210
@JsonProperty("refresh_token")
1311
private String refresh;
1412

src/main/java/com/github/throyer/common/springboot/domain/services/security/dto/TokenRequest.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@
22

33
import java.util.Objects;
44
import javax.validation.constraints.NotEmpty;
5-
import javax.validation.constraints.NotNull;
65

76
public class TokenRequest {
87

9-
@NotNull(message = "O Email não pode ser NULO.")
10-
@NotEmpty(message = "Email invalido.")
8+
@NotEmpty(message = "Invalid email.")
119
private String email;
1210

13-
@NotNull(message = "A Senha não pode ser NULA.")
14-
@NotEmpty(message = "Senha invalida.")
11+
@NotEmpty(message = "Invalid password.")
1512
private String password;
1613

1714
public void setEmail(String email) {

src/main/java/com/github/throyer/common/springboot/domain/services/user/FindUserService.java

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ ur.user_id, string_agg(r.initials, ',') roles
5151
from
5252
"user" u
5353
left join user_roles as urs on urs.user_id = u.id
54+
where u.deleted_at is null
5455
""";
5556

5657
var query = manager.createNativeQuery(sql, Tuple.class);

src/main/java/com/github/throyer/common/springboot/domain/services/user/UpdateUserService.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ public ResponseEntity<UserDetails> update(Long id, UpdateUser body) {
2424

2525
authorized()
2626
.filter(authorized -> authorized.cantModify(id))
27-
.orElseThrow(() -> unauthorized("Permissão invalida atualização de recurso"));
27+
.orElseThrow(() -> unauthorized("Permission invalidates resource update"));
2828

2929
var actual = repository
3030
.findOptionalByIdAndDeletedAtIsNullFetchRoles(id)
31-
.orElseThrow(() -> notFound("Usuário não encontrado"));
31+
.orElseThrow(() -> notFound("User not found"));
3232

3333
validateEmailUniquenessOnModify(body, actual);
3434

src/main/java/com/github/throyer/common/springboot/domain/services/user/dto/CreateUserApi.java

+8-11
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,22 @@
99
import com.github.throyer.common.springboot.domain.builders.UserBuilder;
1010
import com.github.throyer.common.springboot.domain.models.entity.User;
1111
import com.github.throyer.common.springboot.domain.models.shared.HasEmail;
12+
import javax.validation.constraints.Size;
1213
import lombok.Data;
1314

1415
@Data
1516
public class CreateUserApi implements HasEmail {
1617

17-
public static final String DEFAULT_PASSWORD = "mudar123";
18-
public static final String STRONG_PASSWORD = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$ %^&*-]).{8,}$";
19-
public static final String STRONG_PASSWORD_MESSAGE = "No mínimo 8 caracteres, com no mínimo um número, um caractere especial, uma letra maiúscula e uma letra minúscula.";
20-
21-
@NotEmpty(message = "Por favor, forneça um nome.")
18+
@NotEmpty(message = "email is a required field.")
2219
private String name;
23-
24-
@NotEmpty(message = "Por favor, forneça um e-mail.")
25-
@Email(message = "Por favor, forneça um e-mail valido.")
20+
21+
@NotEmpty(message = "email is a required field.")
22+
@Email(message = "invalid email.")
2623
private String email;
2724

28-
@NotEmpty(message = "Por favor, forneça uma senha.")
29-
@Pattern(regexp = STRONG_PASSWORD, message = STRONG_PASSWORD_MESSAGE)
30-
private String password = DEFAULT_PASSWORD;
25+
@NotEmpty(message = "password is a required field.")
26+
@Size(min = 8, max = 155, message = "The password must contain at least {min} characters.")
27+
private String password;
3128

3229
public CreateUserApi(String name, String email, String password) {
3330
setName(name);

src/main/java/com/github/throyer/common/springboot/domain/services/user/dto/CreateUserApp.java

-4
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,9 @@
77
import com.github.throyer.common.springboot.domain.models.entity.User;
88
import com.github.throyer.common.springboot.domain.models.shared.HasEmail;
99

10-
import static com.github.throyer.common.springboot.domain.services.user.dto.CreateUserApi.STRONG_PASSWORD;
11-
import static com.github.throyer.common.springboot.domain.services.user.dto.CreateUserApi.STRONG_PASSWORD_MESSAGE;
1210

1311
import javax.validation.constraints.Email;
14-
import javax.validation.constraints.Min;
1512
import javax.validation.constraints.NotEmpty;
16-
import javax.validation.constraints.Pattern;
1713
import javax.validation.constraints.Size;
1814

1915
import lombok.Data;

src/main/java/com/github/throyer/common/springboot/domain/validation/EmailValidations.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class EmailValidations {
1616
private static UserRepository repository;
1717

1818
private static String FIELD = "email";
19-
private static String MESSAGE = "Este email já foi utilizado por outro usuário. Por favor utilize um email diferente.";
19+
private static String MESSAGE = "This email has already been used by another user. Please use a different email.";
2020

2121
private static final List<SimpleError> EMAIL_ERROR = List.of(new SimpleError(FIELD, MESSAGE));
2222

src/test/java/com/github/throyer/common/springboot/controllers/UsersTests.java

+49-12
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,20 @@
55
import static com.github.throyer.common.springboot.utils.Random.password;
66
import static com.github.throyer.common.springboot.utils.Random.randomUser;
77
import static com.github.throyer.common.springboot.utils.TokenUtils.token;
8-
import static org.hamcrest.Matchers.greaterThan;
9-
import static org.hamcrest.Matchers.hasSize;
108
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
119
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
1210
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
1311
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
1412
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
1513
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
1614

15+
import static org.springframework.http.HttpHeaders.AUTHORIZATION;
16+
import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
17+
import static org.springframework.http.MediaType.APPLICATION_JSON;
18+
19+
import static java.lang.String.format;
20+
import static org.hamcrest.Matchers.*;
21+
1722
import java.util.List;
1823
import java.util.Map;
1924

@@ -29,8 +34,7 @@
2934
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
3035
import org.springframework.boot.test.context.SpringBootTest;
3136
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
32-
import org.springframework.http.HttpHeaders;
33-
import org.springframework.http.MediaType;
37+
3438
import org.springframework.test.annotation.DirtiesContext;
3539
import org.springframework.test.annotation.DirtiesContext.ClassMode;
3640
import org.springframework.test.web.servlet.MockMvc;
@@ -75,7 +79,7 @@ public void should_save_a_new_user() throws Exception {
7579

7680
var request = post("/api/users")
7781
.content(json)
78-
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
82+
.header(CONTENT_TYPE, APPLICATION_JSON);
7983

8084
api.perform(request)
8185
.andDo(print())
@@ -95,7 +99,7 @@ public void should_return_400_saving_user_without_required_fields() throws Excep
9599

96100
var request = post("/api/users")
97101
.content(payload)
98-
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
102+
.header(CONTENT_TYPE, APPLICATION_JSON);
99103

100104
api.perform(request)
101105
.andDo(print())
@@ -111,7 +115,7 @@ public void should_list_users() throws Exception {
111115
repository.saveAll(List.of(randomUser(), randomUser(), randomUser(), randomUser()));
112116

113117
var request = get("/api/users")
114-
.header(HttpHeaders.AUTHORIZATION, header)
118+
.header(AUTHORIZATION, header)
115119
.queryParam("page", "0")
116120
.queryParam("size", "10");
117121

@@ -120,6 +124,39 @@ public void should_list_users() throws Exception {
120124
.andExpect(jsonPath("$.content").isArray())
121125
.andExpect(jsonPath("$.content", hasSize(greaterThan(3))));
122126
}
127+
128+
@Test
129+
@DisplayName("Must not list deleted users.")
130+
public void must_not_list_deleted_users() throws Exception {
131+
132+
var user = repository.save(randomUser());
133+
var id = user.getId();
134+
var expression = format("$.content[?(@.id == %s)].id", id);
135+
136+
var first = get("/api/users")
137+
.header(AUTHORIZATION, header)
138+
.queryParam("page", "0")
139+
.queryParam("size", "10");
140+
141+
api.perform(first).andDo(print())
142+
.andExpect(status().isOk())
143+
.andExpect(jsonPath(expression, hasItem(id.intValue())));
144+
145+
var second = delete(String.format("/api/users/%s", id))
146+
.header(AUTHORIZATION, header);
147+
148+
api.perform(second).andDo(print())
149+
.andExpect(status().isNoContent());
150+
151+
var third = get("/api/users")
152+
.header(AUTHORIZATION, header)
153+
.queryParam("page", "0")
154+
.queryParam("size", "10");
155+
156+
api.perform(third).andDo(print())
157+
.andExpect(status().isOk())
158+
.andExpect(jsonPath(format("$.content[?(@.id == %s)].id", id.intValue())).isEmpty());
159+
}
123160

124161
@Test
125162
@DisplayName("Deve deletar usuário.")
@@ -128,7 +165,7 @@ public void should_delete_user() throws Exception {
128165
var user = repository.save(randomUser());
129166

130167
var request = delete(String.format("/api/users/%s", user.getId()))
131-
.header(HttpHeaders.AUTHORIZATION, header);
168+
.header(AUTHORIZATION, header);
132169

133170
api.perform(request).andDo(print())
134171
.andExpect(status().isNoContent());
@@ -140,13 +177,13 @@ public void should_return_404_after_delete_user() throws Exception {
140177
var user = repository.save(randomUser());
141178

142179
var fist = delete(String.format("/api/users/%s", user.getId()))
143-
.header(HttpHeaders.AUTHORIZATION, header);
180+
.header(AUTHORIZATION, header);
144181

145182
api.perform(fist).andDo(print())
146183
.andExpect(status().isNoContent());
147184

148185
var second = delete(String.format("/api/users/%s", user.getId()))
149-
.header(HttpHeaders.AUTHORIZATION, header);
186+
.header(AUTHORIZATION, header);
150187

151188
api.perform(second).andDo(print())
152189
.andExpect(status().isNotFound());
@@ -164,7 +201,7 @@ public void should_return_400_after_save_same_email() throws Exception {
164201

165202
var first = post("/api/users")
166203
.content(json)
167-
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
204+
.header(CONTENT_TYPE, APPLICATION_JSON);
168205

169206
api.perform(first)
170207
.andDo(print())
@@ -174,7 +211,7 @@ public void should_return_400_after_save_same_email() throws Exception {
174211

175212
var second = post("/api/users")
176213
.content(json)
177-
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
214+
.header(CONTENT_TYPE, APPLICATION_JSON);
178215

179216
api.perform(second)
180217
.andDo(print())

0 commit comments

Comments
 (0)