Skip to content

Commit 1860201

Browse files
committed
refactor api endpoints
Took 1 minute
1 parent b649a79 commit 1860201

15 files changed

+50
-36
lines changed

src/main/java/com/github/gribanoveu/cuddle/config/SecurityConfig.java

-2
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
5353
.requestMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html").permitAll()
5454

5555
// authenticated scope
56-
.requestMatchers("*/users/**").hasAnyAuthority(ADMIN.scope(), MODERATOR.scope())
5756
.requestMatchers("*/moderator/**").hasAnyAuthority(ADMIN.scope(), MODERATOR.scope())
5857
.requestMatchers("*/role/**").hasAnyAuthority(ADMIN.scope())
59-
6058
.anyRequest().authenticated()
6159
)
6260
.sessionManagement(manager -> manager

src/main/java/com/github/gribanoveu/cuddle/config/SwaggerConfig.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
*/
1414
@Configuration
1515
@OpenAPIDefinition(info = @Info(
16-
title = "Spring Api",
17-
description = "Описание Api", version = "0.1.0",
16+
title = "Spring auth backend service",
17+
description = "Сервис авторизации и управления пользователями для мобильного приложения", version = "1.0.0",
1818
contact = @Contact(
1919
name = "Evgeny Gribanov",
20-
email = "egribanov@yandex.com",
20+
email = "gribanoveu@yandex.com",
2121
url = "https://codecow.pw"
2222
)
2323
))

src/main/java/com/github/gribanoveu/cuddle/constants/Constants.java

+2
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@
1010
public class Constants {
1111
public static final DateTimeFormatter DEFAULT_TIME_FORMAT =
1212
DateTimeFormatter.ofPattern("dd MMM yyyy HH:mm", Locale.forLanguageTag("ru"));
13+
14+
public static final String USER_DISABLED_MESSAGE = "Пользователь отключен";
1315
}

src/main/java/com/github/gribanoveu/cuddle/constants/EmailMessages.java

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public class EmailMessages {
2323

2424
public static final String deleteSubject = "Ваш аккаунт удален";
2525
public static final String deleteModerTemplate = "user-deleted-moder";
26+
public static final String deleteSelfTemplate = "user-deleted";
2627

2728
public static final String disabledSubject = "Действие вашего аккаунта приостановлено";
2829
public static final String disabledTemplate = "account-disabled";

src/main/java/com/github/gribanoveu/cuddle/controllers/anonymous/PublicAccountControllerImpl.java

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public ResponseEntity<StatusResponse> registerUser(RegisterDto request) {
7474
public ResponseEntity<StatusResponse> changeEmail(ChangeEmailDto request, Authentication authentication) {
7575
var user = userService.findUserByEmail(authentication.getName());
7676
var oldEmail = user.getEmail();
77+
if (request.email().equals(oldEmail)) throw new CredentialEx(ResponseCode.EMAIL_ALREADY_EXIST);
7778
userService.updateEmail(user, request.email());
7879
emailService.sendMail(EmailTemplates.emailChanged(oldEmail, request.email()));
7980
log.info("Email change old email: {}, new email: {}", oldEmail, request.email());

src/main/java/com/github/gribanoveu/cuddle/controllers/secure/ModeratorControllerImpl.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ public ResponseEntity<?> getAllUsersList(Pageable pageable) {
3535
return ResponseEntity.ok(UsersResponse.create(OK, userService.getAllUsers(pageable)));
3636
}
3737

38-
public ResponseEntity<?> deleteUser(Long userId) {
39-
var user = userService.findUserById(userId);
40-
userService.deleteUserById(userId);
38+
public ResponseEntity<?> deleteUser(String email) {
39+
var user = userService.findUserByEmail(email);
40+
userService.deleteUserByEmail(email);
4141
emailService.sendMail(EmailTemplates.simpleEmail(user.getEmail(),
4242
EmailMessages.deleteSubject, EmailMessages.deleteModerTemplate));
4343
return ResponseEntity.ok(StatusResponse.create(ResponseCode.USER_DELETED, StatusLevel.SUCCESS));

src/main/java/com/github/gribanoveu/cuddle/controllers/secure/UserControllerImpl.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.github.gribanoveu.cuddle.controllers.secure;
22

3+
import com.github.gribanoveu.cuddle.constants.EmailMessages;
34
import com.github.gribanoveu.cuddle.dtos.enums.ResponseCode;
45
import com.github.gribanoveu.cuddle.dtos.enums.StatusLevel;
56
import com.github.gribanoveu.cuddle.dtos.response.StatusResponse;
7+
import com.github.gribanoveu.cuddle.entities.services.email.EmailService;
68
import com.github.gribanoveu.cuddle.entities.services.user.UserService;
79
import com.github.gribanoveu.cuddle.entities.tables.User;
10+
import com.github.gribanoveu.cuddle.utils.emails.EmailTemplates;
811
import lombok.RequiredArgsConstructor;
912
import lombok.extern.slf4j.Slf4j;
1013
import org.springframework.http.ResponseEntity;
@@ -20,6 +23,7 @@
2023
@RequiredArgsConstructor
2124
public class UserControllerImpl {
2225
private final UserService userService;
26+
private final EmailService emailService;
2327

2428
public ResponseEntity<User> getUserData(Authentication authentication) {
2529
var userData = userService.findUserByEmail(authentication.getName());
@@ -28,6 +32,8 @@ public ResponseEntity<User> getUserData(Authentication authentication) {
2832

2933
public ResponseEntity<StatusResponse> deleteUser(Authentication authentication) {
3034
userService.deleteUserByEmail(authentication.getName());
35+
emailService.sendMail(EmailTemplates.simpleEmail(authentication.getName(),
36+
EmailMessages.deleteSubject, EmailMessages.deleteSelfTemplate));
3137
return ResponseEntity.ok(StatusResponse.create(ResponseCode.USER_DELETED, StatusLevel.SUCCESS));
3238
}
3339
}

src/main/java/com/github/gribanoveu/cuddle/controllers/secure/UserRoleControllerImpl.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.github.gribanoveu.cuddle.dtos.response.ResponseDetails;
77
import com.github.gribanoveu.cuddle.dtos.response.StatusResponse;
88
import com.github.gribanoveu.cuddle.entities.services.user.UserService;
9+
import com.github.gribanoveu.cuddle.exeptions.CredentialEx;
910
import lombok.RequiredArgsConstructor;
1011
import lombok.extern.slf4j.Slf4j;
1112
import org.springframework.http.ResponseEntity;
@@ -21,21 +22,23 @@
2122
public class UserRoleControllerImpl {
2223
private final UserService userService;
2324

24-
public ResponseEntity<?> getUserRole(Long userId) {
25-
var userRole = userService.findUserById(userId).getRole().getAuthority();
25+
public ResponseEntity<?> getUserRole(String email) {
26+
var userRole = userService.findUserByEmail(email).getRole().getAuthority();
2627
return ResponseEntity.ok(StatusResponse.create(
2728
new ResponseDetails(userRole), StatusLevel.SUCCESS));
2829
}
2930

30-
public ResponseEntity<?> updateToModerator(Long userId) {
31-
var user = userService.findUserById(userId);
31+
public ResponseEntity<?> updateToModerator(String email) {
32+
var user = userService.findUserByEmail(email);
33+
if (user.getRole().equals(Role.ADMIN)) throw new CredentialEx(ResponseCode.ACCESS_DENIED);
3234
userService.updateRole(user, Role.MODERATOR);
3335
return ResponseEntity.ok(StatusResponse.create(
3436
ResponseCode.PERMISSION_UPDATED_MODERATOR, StatusLevel.SUCCESS));
3537
}
3638

37-
public ResponseEntity<?> updateToUser(Long userId) {
38-
var user = userService.findUserById(userId);
39+
public ResponseEntity<?> updateToUser(String email) {
40+
var user = userService.findUserByEmail(email);
41+
if (user.getRole().equals(Role.ADMIN)) throw new CredentialEx(ResponseCode.ACCESS_DENIED);
3942
userService.updateRole(user, Role.USER);
4043
return ResponseEntity.ok(StatusResponse.create(
4144
ResponseCode.PERMISSION_UPDATED_USER, StatusLevel.SUCCESS));

src/main/java/com/github/gribanoveu/cuddle/endpoints/secure/ModeratorController.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ public ResponseEntity<?> getAllUsersList(@PageableDefault Pageable pageable) {
3131

3232
@Operation(summary = "Удалить пользователя")
3333
@SecurityRequirement(name = "JWT")
34-
@DeleteMapping("/{userId}") // only admin can delete user
35-
public ResponseEntity<?> deleteUser(@PathVariable Long userId) {
36-
return moderatorControllerImpl.deleteUser(userId);
34+
@DeleteMapping("/delete")
35+
public ResponseEntity<?> deleteUser(@RequestParam String email) {
36+
return moderatorControllerImpl.deleteUser(email);
3737
}
3838

3939
@Operation(summary = "Отключить пользователя")

src/main/java/com/github/gribanoveu/cuddle/endpoints/secure/UserRoleController.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,22 @@ public class UserRoleController {
2121

2222
@SecurityRequirement(name = "JWT")
2323
@Operation(summary = "Получить роль пользователя")
24-
@GetMapping("/{userId}")
25-
public ResponseEntity<?> getUserRole(@PathVariable Long userId) {
26-
return userRoleControllerImpl.getUserRole(userId);
24+
@GetMapping
25+
public ResponseEntity<?> getUserRole(@RequestParam String email) {
26+
return userRoleControllerImpl.getUserRole(email);
2727
}
2828

2929
@SecurityRequirement(name = "JWT")
3030
@Operation(summary = "Обновить роль до модератора")
31-
@PatchMapping("/{userId}")
32-
public ResponseEntity<?> updateToModerator(@PathVariable Long userId) {
33-
return userRoleControllerImpl.updateToModerator(userId);
31+
@PatchMapping
32+
public ResponseEntity<?> updateToModerator(@RequestParam String email) {
33+
return userRoleControllerImpl.updateToModerator(email);
3434
}
3535

3636
@SecurityRequirement(name = "JWT")
3737
@Operation(summary = "Обновить роль до пользователя")
38-
@DeleteMapping("/{userId}")
39-
public ResponseEntity<?> updateToUser(@PathVariable Long userId) {
40-
return userRoleControllerImpl.updateToUser(userId);
38+
@DeleteMapping
39+
public ResponseEntity<?> updateToUser(@RequestParam String email) {
40+
return userRoleControllerImpl.updateToUser(email);
4141
}
4242
}

src/main/java/com/github/gribanoveu/cuddle/entities/repositories/UserRepository.java

-7
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,4 @@ public interface UserRepository extends CrudRepository<User, Long> {
2424

2525
@Query("SELECT u FROM User u WHERE u.accountNonLocked = false AND u.banExpiration < :now")
2626
List<User> findBannedUsersWithExpiredBan(LocalDateTime now);
27-
28-
@Query("""
29-
SELECT u.banExpiration, u.accountNonLocked, u.id
30-
FROM User u
31-
WHERE u.accountNonLocked = false AND u.banExpiration < :now
32-
""")
33-
List<User> findBannedUsers(LocalDateTime now);
3427
}

src/main/java/com/github/gribanoveu/cuddle/exeptions/GlobalExceptionHandler.java

+9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.github.gribanoveu.cuddle.utils.aspects.LogResponse;
99
import jakarta.validation.ConstraintViolationException;
1010
import lombok.extern.slf4j.Slf4j;
11+
import org.springframework.dao.InvalidDataAccessApiUsageException;
1112
import org.springframework.http.ResponseEntity;
1213
import org.springframework.http.converter.HttpMessageNotReadableException;
1314
import org.springframework.security.authentication.BadCredentialsException;
@@ -102,4 +103,12 @@ public ResponseEntity<StatusResponse> handleMissingParamException(MissingServlet
102103
return ResponseEntity.badRequest().body(details);
103104
}
104105

106+
@LogResponse
107+
@ExceptionHandler(InvalidDataAccessApiUsageException.class) // query param handler
108+
public ResponseEntity<StatusResponse> handleInvalidDataAccessApiUsageException(InvalidDataAccessApiUsageException e) {
109+
log.error(e.getMessage());
110+
var details = StatusResponse.create(ResponseCode.MISSING_PARAM, StatusLevel.ERROR);
111+
return ResponseEntity.badRequest().body(details);
112+
}
113+
105114
}

src/main/java/com/github/gribanoveu/cuddle/exeptions/entrypoint/AuthenticationFailureEntryPoint.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.gribanoveu.cuddle.exeptions.entrypoint;
22

3+
import com.github.gribanoveu.cuddle.constants.Constants;
34
import jakarta.servlet.ServletException;
45
import jakarta.servlet.http.HttpServletRequest;
56
import jakarta.servlet.http.HttpServletResponse;
@@ -28,7 +29,7 @@ public void onAuthenticationFailure(
2829
AuthenticationException exception
2930
) throws IOException, ServletException {
3031
if (exception instanceof DisabledException) {
31-
response.sendError(HttpStatus.UNAUTHORIZED.value(), "User is disabled");
32+
response.sendError(HttpStatus.UNAUTHORIZED.value(), Constants.USER_DISABLED_MESSAGE);
3233
} else {
3334
response.sendError(HttpStatus.UNAUTHORIZED.value(), exception.getMessage());
3435
}

src/main/java/com/github/gribanoveu/cuddle/security/CustomUserDetailsService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
@Service
1717
@RequiredArgsConstructor
1818
public class CustomUserDetailsService implements UserDetailsService {
19-
private static final String USER_NOT_FOUND = "User '%s' not found";
19+
private static final String USER_NOT_FOUND = "Пользователь '%s' не найден";
2020
private final UserRepository userRepository;
2121

2222
@Override

src/main/resources/application.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ spring:
2121
mvc:
2222
throw-exception-if-no-handler-found: true
2323
jackson:
24-
default-property-inclusion: non_null
24+
# default-property-inclusion: non_null
2525
serialization:
2626
write-dates-as-timestamps: false
2727
datasource:

0 commit comments

Comments
 (0)