Skip to content

Commit faa5833

Browse files
cleanup
1 parent f385438 commit faa5833

File tree

3 files changed

+59
-104
lines changed

3 files changed

+59
-104
lines changed

EssentialCSharp.Web/Controllers/ChatController.cs

Lines changed: 53 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -24,117 +24,77 @@ public ChatController(ILogger<ChatController> logger, AIChatService aiChatServic
2424
[HttpPost("message")]
2525
public async Task<IActionResult> SendMessage([FromBody] ChatMessageRequest request, CancellationToken cancellationToken = default)
2626
{
27-
try
27+
if (string.IsNullOrWhiteSpace(request.Message))
2828
{
29-
if (_AiChatService == null)
30-
{
31-
return StatusCode(503, new { error = "AI Chat service is not available. Please check the configuration and try again later." });
32-
}
33-
34-
if (string.IsNullOrWhiteSpace(request.Message))
35-
{
36-
return BadRequest(new { error = "Message cannot be empty." });
37-
}
38-
39-
// Require user authentication for chat
40-
if (!User.Identity?.IsAuthenticated ?? true)
41-
{
42-
return Unauthorized(new { error = "User must be logged in to use chat." });
43-
}
44-
45-
var (response, responseId) = await _AiChatService.GetChatCompletion(
46-
prompt: request.Message,
47-
systemPrompt: request.SystemPrompt,
48-
previousResponseId: request.PreviousResponseId,
49-
enableContextualSearch: request.EnableContextualSearch,
50-
cancellationToken: cancellationToken);
51-
52-
return Ok(new ChatMessageResponse
53-
{
54-
Response = response,
55-
ResponseId = responseId,
56-
Timestamp = DateTime.UtcNow
57-
});
29+
return BadRequest(new { error = "Message cannot be empty." });
5830
}
59-
catch (OperationCanceledException)
31+
32+
// Require user authentication for chat
33+
if (!User.Identity?.IsAuthenticated ?? true)
6034
{
61-
return StatusCode(499, new { error = "Request was cancelled." });
35+
return Unauthorized(new { error = "User must be logged in to use chat." });
6236
}
63-
catch (Exception ex)
37+
38+
var (response, responseId) = await _AiChatService.GetChatCompletion(
39+
prompt: request.Message,
40+
systemPrompt: request.SystemPrompt,
41+
previousResponseId: request.PreviousResponseId,
42+
enableContextualSearch: request.EnableContextualSearch,
43+
cancellationToken: cancellationToken);
44+
45+
return Ok(new ChatMessageResponse
6446
{
65-
var sanitizedMessage = request.Message?.Replace("\r", "").Replace("\n", "");
66-
_Logger.LogError(ex, "Error processing chat message: {Message}", sanitizedMessage);
67-
return StatusCode(500, new { error = "An error occurred while processing your message. Please try again." });
68-
}
47+
Response = response,
48+
ResponseId = responseId,
49+
Timestamp = DateTime.UtcNow
50+
});
6951
}
7052

