/
ilyakos
/
ChatWithAI
Обзор
Документация
Войти
/
ilyakos
/
ChatWithAI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
ChatWithAI_Server/Services/ChatService.cs
113 строк
4 KB
ilyakos
новые энд поинты
15 июн 2026, 20:32
15 июн 2026, 20:32
15ab71c
Код
Авторство
О чём код?
using ChatWithAI.Database.Models; using ChatWithAI.Database.Repositories; using ChatWithAI_Server.DTOs; namespace ChatWithAI_Server.Services; /// <summary> /// Реализация сервиса чатов. /// Координирует работу с репозиториями базы данных и сервисом LM Studio. /// </summary> public class ChatService( IChatRepository chats, IMessageRepository messages, IPromptRepository prompts, ILmStudioService lmStudio) : IChatService { /// <inheritdoc/> public async Task<ChatDto> CreateChatAsync(Guid userId, Guid promptId) { var prompt = await prompts.GetByIdAsync(promptId) ?? throw new KeyNotFoundException("Промт не найден."); var chat = new Chat { UserId = userId, PromptId = promptId }; await chats.AddAsync(chat); await chats.SaveChangesAsync(); return new ChatDto(chat.Id, prompt.Id, prompt.Name, chat.CreatedAt); } /// <inheritdoc/> public async Task<IReadOnlyList<ChatDto>> GetUserChatsAsync(Guid userId) { var userChats = await chats.GetByUserAsync(userId); return userChats .Select(c => new ChatDto(c.Id, c.PromptId, c.Prompt.Name, c.CreatedAt)) .ToList(); } /// <inheritdoc/> public async Task<ChatDto> GetChatAsync(Guid chatId, Guid userId) { var chat = await chats.GetByIdAsync(chatId) ?? throw new KeyNotFoundException("Чат не найден."); if (chat.UserId != userId) throw new UnauthorizedAccessException("Нет доступа к чату."); return new ChatDto(chat.Id, chat.PromptId, chat.Prompt.Name, chat.CreatedAt); } /// <inheritdoc/> public async Task DeleteChatAsync(Guid chatId, Guid userId) { var chat = await chats.GetByIdAsync(chatId) ?? throw new KeyNotFoundException("Чат не найден."); if (chat.UserId != userId) throw new UnauthorizedAccessException("Нет доступа к чату."); await chats.SoftDeleteAsync(chatId); await chats.SaveChangesAsync(); } /// <inheritdoc/> public async Task<SendMessageResponseDto> SendMessageAsync( Guid chatId, Guid userId, string text, string? imageBase64) { var chat = await chats.GetByIdAsync(chatId) ?? throw new KeyNotFoundException("Чат не найден."); if (chat.UserId != userId) throw new UnauthorizedAccessException("Нет доступа к чату."); var history = (await messages.GetByChatAsync(chatId)).ToList(); // Сначала вызываем LM Studio — если он недоступен, ничего не сохраняем в БД var aiText = await lmStudio.CompleteChatAsync( chat.Prompt.Text, history, text, imageBase64); var userMsg = new Message { ChatId = chatId, IsUser = true, Text = text, ImageBase64 = imageBase64 }; var aiMsg = new Message { ChatId = chatId, IsUser = false, Text = aiText }; await messages.AddAsync(userMsg); await messages.AddAsync(aiMsg); await messages.SaveChangesAsync(); return new SendMessageResponseDto( new MessageDto(userMsg.Id, true, text, imageBase64, userMsg.CreatedAt), new MessageDto(aiMsg.Id, false, aiText, null, aiMsg.CreatedAt)); } /// <inheritdoc/> public async Task<IReadOnlyList<MessageDto>> GetMessagesAsync(Guid chatId, Guid userId) { var chat = await chats.GetByIdAsync(chatId) ?? throw new KeyNotFoundException("Чат не найден."); if (chat.UserId != userId) throw new UnauthorizedAccessException("Нет доступа к чату."); var msgs = await messages.GetByChatAsync(chatId); return msgs .Select(m => new MessageDto(m.Id, m.IsUser, m.Text, m.ImageBase64, m.CreatedAt)) .ToList(); } }