LmStudioSettingsService.java

package fr.tiogars.chat.domains.lmstudio.services;

import java.util.Optional;

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ResponseStatusException;

import fr.tiogars.chat.domains.lmstudio.entities.LmStudioSettingsEntity;
import fr.tiogars.chat.domains.lmstudio.models.LmStudioSettings;
import fr.tiogars.chat.domains.lmstudio.repositories.LmStudioSettingsRepository;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;

@Service
@Validated
public class LmStudioSettingsService {

    private final LmStudioSettingsRepository repository;

    public LmStudioSettingsService(LmStudioSettingsRepository repository) {
        this.repository = repository;
    }

    @Transactional(readOnly = true)
    public Optional<LmStudioSettings> find() {
        return repository.findById(LmStudioSettingsEntity.GLOBAL_ID).map(LmStudioSettingsEntity::toSettings);
    }

    @Transactional(readOnly = true)
    public LmStudioSettings requireSettings() {
        return find().orElseThrow(() -> new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE,
                "LM Studio is not configured. Configure it using PUT /api/v1/lmstudio/settings."));
    }

    @Transactional
    public LmStudioSettings update(@NotNull @Valid LmStudioSettings settings) {
        LmStudioSettingsEntity entity = repository.findById(LmStudioSettingsEntity.GLOBAL_ID)
                .orElseGet(() -> new LmStudioSettingsEntity(settings));
        entity.update(settings);
        return repository.save(entity).toSettings();
    }
}