using Femto.Common.Domain; namespace Femto.Modules.Auth.Models; public class SignupCode { private static readonly TimeSpan ExpiryTime = TimeSpan.FromDays(14); public string Code { get; private set; } /// /// The email of the intended recipient /// public string RecipientEmail { get; private set; } /// /// The name of the intended recipient /// public string RecipientName { get; private set; } public DateTimeOffset CreatedAt { get; private set; } public DateTimeOffset? ExpiresAt { get; private set; } public Guid? RedeemingUserId { get; private set; } private SignupCode() { } public SignupCode(string recipientEmail, string recipientName, string code) { this.Code = code; this.RecipientEmail = recipientEmail; this.RecipientName = recipientName; this.CreatedAt = DateTimeOffset.UtcNow; this.ExpiresAt = this.CreatedAt + ExpiryTime; } public void Redeem(Guid userGuid) { if (this.RedeemingUserId is not null) throw new DomainError("invalid signup code"); this.RedeemingUserId = userGuid; } }