package cn.teammodel.service.impl; import cn.hutool.core.lang.UUID; import cn.teammodel.common.ErrorCode; import cn.teammodel.common.PK; import cn.teammodel.config.exception.ServiceException; import cn.teammodel.dao.ChatSessionRepository; import cn.teammodel.model.dto.ai.UpdateSessionDto; import cn.teammodel.model.entity.User; import cn.teammodel.model.entity.ai.ChatSession; import cn.teammodel.model.entity.ai.ChatSession.Message; import cn.teammodel.security.utils.SecurityUtil; import cn.teammodel.service.ChatSessionService; import cn.teammodel.utils.RepositoryUtil; import com.azure.cosmos.models.CosmosPatchOperations; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.Instant; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** * @author winter * @create 2023-12-19 15:31 */ @Service @Slf4j public class ChatSessionServiceImpl implements ChatSessionService { @Resource private ChatSessionRepository chatSessionRepository; @Override public void createSession() { User user = SecurityUtil.getLoginUser(); String userId = user.getId(); // 初始化欢迎语 Message message = Message.ofGptText("你好 " + user.getName() + " ,我是你的私人 AI 助手小豆,你可以问我任何包括但不仅限于教育的问题,我会尽力为您解答!"); List history = Collections.singletonList(message); ChatSession chatSession = new ChatSession(); chatSession.setId(UUID.randomUUID().toString()); chatSession.setCode(PK.CHAT_SESSION); chatSession.setTitle("新对话"); chatSession.setUserId(userId); chatSession.setCreateTime(Instant.now().toEpochMilli()); chatSession.setUpdateTime(Instant.now().toEpochMilli()); chatSession.setHistory(history); chatSessionRepository.save(chatSession); } @Override public List listMySession() { String userId = SecurityUtil.getUserId(); List sessions = chatSessionRepository.findByUserId(userId); // 按更新时间排序 sessions = sessions.stream().sorted(Comparator.comparing(ChatSession::getUpdateTime)).collect(Collectors.toList()); return sessions; } @Override public ChatSession updateSession(UpdateSessionDto updateSessionDto) { String id = updateSessionDto.getId(); String title = updateSessionDto.getTitle(); User user = SecurityUtil.getLoginUser(); String userId = user.getId(); ChatSession session = RepositoryUtil.findOne(chatSessionRepository.findBySessionId(id), ""); if (!session.getUserId().equals(userId)) { throw new ServiceException(ErrorCode.NO_AUTH_ERROR); } CosmosPatchOperations options = CosmosPatchOperations.create() .replace("/title", title); chatSessionRepository.save(id, PK.of(PK.CHAT_SESSION),ChatSession.class, options); return null; } @Override public void deleteSession(String id) { User user = SecurityUtil.getLoginUser(); String userId = user.getId(); ChatSession session = RepositoryUtil.findOne(chatSessionRepository.findBySessionId(id), "该会话不存在"); // 鉴权 if (!session.getUserId().equals(userId)) { throw new ServiceException(ErrorCode.NO_AUTH_ERROR); } chatSessionRepository.deleteById(id, PK.of(PK.CHAT_SESSION)); } }