diff options
Diffstat (limited to 'BackEnd/Timeline/Services/User')
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; + } } } |