From 63fa78d2b777ea28d9022fdfce66248105cd1ddc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=91=D0=B0=D0=BA=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D1=81=D0=BA=D0=B0=D1=8F?= Date: Mon, 13 May 2024 02:18:21 +0400 Subject: [PATCH] =?UTF-8?q?=D1=8D=D0=BC...=20=D1=80=D0=B5=D0=B3=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F=3F...=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=3F=20=D0=BA=D1=83=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=3F...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/core/security/UserPrincipal.java | 6 ------ .../example/backend/users/api/UserDTO.java | 11 ----------- .../users/api/UserSignupController.java | 9 ++++++--- .../backend/users/model/UserEntity.java | 16 +--------------- .../backend/users/service/UserService.java | 7 ------- .../src/main/resources/templates/signup.html | 2 +- data.mv.db | Bin 86016 -> 69632 bytes 7 files changed, 8 insertions(+), 43 deletions(-) diff --git a/backend/src/main/java/com/example/backend/core/security/UserPrincipal.java b/backend/src/main/java/com/example/backend/core/security/UserPrincipal.java index b81ce30..d51cf25 100644 --- a/backend/src/main/java/com/example/backend/core/security/UserPrincipal.java +++ b/backend/src/main/java/com/example/backend/core/security/UserPrincipal.java @@ -12,7 +12,6 @@ public class UserPrincipal implements UserDetails { private final long id; private final String username; private final String password; - private final boolean isAdmin; private final Set roles; private final boolean active; @@ -20,7 +19,6 @@ public class UserPrincipal implements UserDetails { this.id = user.getId(); this.username = user.getLogin(); this.password = user.getPassword(); - this.isAdmin = user.getIsAdmin(); this.roles = Set.of(user.getRole()); this.active = true; } @@ -39,10 +37,6 @@ public class UserPrincipal implements UserDetails { return password; } - public boolean getIsAdmin() { - return isAdmin; - } - @Override public Collection getAuthorities() { return roles; diff --git a/backend/src/main/java/com/example/backend/users/api/UserDTO.java b/backend/src/main/java/com/example/backend/users/api/UserDTO.java index 8b756f7..01d359a 100644 --- a/backend/src/main/java/com/example/backend/users/api/UserDTO.java +++ b/backend/src/main/java/com/example/backend/users/api/UserDTO.java @@ -23,9 +23,6 @@ public class UserDTO { @NotNull private UserRole role; - @NotNull - private boolean isAdmin; - @JsonProperty(access = JsonProperty.Access.READ_ONLY) public Integer getId() { return id; @@ -58,12 +55,4 @@ public class UserDTO { public void setRole(UserRole role) { this.role = role; } - - public boolean getIsAdmin() { - return isAdmin; - } - - public void setIsAdmin(boolean isAdmin) { - this.isAdmin = isAdmin; - } } diff --git a/backend/src/main/java/com/example/backend/users/api/UserSignupController.java b/backend/src/main/java/com/example/backend/users/api/UserSignupController.java index b464e8e..88f40c2 100644 --- a/backend/src/main/java/com/example/backend/users/api/UserSignupController.java +++ b/backend/src/main/java/com/example/backend/users/api/UserSignupController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import com.example.backend.core.configurations.Constants; import com.example.backend.users.model.UserEntity; +import com.example.backend.users.model.UserRole; import com.example.backend.users.service.UserService; import jakarta.validation.Valid; @@ -26,17 +27,19 @@ public class UserSignupController { private static final String USER_ATTRIBUTE = "user"; private final UserService userService; - private final ModelMapper modelMapper; public UserSignupController( UserService userService, ModelMapper modelMapper) { this.userService = userService; - this.modelMapper = modelMapper; } private UserEntity toEntity(UserSignupDTO dto) { - return modelMapper.map(dto, UserEntity.class); + final UserEntity entity = new UserEntity(); + entity.setLogin(dto.getLogin()); + entity.setPassword(dto.getPassword()); + entity.setRole(dto.getIsAdmin() ? UserRole.ADMIN : UserRole.USER); + return entity; } @GetMapping diff --git a/backend/src/main/java/com/example/backend/users/model/UserEntity.java b/backend/src/main/java/com/example/backend/users/model/UserEntity.java index b29fc03..f6b551d 100644 --- a/backend/src/main/java/com/example/backend/users/model/UserEntity.java +++ b/backend/src/main/java/com/example/backend/users/model/UserEntity.java @@ -4,7 +4,6 @@ import java.util.Objects; import com.example.backend.core.model.BaseEntity; -import io.micrometer.common.lang.NonNull; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; @@ -19,19 +18,15 @@ public class UserEntity extends BaseEntity { @Column(nullable = false, length = 90) private String password; - @NonNull - private boolean isAdmin; - private UserRole role; public UserEntity() { } - public UserEntity(Integer id, String login, String password, boolean isAdmin) { + public UserEntity(Integer id, String login, String password) { this.login = login; this.password = password; - this.isAdmin = isAdmin; this.role = UserRole.USER; } @@ -51,14 +46,6 @@ public class UserEntity extends BaseEntity { this.password = password; } - public boolean getIsAdmin() { - return isAdmin; - } - - public void setIsAdmin(boolean isAdmin) { - this.isAdmin = isAdmin; - } - public UserRole getRole() { return role; } @@ -82,7 +69,6 @@ public class UserEntity extends BaseEntity { return Objects.equals(other.getId(), id) && Objects.equals(other.getLogin(), login) && Objects.equals(other.getRole(), role) && - Objects.equals(other.getIsAdmin(), isAdmin) && Objects.equals(other.getPassword(), password); } } diff --git a/backend/src/main/java/com/example/backend/users/service/UserService.java b/backend/src/main/java/com/example/backend/users/service/UserService.java index d9c6a0f..8e073b0 100644 --- a/backend/src/main/java/com/example/backend/users/service/UserService.java +++ b/backend/src/main/java/com/example/backend/users/service/UserService.java @@ -17,7 +17,6 @@ import com.example.backend.core.configurations.Constants; import com.example.backend.core.errors.NotFoundException; import com.example.backend.core.security.UserPrincipal; import com.example.backend.users.model.UserEntity; -import com.example.backend.users.model.UserRole; import com.example.backend.users.repository.UserRepository; @Service @@ -59,16 +58,10 @@ public class UserService implements UserDetailsService { if (entity == null) { throw new IllegalArgumentException("Entity is null"); } - entity.setLogin(null); checkLogin(null, entity.getLogin()); final String password = Optional.ofNullable(entity.getPassword()).orElse(""); entity.setPassword( passwordEncoder.encode(StringUtils.hasText(password.strip()) ? password : Constants.DEFAULT_PASSWORD)); - if (entity.getIsAdmin() == true) { - entity.setRole(UserRole.ADMIN); - } else { - entity.setRole(UserRole.USER); - } repository.save(entity); return repository.save(entity); } diff --git a/backend/src/main/resources/templates/signup.html b/backend/src/main/resources/templates/signup.html index 3218d1b..bafefbb 100644 --- a/backend/src/main/resources/templates/signup.html +++ b/backend/src/main/resources/templates/signup.html @@ -46,7 +46,7 @@
- +
diff --git a/data.mv.db b/data.mv.db index 0b45ea54aff8f3a88b77c9e4152fba298d4dcf70..4c50f2498cf952cc7c58cb5ff50112f827254168 100644 GIT binary patch literal 69632 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 J)+4e1|9@pa`zrtd literal 86016 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