UserCommandService.java

package de.mirkosertic.powerstaff.auth;

import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Service
public class UserCommandService {

    private final PsUserRepository repository;
    private final PasswordEncoder passwordEncoder;

    public UserCommandService(final PsUserRepository repository, final PasswordEncoder passwordEncoder) {
        this.repository = repository;
        this.passwordEncoder = passwordEncoder;
    }

    @Transactional
    public void createUser(final String username, final String plainPassword, final boolean mustChangePassword, final boolean enabled, final boolean admin) {
        final String hash = passwordEncoder.encode(plainPassword);
        final PsUser user = new PsUser(username, hash, mustChangePassword, enabled, PsUser.DEFAULT_SYSTEM_PROMPT, admin, null);
        repository.save(user);
    }

    @Transactional
    public void updateSystemPrompt(final String username, final String prompt) {
        repository.updateSystemPrompt(username, prompt != null ? prompt : PsUser.DEFAULT_SYSTEM_PROMPT);
    }

    @Transactional
    public void updateApiToken(final String username, final String token) {
        repository.updateApiToken(username, token != null && !token.isBlank() ? token.trim() : null);
    }

    @Transactional
    public void updateUser(final String username, final boolean mustChangePassword, final boolean enabled) {
        repository.updateFlags(username, mustChangePassword, enabled);
    }

    @Transactional
    public void resetPassword(final String username, final String newPlainPassword) {
        final String hash = passwordEncoder.encode(newPlainPassword);
        repository.updatePassword(username, hash);
    }

    @Transactional
    public void deleteUser(final String username) {
        repository.deleteById(username);
    }

    public Optional<PsUser> findByUsername(final String username) {
        return repository.findById(username);
    }
}