diff --git a/data/backend-gateway.db b/data/backend-gateway.db index 249ba3a..be975a4 100644 Binary files a/data/backend-gateway.db and b/data/backend-gateway.db differ diff --git a/src/main/java/com/litoralregas/backend_gateway/config/SecurityConfig.java b/src/main/java/com/litoralregas/backend_gateway/config/SecurityConfig.java index 6a83612..dbd77f6 100644 --- a/src/main/java/com/litoralregas/backend_gateway/config/SecurityConfig.java +++ b/src/main/java/com/litoralregas/backend_gateway/config/SecurityConfig.java @@ -3,6 +3,8 @@ package com.litoralregas.backend_gateway.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration @@ -17,4 +19,9 @@ public class SecurityConfig { ) .build(); } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } } \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/user/UserController.java b/src/main/java/com/litoralregas/backend_gateway/user/UserController.java new file mode 100644 index 0000000..62416c0 --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/user/UserController.java @@ -0,0 +1,28 @@ +package com.litoralregas.backend_gateway.user; + +import com.litoralregas.backend_gateway.user.dto.CreateUserRequest; +import com.litoralregas.backend_gateway.user.dto.UserResponse; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/admin/users") +public class UserController { + + private final UserService userService; + + public UserController(UserService userService) { + this.userService = userService; + } + + @PostMapping + public UserResponse create(@RequestBody CreateUserRequest request) { + return userService.create(request); + } + + @GetMapping + public List findAll() { + return userService.findAll(); + } +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/user/UserService.java b/src/main/java/com/litoralregas/backend_gateway/user/UserService.java new file mode 100644 index 0000000..d763691 --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/user/UserService.java @@ -0,0 +1,63 @@ +package com.litoralregas.backend_gateway.user; + +import com.litoralregas.backend_gateway.client.ClientEntity; +import com.litoralregas.backend_gateway.client.ClientRepository; +import com.litoralregas.backend_gateway.user.dto.CreateUserRequest; +import com.litoralregas.backend_gateway.user.dto.UserResponse; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UserService { + + private final UserRepository userRepository; + private final ClientRepository clientRepository; + private final PasswordEncoder passwordEncoder; + + public UserService( + UserRepository userRepository, + ClientRepository clientRepository, + PasswordEncoder passwordEncoder + ) { + this.userRepository = userRepository; + this.clientRepository = clientRepository; + this.passwordEncoder = passwordEncoder; + } + + public UserResponse create(CreateUserRequest request) { + ClientEntity client = clientRepository.findById(request.clientId()) + .orElseThrow(() -> new RuntimeException("Client not found")); + + UserEntity user = new UserEntity(); + user.setClient(client); + user.setUsername(request.username()); + user.setPasswordHash(passwordEncoder.encode(request.password())); + user.setRole(request.role()); + user.setEnabled(true); + + UserEntity saved = userRepository.save(user); + + return toResponse(saved); + } + + public List findAll() { + return userRepository.findAll() + .stream() + .map(this::toResponse) + .toList(); + } + + private UserResponse toResponse(UserEntity user) { + return new UserResponse( + user.getId(), + user.getClient().getId(), + user.getClient().getName(), + user.getUsername(), + user.getRole(), + user.isEnabled(), + user.getCreatedAt() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/user/dto/CreateUserRequest.java b/src/main/java/com/litoralregas/backend_gateway/user/dto/CreateUserRequest.java new file mode 100644 index 0000000..b8d7d1e --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/user/dto/CreateUserRequest.java @@ -0,0 +1,11 @@ +package com.litoralregas.backend_gateway.user.dto; + +import com.litoralregas.backend_gateway.user.UserRole; + +public record CreateUserRequest( + Long clientId, + String username, + String password, + UserRole role +) { +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/user/dto/UserResponse.java b/src/main/java/com/litoralregas/backend_gateway/user/dto/UserResponse.java new file mode 100644 index 0000000..49c123b --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/user/dto/UserResponse.java @@ -0,0 +1,14 @@ +package com.litoralregas.backend_gateway.user.dto; + +import com.litoralregas.backend_gateway.user.UserRole; + +public record UserResponse( + Long id, + Long clientId, + String clientName, + String username, + UserRole role, + boolean enabled, + String createdAt +) { +} \ No newline at end of file