Skip to content
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
14e3222
Merge pull request #1 from taiphanvan2k3/feat/setup-project-with-clea…
taiphanvan2k3 Sep 18, 2025
5cd882a
Merge pull request #2 from taiphanvan2k3/chore/write-documents-and-re…
taiphanvan2k3 Sep 20, 2025
bae25df
Bump FluentValidation from 11.9.2 to 12.0.0
dependabot[bot] Sep 20, 2025
1d5ed73
Bump FluentValidation.AspNetCore from 11.3.0 to 11.3.1
dependabot[bot] Sep 20, 2025
1485c37
Merge pull request #5 from taiphanvan2k3/dependabot/nuget/src/Applica…
taiphanvan2k3 Sep 20, 2025
55cff40
Merge pull request #6 from taiphanvan2k3/dependabot/nuget/src/Web.Api…
taiphanvan2k3 Sep 20, 2025
26c3d93
feat: Configure Docker and test with simple endpoints (#8)
taiphanvan2k3 Sep 20, 2025
bdf06e1
chore: Update readme (#9)
taiphanvan2k3 Sep 20, 2025
1d1edda
Bump AspNetCore.HealthChecks.Redis from 8.0.1 to 9.0.0 (#3)
dependabot[bot] Sep 20, 2025
885ad8f
Bump AspNetCore.HealthChecks.SqlServer from 8.0.2 to 9.0.0 (#4)
dependabot[bot] Sep 20, 2025
f7c3942
chore: Init Schema (#18)
taiphanvan2k3 Oct 27, 2025
5dbaac4
Bump Microsoft.AspNetCore.Authentication.JwtBearer from 8.0.0 to 8.0.…
dependabot[bot] Oct 27, 2025
cd09f4e
Bump Microsoft.AspNetCore.OpenApi from 8.0.10 to 8.0.21 (#17)
dependabot[bot] Oct 27, 2025
957c556
Bump Microsoft.EntityFrameworkCore and Npgsql.EntityFrameworkCore.Pos…
dependabot[bot] Oct 27, 2025
fac23ef
Bump Microsoft.EntityFrameworkCore.Design and Microsoft.EntityFramewo…
dependabot[bot] Oct 27, 2025
a76fe4c
Bump Microsoft.AspNetCore.Authentication.JwtBearer from 8.0.20 to 8.0…
dependabot[bot] Oct 27, 2025
d125d83
feat: Implement Identity (#24)
taiphanvan2k3 Oct 27, 2025
25e5b68
feat: Setup email configure and complete register endpoint (#32)
taiphanvan2k3 Nov 3, 2025
27c4e83
chore: Update dependabot content (#33)
taiphanvan2k3 Nov 3, 2025
948e24f
Bump Microsoft.AspNetCore.Identity.EntityFrameworkCore from 8.0.11 to…
dependabot[bot] Nov 3, 2025
dc6ab4c
feat: Implement verify email (#35)
taiphanvan2k3 Nov 3, 2025
b863848
Bump Microsoft.EntityFrameworkCore.Design and Swashbuckle.AspNetCore …
dependabot[bot] Nov 11, 2025
1ccec05
Dependabot/nuget/src/application/minor and patch 5e1fe4b923 (#39)
taiphanvan2k3 Nov 11, 2025
4d49a7c
Bump Microsoft.Extensions.Caching.StackExchangeRedis and 3 others (#37)
dependabot[bot] Nov 11, 2025
c8350d8
feat: Implement Google Login API (#41)
taiphanvan2k3 Nov 14, 2025
9de8b85
feat: Add CI/CD scripts for Google Cloud deployment (#42)
taiphanvan2k3 Nov 14, 2025
81b95bd
feat: Update Google Cloud deployment configuration and add production…
taiphanvan2k3 Nov 14, 2025
a36378d
feat: Update deployment configuration and production settings for Clo…
taiphanvan2k3 Nov 14, 2025
eabc176
feat: Allow production environment to access Swagger UI for testing (…
taiphanvan2k3 Nov 14, 2025
115612c
feat: Implement transaction handling and add AvatarUrl to User entity…
taiphanvan2k3 Nov 14, 2025
78ef231
feat: Implement send message API (#47)
taiphanvan2k3 Nov 15, 2025
e537c9c
feat: Implement api for CRUD conversation (#48)
taiphanvan2k3 Nov 18, 2025
e962c33
refactor: Update ConversationController to use HttpPatch for title up…
taiphanvan2k3 Nov 21, 2025
a19533c
fix: Recreate the wrong migration when creating full text search
taiphanvan2k3 Nov 21, 2025
677ef8b
Merge pull request #50 from DUT-Team-21TCLC-DT3/fix/recreate-add-full…
taiphanvan2k3 Nov 21, 2025
85fcfed
feat: Implement refresh token functionality and enhance authenticatio…
taiphanvan2k3 Nov 21, 2025
2190a9e
feat: Enhance security in token management with SecurityException and…
taiphanvan2k3 Nov 21, 2025
f3ca946
Merge pull request #51 from DUT-Team-21TCLC-DT3/feat/handle-remember-…
taiphanvan2k3 Nov 21, 2025
1dd3a30
refactor: Remove unused behaviors and exceptions, streamline error ha…
taiphanvan2k3 Nov 22, 2025
b404005
feat: Implement custom authorization filter and enhance JWT authentic…
taiphanvan2k3 Nov 22, 2025
b20dd7f
Merge pull request #52 from DUT-Team-21TCLC-DT3/refactor/change-all-c…
taiphanvan2k3 Nov 22, 2025
09a6870
feat: Implement external login functionality and user profile management
taiphanvan2k3 Nov 22, 2025
f2897b5
Merge pull request #53 from DUT-Team-21TCLC-DT3/feat/implement-profil…
taiphanvan2k3 Nov 22, 2025
d8d67ef
feat: Implement message deletion and update functionality
taiphanvan2k3 Nov 23, 2025
8f45b7d
Merge pull request #54 from DUT-Team-21TCLC-DT3/feat/implement-rename…
taiphanvan2k3 Nov 23, 2025
285a855
feat: Implement AI content generation with SignalR integration
taiphanvan2k3 Nov 23, 2025
fa00d61
Merge pull request #55 from DUT-Team-21TCLC-DT3/feat/integrate-with-s…
taiphanvan2k3 Nov 23, 2025
6549e39
refactor: Simplify GetHistoriesRequest and enhance error handling
taiphanvan2k3 Nov 23, 2025
9f700b8
Merge pull request #56 from DUT-Team-21TCLC-DT3/fix/wrong-cache-key-a…
taiphanvan2k3 Nov 23, 2025
8c03b05
feat: Add SwaggerController for Postman collection generation
taiphanvan2k3 Nov 23, 2025
3de63b8
Merge pull request #57 from DUT-Team-21TCLC-DT3/feat/implement-add-en…
taiphanvan2k3 Nov 23, 2025
367e386
refactor: Enhance SwaggerController for improved Postman collection g…
taiphanvan2k3 Nov 24, 2025
9e54c78
Merge pull request #58 from DUT-Team-21TCLC-DT3/feat/implement-add-en…
taiphanvan2k3 Nov 24, 2025
366833a
feat: Implement AI thinking activity and thought tracking
taiphanvan2k3 Nov 24, 2025
252b725
Merge pull request #59 from DUT-Team-21TCLC-DT3/feat/implement-saving…
taiphanvan2k3 Nov 24, 2025
f60be36
feat: Implement WebSocket support for AI content generation
taiphanvan2k3 Nov 27, 2025
ddca6bf
fix: Update error handling in WebSocketChatController and RawWebSocke…
taiphanvan2k3 Nov 27, 2025
2e84750
refactor: Improve WebSocketChatController error handling and resource…
taiphanvan2k3 Nov 27, 2025
9a3cc6c
Merge pull request #60 from DUT-Team-21TCLC-DT3/feat/implement-websoc…
taiphanvan2k3 Nov 27, 2025
3721316
feat: Integrate with AI service and configuration updates
taiphanvan2k3 Nov 29, 2025
1711b63
Merge pull request #61 from DUT-Team-21TCLC-DT3/feat/integrate-with-a…
taiphanvan2k3 Nov 29, 2025
7aed923
refactor: Remove unused namespaces
taiphanvan2k3 Nov 30, 2025
eaf9c4b
feat: Implement PDF export functionality for conversations
taiphanvan2k3 Nov 30, 2025
3c0c872
Merge pull request #62 from DUT-Team-21TCLC-DT3/feat/implement-export…
taiphanvan2k3 Nov 30, 2025
1b77768
fix: Enhance PDF service configuration for Linux environment
taiphanvan2k3 Nov 30, 2025
a9d1166
Merge pull request #63 from DUT-Team-21TCLC-DT3/fix/cannot-export-pdf…
taiphanvan2k3 Nov 30, 2025
034dff5
fix: Change verififcation url from localhost to remote
taiphanvan2k3 Dec 1, 2025
29c658e
feat: Configure to upload file to Google Storage Bucket
taiphanvan2k3 Dec 1, 2025
e1a1ece
Merge pull request #64 from DUT-Team-21TCLC-DT3/fix/change-verify-ema…
taiphanvan2k3 Dec 1, 2025
c6044a7
fix: Enable IronPdf support for Linux by adding the necessary package…
taiphanvan2k3 Dec 1, 2025
33b9b61
Merge pull request #65 from DUT-Team-21TCLC-DT3/fix/missing-iron-pdf-…
taiphanvan2k3 Dec 1, 2025
700c6dd
feat: Implement OpenTelemetry tracing and update Google Cloud credent…
taiphanvan2k3 Dec 1, 2025
f58e90a
Merge pull request #66 from DUT-Team-21TCLC-DT3/feat/setup-open-telem…
taiphanvan2k3 Dec 1, 2025
06cbcdc
fix: Update OpenTelemetry configuration for Google Cloud tracing
taiphanvan2k3 Dec 1, 2025
31745c0
Merge pull request #67 from DUT-Team-21TCLC-DT3/feat/setup-open-telem…
taiphanvan2k3 Dec 1, 2025
6e392f0
feat: Enhance OpenTelemetry tracing configuration for Google Cloud
taiphanvan2k3 Dec 2, 2025
f26074a
Merge pull request #68 from DUT-Team-21TCLC-DT3/feat/setup-open-telem…
taiphanvan2k3 Dec 2, 2025
7f39670
feat: Enhance Entity Framework Core logging and OpenTelemetry configu…
taiphanvan2k3 Dec 2, 2025
2cb5a6c
Merge pull request #69 from DUT-Team-21TCLC-DT3/fix/missing-ef-trace-…
taiphanvan2k3 Dec 2, 2025
8f589d4
fix: Missing trace from EF
taiphanvan2k3 Dec 2, 2025
9675211
Merge pull request #70 from DUT-Team-21TCLC-DT3/fix/missing-ef-trace-…
taiphanvan2k3 Dec 2, 2025
7239e12
feat: Configure to use Aspire Dashboard
taiphanvan2k3 Dec 2, 2025
71bf097
Merge pull request #71 from DUT-Team-21TCLC-DT3/feat/configure-to-use…
taiphanvan2k3 Dec 2, 2025
0a4b906
feat: Implement conversation statistics query and conversations list
taiphanvan2k3 Dec 2, 2025
4d2e2a0
Merge pull request #72 from DUT-Team-21TCLC-DT3/feat/enhance-response…
taiphanvan2k3 Dec 2, 2025
3aca7ba
refactor: Cannot verify email
taiphanvan2k3 Dec 2, 2025
e1b9192
Merge pull request #73 from DUT-Team-21TCLC-DT3/fix/cannot-verify-email
taiphanvan2k3 Dec 2, 2025
6203537
fix: Error sql when searching list of histories
taiphanvan2k3 Dec 2, 2025
ad73391
Merge pull request #74 from DUT-Team-21TCLC-DT3/fix/error-sql-when-se…
taiphanvan2k3 Dec 2, 2025
fab8def
feat(deploy): Optimize docker build time
taiphanvan2k3 Dec 2, 2025
5563199
Merge pull request #75 from DUT-Team-21TCLC-DT3/feat/optimize-build-time
taiphanvan2k3 Dec 2, 2025
8fb88b3
feat: Add comprehensive unit tests for application features
taiphanvan2k3 Dec 3, 2025
57b882f
feat: Add unit tests for authentication and user profile features
taiphanvan2k3 Dec 3, 2025
e451a90
Merge pull request #76 from DUT-Team-21TCLC-DT3/feat/apply-unit-test
taiphanvan2k3 Dec 3, 2025
e6dff14
Add retention days for uploaded artifacts
taiphanvan2k3 Dec 3, 2025
dfcbc8a
Set retention days for published app artifacts
taiphanvan2k3 Dec 3, 2025
b150e23
Comment out build artifacts upload step
taiphanvan2k3 Dec 3, 2025
c61b7c9
chore: Update CORS policy to include new origin
taiphanvan2k3 Dec 4, 2025
0e34c0e
Merge pull request #77 from DUT-Team-21TCLC-DT3/chore/update-cors-for…
taiphanvan2k3 Dec 4, 2025
80a6d17
feat: Implement message reporting feature
taiphanvan2k3 Dec 5, 2025
3ccfa9e
Merge pull request #78 from DUT-Team-21TCLC-DT3/feat/implement-messag…
taiphanvan2k3 Dec 5, 2025
4a938e4
Merge branch 'main' into main
taiphanvan2k3 Dec 17, 2025
816baa6
Merge pull request #81 from taiphanvan2k3/main
taiphanvan2k3 Dec 17, 2025
f2ceb1a
Bump the minor-and-patch group with 24 updates
dependabot[bot] Dec 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Domain.Enums;
using MediatR;
using ConversationAggregate = Domain.Entities.Conversation;
using ThoughtType = Domain.Enums.ThoughtType;

namespace Application.Features.Conversation.GenerateAIContent;

Expand All @@ -17,6 +18,7 @@ namespace Application.Features.Conversation.GenerateAIContent;
public sealed class GenerateAIContentQueryHandler(
IMessageRepository messageRepository,
IConversationRepository conversationRepository,
IThoughtRepository thoughtRepository,
IAIService aiService,
IChatNotifier chatNotifier,
IUnitOfWork unitOfWork,
Expand All @@ -27,6 +29,8 @@ public sealed class GenerateAIContentQueryHandler(
?? throw new ArgumentNullException(nameof(messageRepository));
private readonly IConversationRepository _conversationRepository = conversationRepository
?? throw new ArgumentNullException(nameof(conversationRepository));
private readonly IThoughtRepository _thoughtRepository = thoughtRepository
?? throw new ArgumentNullException(nameof(thoughtRepository));
private readonly IAIService _aiService = aiService
?? throw new ArgumentNullException(nameof(aiService));
private readonly ICurrentUserService _currentUserService = currentUserService
Expand Down Expand Up @@ -71,21 +75,25 @@ public async Task<Result<Unit>> Handle(GenerateAIContentQuery request, Cancellat
"You don't have access to this conversation"));
}

// 4. Create AI response message placeholder
var aiResponseMessage = conversation.AddMessage(
senderId: _currentUserService.UserId.Value,
content: "...Đang xử lý...", // Will be filled during streaming
type: MessageType.Text,
isFromBot: true
);

try
{
// 4. Create AI response message placeholder
var aiResponseMessage = conversation.AddMessage(
senderId: _currentUserService.UserId.Value,
content: "...Đang xử lý...", // Will be filled during streaming
type: MessageType.Text,
isFromBot: true
);
// 5. Create AI thinking activity through message
var thinkingActivity = aiResponseMessage.StartThinkingActivity();

await _messageRepository.AddAsync(aiResponseMessage, cancellationToken);
await _unitOfWork.SaveChangesAsync(cancellationToken);

// 5. Start AI streaming
// 6. Start AI streaming
var fullResponse = string.Empty;
var thoughtStep = 0;

await _aiService.GenerateResponseStreamAsync(
userMessage: message.Content,
Expand All @@ -97,13 +105,31 @@ await _aiService.GenerateResponseStreamAsync(
await _chatNotifier.SendChunkAsync(request.ConnectionId,
request.MessageId, request.ConversationId, chunk, cancellationToken);
},
onThought: (thought) => _chatNotifier.SendThoughtAsync(request.ConnectionId,
request.MessageId, request.ConversationId, thought, cancellationToken),
onThought: async (thought) =>
{
thoughtStep++;

// 1. Gửi notification cho client ngay lập tức để UI phản hồi nhanh
await _chatNotifier.SendThoughtAsync(request.ConnectionId,
request.MessageId, request.ConversationId, thought, cancellationToken);

var thoughtEntity = new Thought
{
ThinkingActivityId = thinkingActivity.Id,
StepNumber = thoughtStep,
Content = thought,
Type = ThoughtType.Reasoning
};

await _thoughtRepository.AddAsync(thoughtEntity, cancellationToken);
await _unitOfWork.SaveChangesAsync(cancellationToken);
},
cancellationToken: cancellationToken);

// 6. Update message with complete response
// 7. Complete the activity and update message
thinkingActivity.Complete();
aiResponseMessage.Content = fullResponse;
_messageRepository.Update(aiResponseMessage);

await _unitOfWork.SaveChangesAsync(cancellationToken);

// 7. Notify client that streaming is complete
Expand All @@ -114,12 +140,19 @@ await _chatNotifier.SendCompleteAsync(request.ConnectionId, request.MessageId,
}
catch (Exception ex)
{
// Mark activity as failed if it was created
if (aiResponseMessage?.ThinkingActivity != null && aiResponseMessage.ThinkingActivity.Status == ActivityStatus.Thinking)
{
aiResponseMessage.ThinkingActivity.Fail(ex.InnerException?.Message ?? ex.Message);
await _unitOfWork.SaveChangesAsync(cancellationToken);
}

// Notify client about error
await _chatNotifier.SendErrorAsync(request.ConnectionId, request.MessageId,
"Failed to generate AI response: " + ex.Message, cancellationToken);
"Failed to generate AI response: " + (ex.InnerException?.Message ?? ex.Message), cancellationToken);

return Result.Failure<Unit>(Error.Failure("AI.GenerationFailed",
$"Failed to generate AI response: {ex.Message}"));
$"Failed to generate AI response: {ex.InnerException?.Message ?? ex.Message}"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Application.Common.Behaviors;
using Application.Common.Models;
using Domain.Common;
using Domain.Entities;
using Domain.Enums;

namespace Application.Features.Conversation.GetMessages;
Expand Down Expand Up @@ -65,5 +66,82 @@ public sealed record MessageSummary
/// Thời gian chỉnh sửa
/// </summary>
public DateTimeOffset? EditedAt { get; init; }

/// <summary>
/// Thinking activity của AI (chỉ có cho messages từ assistant)
/// </summary>
public ThinkingActivitySummary? ThinkingActivity { get; init; }
}

/// <summary>
/// Thông tin ThinkingActivity cho message summary
/// </summary>
public sealed record ThinkingActivitySummary
{
/// <summary>
/// ID của thinking activity
/// </summary>
public required Guid Id { get; init; }

/// <summary>
/// Trạng thái (Thinking, Completed, Error, Cancelled)
/// </summary>
public required string Status { get; init; }

/// <summary>
/// Tổng thời gian suy nghĩ
/// </summary>
public TimeSpan? Duration { get; init; }

/// <summary>
/// Thời gian bắt đầu
/// </summary>
public DateTimeOffset? StartedAt { get; init; }

/// <summary>
/// Thời gian hoàn thành
/// </summary>
public DateTimeOffset? CompletedAt { get; init; }

/// <summary>
/// Lý do lỗi (nếu có)
/// </summary>
public string? ErrorReason { get; init; }

/// <summary>
/// Danh sách các thought steps
/// </summary>
public IReadOnlyList<ThoughtSummary> Thoughts { get; init; } = [];
}

/// <summary>
/// Thông tin Thought cho thinking activity
/// </summary>
public sealed record ThoughtSummary
{
/// <summary>
/// ID của thought
/// </summary>
public required Guid Id { get; init; }

/// <summary>
/// Số thứ tự bước suy nghĩ
/// </summary>
public required int StepNumber { get; init; }

/// <summary>
/// Nội dung suy nghĩ
/// </summary>
public required string Content { get; init; }

/// <summary>
/// Loại suy nghĩ (Reasoning, Conclusion, etc.)
/// </summary>
public required string Type { get; init; }

/// <summary>
/// Thời gian tạo
/// </summary>
public required DateTimeOffset CreatedAt { get; init; }
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
using Application.Interfaces.Services.Auth;
using Domain.Common;
using Domain.Constants;
using Domain.Entities;
using Domain.Enums;

namespace Application.Features.Conversation.GetMessages;

Expand Down Expand Up @@ -66,7 +68,24 @@ public async Task<Result<PaginatedResult<MessageSummary>>> Handle(GetMessagesQue
IsFromBot = m.IsFromAssistant(),
CreatedAt = m.CreatedAt,
IsEdited = m.IsEdited,
EditedAt = m.EditedAt
EditedAt = m.EditedAt,
ThinkingActivity = m.ThinkingActivity != null ? new ThinkingActivitySummary
{
Id = m.ThinkingActivity.Id,
Status = m.ThinkingActivity.Status.ToString(),
Duration = m.ThinkingActivity.Duration,
StartedAt = m.ThinkingActivity.StartedAt,
CompletedAt = m.ThinkingActivity.CompletedAt,
ErrorReason = m.ThinkingActivity.ErrorReason,
Thoughts = [.. m.ThinkingActivity.Thoughts.Select(t => new ThoughtSummary
{
Id = t.Id,
StepNumber = t.StepNumber,
Content = t.Content,
Type = t.Type.ToString(),
CreatedAt = t.CreatedAt
})]
} : null
})],
TotalCount = messagesResult.TotalCount,
PageNumber = messagesResult.PageNumber,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Domain.Entities;

namespace Application.Interfaces.Repositories;

/// <summary>
/// Interface for ThinkingActivity repository to handle data operations.
/// </summary>
public interface IThinkingActivityRepository
{
Task AddAsync(ThinkingActivity activity, CancellationToken cancellationToken = default);
Task<ThinkingActivity?> GetByMessageIdAsync(Guid messageId, CancellationToken cancellationToken = default);
void Update(ThinkingActivity activity);
}
22 changes: 22 additions & 0 deletions src/Application/Interfaces/Repositories/IThoughtRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Application.Common.Models;
using Domain.Entities;

namespace Application.Interfaces.Repositories;

/// <summary>
/// Interface for Thought repository to handle data operations.
/// </summary>
public interface IThoughtRepository
{
Task AddAsync(Thought thought, CancellationToken cancellationToken = default);
Task AddRangeAsync(IEnumerable<Thought> thoughts, CancellationToken cancellationToken = default);
Task<PaginatedResult<Thought>> GetByActivityIdAsync(
Guid thinkingActivityId,
PaginationRequest paginationRequest,
CancellationToken cancellationToken = default);
Task<IReadOnlyList<Thought>> GetByActivityIdOrderedAsync(
Guid thinkingActivityId,
CancellationToken cancellationToken = default);
Task<Thought?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);
Task<int> GetMaxStepNumberAsync(Guid thinkingActivityId, CancellationToken cancellationToken = default);
}
28 changes: 28 additions & 0 deletions src/Domain/Entities/Message.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,32 @@ public string GetPreview(int maxLength = 100)
/// Check if message is from user
/// </summary>
public bool IsFromUser() => string.Equals(Role, MessageRoles.User, StringComparison.OrdinalIgnoreCase);

// Navigation properties
public ThinkingActivity? ThinkingActivity { get; set; }

/// <summary>
/// Start a thinking activity for this AI message
/// </summary>
public ThinkingActivity StartThinkingActivity()
{
if (!IsFromAssistant())
{
throw new InvalidOperationException("Only AI assistant messages can have thinking activities");
}

if (ThinkingActivity != null)
{
throw new InvalidOperationException("Message already has an activity");
}

ThinkingActivity = new ThinkingActivity
{
MessageId = Id,
Status = ActivityStatus.Thinking
};
ThinkingActivity.Start();

return ThinkingActivity;
}
}
2 changes: 1 addition & 1 deletion src/Domain/Entities/RefreshToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,6 @@ public void Revoke(string reason, string? replacedByToken = null)
{
RevokedAt = DateTimeOffset.UtcNow;
RevokedReason = reason;
ReplacedByToken = replacedByToken ?? Token;
ReplacedByToken = replacedByToken;
}
}
Loading