PromptPersistenceService.java

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

import fr.tiogars.chat.domains.prompt.entities.PromptEntity;
import fr.tiogars.chat.domains.prompt.models.PromptRequest;
import fr.tiogars.chat.domains.prompt.models.PromptResponse;
import fr.tiogars.chat.domains.prompt.repositories.PromptRepository;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.time.Instant;
import java.util.UUID;

/**
 * Service for handling AI prompts with persistence.
 * This service saves all prompts and responses to the database.
 */
@Service
public class PromptPersistenceService {

    private final ChatClientAdapter chatClient;
    private final PromptRepository promptRepository;

    public PromptPersistenceService(ChatClientAdapter chatClient, PromptRepository promptRepository) {
        this.chatClient = chatClient;
        this.promptRepository = promptRepository;
    }

    /**
     * Process a prompt request, save it to the database, and return the AI response.
     *
     * @param request the prompt request
     * @param userId the user ID (can be null for anonymous users)
     * @param sessionId the session ID (can be null for no session)
     * @return the AI response
     */
    public PromptResponse processAndSavePrompt(PromptRequest request, UUID userId, String sessionId) {
        Instant start = Instant.now();

        String response;
        if (request.systemPrompt() != null && !request.systemPrompt().isBlank()) {
            response = chatClient.call(request.systemPrompt(), request.prompt());
        } else {
            response = chatClient.call(request.prompt());
        }

        Instant end = Instant.now();
        long processingTimeMs = Duration.between(start, end).toMillis();

        // Save the prompt and response to the database
        PromptEntity entity = new PromptEntity(
                request.prompt(),
                request.systemPrompt(),
                response,
                request.model() != null ? request.model() : "unknown",
                response.length(),
                processingTimeMs,
                "stop",
                sessionId,
                userId
        );
        promptRepository.save(entity);

        return new PromptResponse(
                response,
                request.model() != null ? request.model() : "unknown",
                response.length(),
                processingTimeMs,
                "stop"
        );
    }

    /**
     * Process a prompt without saving it to the database.
     *
     * @param request the prompt request
     * @return the AI response
     */
    public PromptResponse processPrompt(PromptRequest request) {
        return processAndSavePrompt(request, null, null);
    }
}