package be.naaturel.boardmateapi.services; import be.naaturel.boardmateapi.common.exceptions.ServiceException; import be.naaturel.boardmateapi.common.models.Client; import be.naaturel.boardmateapi.repository.ClientRepo; import be.naaturel.boardmateapi.repository.dtos.ClientDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.util.UUID; import static java.util.UUID.randomUUID; @Service public class ClientService { private final ClientRepo repo; private final PasswordEncoder passwordEncoder; @Autowired public ClientService(ClientRepo repo, PasswordEncoder passwordEncoder){ this.repo = repo; this.passwordEncoder = passwordEncoder; } public Client authenticate(String username, String key) throws ServiceException { try { ClientDto dto = repo.findByServiceUsername(username) .orElseThrow(() -> new RuntimeException("Invalid username")); if (passwordEncoder.matches(key, dto.getServiceKey())) { return new Client(dto.getClientId(), dto.getName(), dto.getServiceUsername(), dto.getServiceKey()); } else { throw new RuntimeException("Invalid username or password"); } } catch (Exception e){ throw new ServiceException("Authentication failed", e); } } public String create(String name, String username, String key) throws ServiceException { try{ ClientDto dto = new ClientDto(); dto.setClientId(randomUUID().toString()); dto.setName(name); dto.setServiceUsername(username); String encodedKey = passwordEncoder.encode(key); dto.setServiceKey(encodedKey); ClientDto result = repo.save(dto); return result.getClientId(); } catch (Exception e){ throw new ServiceException("Unable to create client", e); } } }