aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline/Services/User
diff options
context:
space:
mode:
Diffstat (limited to 'BackEnd/Timeline/Services/User')
-rw-r--r--BackEnd/Timeline/Services/User/CreateUserParams.cs2
-rw-r--r--BackEnd/Timeline/Services/User/RegisterCode/IRegisterCodeService.cs12
-rw-r--r--BackEnd/Timeline/Services/User/RegisterCode/InvalidRegisterCodeException.cs42
-rw-r--r--BackEnd/Timeline/Services/User/RegisterCode/RegisterCodeService.cs20
4 files changed, 74 insertions, 2 deletions
diff --git a/BackEnd/Timeline/Services/User/CreateUserParams.cs b/BackEnd/Timeline/Services/User/CreateUserParams.cs
index e66f83dc..994268a0 100644
--- a/BackEnd/Timeline/Services/User/CreateUserParams.cs
+++ b/BackEnd/Timeline/Services/User/CreateUserParams.cs
@@ -3,7 +3,7 @@
namespace Timeline.Services.User
{
public class CreateUserParams
- {
+ {
public CreateUserParams(string username, string password)
{
Username = username ?? throw new ArgumentNullException(nameof(username));
diff --git a/BackEnd/Timeline/Services/User/RegisterCode/IRegisterCodeService.cs b/BackEnd/Timeline/Services/User/RegisterCode/IRegisterCodeService.cs
index e0031a38..fe1188ea 100644
--- a/BackEnd/Timeline/Services/User/RegisterCode/IRegisterCodeService.cs
+++ b/BackEnd/Timeline/Services/User/RegisterCode/IRegisterCodeService.cs
@@ -46,6 +46,18 @@ namespace Timeline.Services.User.RegisterCode
Task<UserRegisterInfo?> GetUserRegisterInfoAsync(long userId);
/// <summary>
+ /// Create a user with register code.
+ /// </summary>
+ /// <param name="userParams">The params to create user with.</param>
+ /// <param name="registerCode">The user code.</param>
+ /// <returns>The created user.</returns>
+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="userParams"/> or <paramref name="registerCode"/> is null.</exception>
+ /// <exception cref="ArgumentException">Thrown when <paramref name="userParams"/> is invalid.</exception>
+ /// <exception cref="EntityAlreadyExistException">Thrown when username already exist.</exception>
+ /// <exception cref="InvalidRegisterCodeException">Thrown when register code is invalid.</exception>
+ Task<UserEntity> RegisterUserWithCode(CreateUserParams userParams, string registerCode);
+
+ /// <summary>
/// Get the list of user register info of the specified introducer.
/// </summary>
/// <param name="introducerId"></param>
diff --git a/BackEnd/Timeline/Services/User/RegisterCode/InvalidRegisterCodeException.cs b/BackEnd/Timeline/Services/User/RegisterCode/InvalidRegisterCodeException.cs
new file mode 100644
index 00000000..d779609b
--- /dev/null
+++ b/BackEnd/Timeline/Services/User/RegisterCode/InvalidRegisterCodeException.cs
@@ -0,0 +1,42 @@
+using System;
+namespace Timeline.Services.User.RegisterCode
+{
+
+ [Serializable]
+ public class InvalidRegisterCodeException : Exception
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="T:InvalidRegisterCodeException"/> class
+ /// </summary>
+ public InvalidRegisterCodeException()
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="T:InvalidRegisterCodeException"/> class
+ /// </summary>
+ /// <param name="message">A <see cref="T:System.String"/> that describes the exception. </param>
+ public InvalidRegisterCodeException(string message) : base(message)
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="T:InvalidRegisterCodeException"/> class
+ /// </summary>
+ /// <param name="message">A <see cref="T:System.String"/> that describes the exception. </param>
+ /// <param name="inner">The exception that is the cause of the current exception. </param>
+ public InvalidRegisterCodeException(string message, System.Exception inner) : base(message, inner)
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="T:InvalidRegisterCodeException"/> class
+ /// </summary>
+ /// <param name="context">The contextual information about the source or destination.</param>
+ /// <param name="info">The object that holds the serialized object data.</param>
+ protected InvalidRegisterCodeException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context)
+ {
+ }
+ }
+}
+
diff --git a/BackEnd/Timeline/Services/User/RegisterCode/RegisterCodeService.cs b/BackEnd/Timeline/Services/User/RegisterCode/RegisterCodeService.cs
index 97a685d6..254d3747 100644
--- a/BackEnd/Timeline/Services/User/RegisterCode/RegisterCodeService.cs
+++ b/BackEnd/Timeline/Services/User/RegisterCode/RegisterCodeService.cs
@@ -14,13 +14,17 @@ namespace Timeline.Services.User.RegisterCode
private readonly DatabaseContext _databaseContext;
private readonly IUserService _userService;
+ private readonly IClock _clock;
+
private readonly RandomNumberGenerator _randomNumberGenerator;
- public RegisterCodeService(DatabaseContext databaseContext, IUserService userService)
+ public RegisterCodeService(DatabaseContext databaseContext, IUserService userService, IClock clock)
{
_databaseContext = databaseContext;
_userService = userService;
+ _clock = clock;
+
_randomNumberGenerator = RandomNumberGenerator.Create();
}
@@ -99,6 +103,20 @@ namespace Timeline.Services.User.RegisterCode
{
throw new NotImplementedException();
}
+
+ public async Task<UserEntity> RegisterUserWithCode(CreateUserParams userParams, string registerCode)
+ {
+ var registerCodeOwner = await GetCodeOwnerAsync(registerCode);
+ if (registerCodeOwner is null)
+ {
+ throw new InvalidRegisterCodeException("Register code is invalid.");
+ }
+
+ var user = await _userService.CreateUserAsync(userParams);
+ await CreateRegisterInfoAsync(user.Id, registerCode, _clock.GetCurrentTime());
+
+ return user;
+ }
}
}