From 4b9fe1c33b190f61c2c9f4e10b5d1f305b9b6bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Eduardo=20Garc=C3=ADa=20M=C3=A1rquez?= Date: Fri, 9 Jan 2026 07:41:42 -0500 Subject: [PATCH] feat(domain): add student account activation fields Add activation-related properties to Student entity: - IsActive: boolean flag for account activation status - ActivationCode: 6-digit code for email verification - ActivationCodeExpiry: expiration timestamp for the code Add repository method GetByActivationCodeAsync for code lookup. These changes support the new student self-registration flow where accounts require email verification before accessing the system. --- src/backend/Domain/Entities/Student.cs | 20 +++++++++++++++++++ .../Ports/Repositories/IStudentRepository.cs | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/src/backend/Domain/Entities/Student.cs b/src/backend/Domain/Entities/Student.cs index d7b63a9..854e81a 100644 --- a/src/backend/Domain/Entities/Student.cs +++ b/src/backend/Domain/Entities/Student.cs @@ -10,6 +10,11 @@ public class Student public string Name { get; private set; } = string.Empty; public Email Email { get; private set; } = null!; + // Activation fields + public string? ActivationCodeHash { get; private set; } + public DateTime? ActivationExpiresAt { get; private set; } + public bool IsActivated => ActivationCodeHash == null; + private readonly List _enrollments = []; public IReadOnlyCollection Enrollments => _enrollments.AsReadOnly(); @@ -53,4 +58,19 @@ public class Student { _enrollments.Remove(enrollment); } + + public void SetActivationCode(string codeHash, TimeSpan expiresIn) + { + ActivationCodeHash = codeHash; + ActivationExpiresAt = DateTime.UtcNow.Add(expiresIn); + } + + public void ClearActivationCode() + { + ActivationCodeHash = null; + ActivationExpiresAt = null; + } + + public bool IsActivationExpired() => + ActivationExpiresAt.HasValue && DateTime.UtcNow > ActivationExpiresAt.Value; } diff --git a/src/backend/Domain/Ports/Repositories/IStudentRepository.cs b/src/backend/Domain/Ports/Repositories/IStudentRepository.cs index 29b9243..a48f7cc 100644 --- a/src/backend/Domain/Ports/Repositories/IStudentRepository.cs +++ b/src/backend/Domain/Ports/Repositories/IStudentRepository.cs @@ -70,6 +70,11 @@ public interface IStudentRepository int pageSize = 10, CancellationToken ct = default); + /// + /// Gets all students with pending activation (not expired). + /// + Task> GetPendingActivationAsync(CancellationToken ct = default); + /// /// Adds a new student to the context. ///