MessagePersistenceService.java

package com.seebie.server.service;

import com.seebie.server.dto.MessageDto;
import com.seebie.server.entity.MessageEntity;
import com.seebie.server.entity.MessageType;
import com.seebie.server.repository.MessageRepository;
import com.seebie.server.repository.UserRepository;
import jakarta.persistence.EntityNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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


@Service
public class MessagePersistenceService {

    private final UserRepository userRepo;
    private final MessageRepository messageRepo;

    public MessagePersistenceService(UserRepository repo, MessageRepository messageRepo) {
        this.userRepo = repo;
        this.messageRepo = messageRepo;
    }

    @Transactional(readOnly = true)
    public List<MessageDto> getChatHistory(UUID publicId, Instant earliest) {
        return messageRepo.findSince(publicId, earliest);
    }

    @Transactional
    public void saveExchange(UUID userPublicId, MessageDto userPrompt, MessageDto chatResponse) {

        var user = userRepo.findByPublicId(userPublicId)
                .orElseThrow(() -> new EntityNotFoundException("No user found: " + userPublicId) );

        // make sure the timestamp of the user message is before the timestamp of the response
        // so they appear in the right order
        messageRepo.save(new MessageEntity(user, userPrompt.content(), MessageType.USER));
        messageRepo.save(new MessageEntity(user, chatResponse.content(), MessageType.ASSISTANT));
    }

    @Transactional
    public void deleteConversation(UUID userPublicId) {
        messageRepo.deleteAllByUserPublicId(userPublicId);
    }

}