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);
}
}