7153
[HttpPost("stream")]
7254
public async Task StreamMessage([FromBody] ChatMessageRequest request, CancellationToken cancellationToken = default)
7355
{
74-
try
56+
if (string.IsNullOrWhiteSpace(request.Message))
7557
{
76-
if (_AiChatService == null)
77-
{
78-
Response.StatusCode = 503;
79-
await Response.WriteAsync(JsonSerializer.Serialize(new { error = "AI Chat service is not available. Please check the configuration and try again later." }), cancellationToken);
80-
return;
81-
}
58+
Response.StatusCode = 400;
59+
await Response.WriteAsync(JsonSerializer.Serialize(new { error = "Message cannot be empty." }), cancellationToken);
60+
return;
61+
}
8262

83-
if (string.IsNullOrWhiteSpace(request.Message))
84-
{
85-
Response.StatusCode = 400;
86-
await Response.WriteAsync(JsonSerializer.Serialize(new { error = "Message cannot be empty." }), cancellationToken);
87-
return;
88-
}
63+
// Require user authentication for chat
64+
if (!User.Identity?.IsAuthenticated ?? true)
65+
{
66+
Response.StatusCode = 401;
67+
await Response.WriteAsync(JsonSerializer.Serialize(new { error = "User must be logged in to use chat." }), cancellationToken);
68+
return;
69+
}
8970

90-
// Require user authentication for chat
91-
if (!User.Identity?.IsAuthenticated ?? true)
71+
Response.ContentType = "text/event-stream";
72+
Response.Headers.CacheControl = "no-cache";
73+
Response.Headers.Connection = "keep-alive";
74+
75+
await foreach (var (text, responseId) in _AiChatService.GetChatCompletionStream(
76+
prompt: request.Message,
77+
systemPrompt: request.SystemPrompt,
78+
previousResponseId: request.PreviousResponseId,
79+
enableContextualSearch: request.EnableContextualSearch,
80+
cancellationToken: cancellationToken))
81+
{
82+
if (!string.IsNullOrEmpty(text))
9283
{
93-
Response.StatusCode = 401;
94-
await Response.WriteAsync(JsonSerializer.Serialize(new { error = "User must be logged in to use chat." }), cancellationToken);
95-
return;
84+
var eventData = JsonSerializer.Serialize(new { type = "text", data = text });
85+
await Response.WriteAsync($"data: {eventData}\n\n", cancellationToken);
86+
await Response.Body.FlushAsync(cancellationToken);
9687
}
9788

98-
Response.ContentType = "text/event-stream";
99-
Response.Headers.CacheControl = "no-cache";
100-
Response.Headers.Connection = "keep-alive";
101-
102-
await foreach (var (text, responseId) in _AiChatService.GetChatCompletionStream(
103-
prompt: request.Message,
104-
systemPrompt: request.SystemPrompt,
105-
previousResponseId: request.PreviousResponseId,
106-
enableContextualSearch: request.EnableContextualSearch,
107-
cancellationToken: cancellationToken))
89+
if (!string.IsNullOrEmpty(responseId))
10890
{
109-
if (!string.IsNullOrEmpty(text))
110-
{
111-
var eventData = JsonSerializer.Serialize(new { type = "text", data = text });
112-
await Response.WriteAsync($"data: {eventData}\n\n", cancellationToken);
113-
await Response.Body.FlushAsync(cancellationToken);
114-
}
115-
116-
if (!string.IsNullOrEmpty(responseId))
117-
{
118-
var eventData = JsonSerializer.Serialize(new { type = "responseId", data = responseId });
119-
await Response.WriteAsync($"data: {eventData}\n\n", cancellationToken);
120-
await Response.Body.FlushAsync(cancellationToken);
121-
}
91+
var eventData = JsonSerializer.Serialize(new { type = "responseId", data = responseId });
92+
await Response.WriteAsync($"data: {eventData}\n\n", cancellationToken);
93+
await Response.Body.FlushAsync(cancellationToken);
12294
}
123-
124-
await Response.WriteAsync("data: [DONE]\n\n", cancellationToken);
125-
await Response.Body.FlushAsync(cancellationToken);
126-
}
127-
catch (OperationCanceledException)
128-
{
129-
Response.StatusCode = 499;
130-
await Response.WriteAsync(JsonSerializer.Serialize(new { error = "Request was cancelled." }), cancellationToken);
131-
}
132-
catch (Exception ex)
133-
{
134-
var sanitizedMessage = request.Message?.Replace("\n", "").Replace("\r", "");
135-
_Logger.LogError(ex, "Error processing streaming chat message: {Message}", sanitizedMessage);
136-
Response.StatusCode = 500;
137-
await Response.WriteAsync(JsonSerializer.Serialize(new { error = "An error occurred while processing your message. Please try again." }), cancellationToken);
13895
}
96+
97+
await Response.WriteAsync("data: [DONE]\n\n", cancellationToken);
98+
await Response.Body.FlushAsync(cancellationToken);
13999
}
140100
}

EssentialCSharp.Web/wwwroot/css/chat-widget.css

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,15 @@
1616
/* Optimized pulse animation */
1717
@keyframes pulse {
1818
0% {
19-
position: absolute !important;
20-
opacity: 1;
19+
opacity: 1;
2120
}
2221
50% {
23-
transform: scale(1.05);
24-
opacity: 0.9;
22+
transform: scale(1.05);
23+
opacity: 0.9;
2524
}
2625
100% {
27-
transform: scale(1);
28-
opacity: 1;
26+
transform: scale(1);
27+
opacity: 1;
2928
}
3029
}
3130

EssentialCSharp.Web/wwwroot/js/chat-module.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -400,11 +400,7 @@ export function useChatWidget() {
400400
isTyping,
401401
chatMessagesEl,
402402
chatInputField,
403-
404-
// Captcha state
405-
showCaptcha,
406-
captchaSiteKey,
407-
403+
408404
// Methods
409405
openChatDialog,
410406
closeChatDialog,

0 commit comments

Comments
 (0)