package de.neitzel.roleplay.business; import de.neitzel.roleplay.common.CreateUserRequest; import de.neitzel.roleplay.common.UserSummary; import de.neitzel.roleplay.data.UserEntity; import de.neitzel.roleplay.data.UserRepository; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.transaction.Transactional; import java.util.List; import java.util.stream.Collectors; /** * Business service for application users. Used by admin-only user management endpoints. */ @ApplicationScoped public class UserService { private final UserRepository userRepository; @Inject public UserService(final UserRepository userRepository) { this.userRepository = userRepository; } /** * Returns all users as summaries (no password). * * @return list of user summaries */ public List listUsers() { return userRepository.listAll().stream() .map(UserService::toSummary) .collect(Collectors.toList()); } /** * Creates a new user with the given username, plain password (hashed with bcrypt), and role. * * @param request create request (username, password, role) * @return the created user summary * @throws IllegalArgumentException if username is blank, password is blank, role is invalid, or username already exists */ @Transactional public UserSummary createUser(final CreateUserRequest request) { String username = request.getUsername(); String password = request.getPassword(); String role = request.getRole(); if (username == null || username.isBlank()) { throw new IllegalArgumentException("Username is required"); } if (password == null || password.isBlank()) { throw new IllegalArgumentException("Password is required"); } if (role == null || role.isBlank()) { throw new IllegalArgumentException("Role is required"); } if (!"admin".equals(role) && !"user".equals(role)) { throw new IllegalArgumentException("Role must be 'admin' or 'user'"); } if (userRepository.findByUsername(username) != null) { throw new IllegalArgumentException("Username already exists: " + username); } UserEntity entity = UserEntity.add(username, password, role); return toSummary(entity); } private static UserSummary toSummary(final UserEntity entity) { return new UserSummary(entity.getId(), entity.getUsername(), entity.getRole()); } }