/
ilyakos
/
ChatWithAI
Обзор
Документация
Войти
/
ilyakos
/
ChatWithAI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
ChatWithAI_Server/Controllers/ChatsController.cs
164 строки
6 KB
ilyakos
новые энд поинты
15 июн 2026, 20:32
15 июн 2026, 20:32
15ab71c
Код
Авторство
О чём код?
using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using ChatWithAI_Server.DTOs; using ChatWithAI_Server.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace ChatWithAI_Server.Controllers; /// <summary> /// Контроллер чатов. /// Управляет чатами пользователя и обменом сообщениями с языковой моделью. /// </summary> [ApiController] [Authorize] [Route("api/[controller]")] public class ChatsController(IChatService chatService) : ControllerBase { /// <summary> /// Извлекает идентификатор текущего пользователя из JWT-токена. /// </summary> /// <returns>Идентификатор пользователя.</returns> private Guid GetUserId() => Guid.Parse(User.FindFirstValue(JwtRegisteredClaimNames.Sub) ?? throw new UnauthorizedAccessException("Недействительный токен.")); /// <summary> /// Создаёт новый чат на основе указанного промта. /// </summary> /// <param name="dto">Идентификатор промта.</param> /// <returns>Данные созданного чата; 404 если промт не найден.</returns> [HttpPost] public async Task<ActionResult<ChatDto>> Create([FromBody] CreateChatDto dto) { try { var result = await chatService.CreateChatAsync(GetUserId(), dto.PromptId); return CreatedAtAction(nameof(Get), new { id = result.Id }, result); } catch (KeyNotFoundException ex) { return NotFound(new { message = ex.Message }); } } /// <summary> /// Возвращает список всех чатов текущего пользователя. /// </summary> /// <returns>Список чатов.</returns> [HttpGet] public async Task<ActionResult<IReadOnlyList<ChatDto>>> GetAll() { var result = await chatService.GetUserChatsAsync(GetUserId()); return Ok(result); } /// <summary> /// Возвращает данные конкретного чата. /// </summary> /// <param name="id">Идентификатор чата.</param> /// <returns>Данные чата; 404 если не найден; 403 если нет доступа.</returns> [HttpGet("{id:guid}")] public async Task<ActionResult<ChatDto>> Get(Guid id) { try { var result = await chatService.GetChatAsync(id, GetUserId()); return Ok(result); } catch (KeyNotFoundException ex) { return NotFound(new { message = ex.Message }); } catch (UnauthorizedAccessException) { return Forbid(); } } /// <summary> /// Удаляет чат (мягкое удаление). /// </summary> /// <param name="id">Идентификатор чата.</param> /// <returns>204 при успехе; 404 если не найден; 403 если нет доступа.</returns> [HttpDelete("{id:guid}")] public async Task<IActionResult> Delete(Guid id) { try { await chatService.DeleteChatAsync(id, GetUserId()); return NoContent(); } catch (KeyNotFoundException ex) { return NotFound(new { message = ex.Message }); } catch (UnauthorizedAccessException) { return Forbid(); } } /// <summary> /// Отправляет сообщение в чат и возвращает ответ языковой модели. /// Если LM Studio недоступен, возвращает 502 и ничего не сохраняет. /// </summary> /// <param name="id">Идентификатор чата.</param> /// <param name="dto">Текст и (опционально) изображение.</param> /// <returns> /// Сообщение пользователя и ответ модели; /// 404 если чат не найден; 403 если нет доступа; 502 если LM Studio недоступен. /// </returns> [HttpPost("{id:guid}/messages")] public async Task<ActionResult<SendMessageResponseDto>> SendMessage( Guid id, [FromBody] SendMessageDto dto) { try { var result = await chatService.SendMessageAsync(id, GetUserId(), dto.Text, dto.ImageBase64); return Ok(result); } catch (KeyNotFoundException ex) { return NotFound(new { message = ex.Message }); } catch (UnauthorizedAccessException) { return Forbid(); } catch (HttpRequestException ex) { return StatusCode(502, new { message = $"LM Studio недоступен: {ex.Message}" }); } catch (InvalidOperationException ex) { return StatusCode(502, new { message = $"Ошибка ответа LM Studio: {ex.Message}" }); } } /// <summary> /// Возвращает историю сообщений чата в хронологическом порядке. /// </summary> /// <param name="id">Идентификатор чата.</param> /// <returns> /// Список сообщений; 404 если чат не найден; 403 если нет доступа. /// </returns> [HttpGet("{id:guid}/messages")] public async Task<ActionResult<IReadOnlyList<MessageDto>>> GetMessages(Guid id) { try { var result = await chatService.GetMessagesAsync(id, GetUserId()); return Ok(result); } catch (KeyNotFoundException ex) { return NotFound(new { message = ex.Message }); } catch (UnauthorizedAccessException) { return Forbid(); } } }