From 6edc70c00bca22e13ade23472d48d7b940f92eef Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Sat, 17 Aug 2019 19:56:42 +0800 Subject: Add change username. --- Timeline/Services/UserService.cs | 57 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'Timeline/Services/UserService.cs') diff --git a/Timeline/Services/UserService.cs b/Timeline/Services/UserService.cs index 27145683..96c3e256 100644 --- a/Timeline/Services/UserService.cs +++ b/Timeline/Services/UserService.cs @@ -121,6 +121,26 @@ namespace Timeline.Services public string Username { get; private set; } } + + /// + /// Thrown when the user already exists. + /// + [Serializable] + public class UserAlreadyExistException : Exception + { + public UserAlreadyExistException(string username) : base($"User {username} already exists.") { Username = username; } + public UserAlreadyExistException(string username, string message) : base(message) { Username = username; } + public UserAlreadyExistException(string message, Exception inner) : base(message, inner) { } + protected UserAlreadyExistException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + + /// + /// The username that already exists. + /// + public string Username { get; set; } + } + public interface IUserService { /// @@ -204,6 +224,17 @@ namespace Timeline.Services /// Thrown if the user with given username does not exist. /// Thrown if the old password is wrong. Task ChangePassword(string username, string oldPassword, string newPassword); + + /// + /// Change a user's username. + /// + /// The user's old username. + /// The new username. + /// Thrown if or is null or empty. + /// Thrown if the user with old username does not exist. + /// Thrown if the new username is not accepted because of bad format. + /// Thrown if user with the new username already exists. + Task ChangeUsername(string oldUsername, string newUsername); } internal class UserCache @@ -432,5 +463,31 @@ namespace Timeline.Services //clear cache RemoveCache(user.Id); } + + public async Task ChangeUsername(string oldUsername, string newUsername) + { + if (string.IsNullOrEmpty(oldUsername)) + throw new ArgumentException("Old username is null or empty", nameof(oldUsername)); + if (string.IsNullOrEmpty(newUsername)) + throw new ArgumentException("New username is null or empty", nameof(newUsername)); + + if (!_usernameValidator.Validate(newUsername, out var message)) + throw new UsernameBadFormatException(newUsername, $"New username is of bad format. {message}"); + + var user = await _databaseContext.Users.Where(u => u.Name == oldUsername).SingleOrDefaultAsync(); + if (user == null) + throw new UserNotExistException(oldUsername); + + var conflictUser = await _databaseContext.Users.Where(u => u.Name == newUsername).SingleOrDefaultAsync(); + if (conflictUser != null) + throw new UserAlreadyExistException(newUsername); + + user.Name = newUsername; + user.Version += 1; + await _databaseContext.SaveChangesAsync(); + _logger.LogInformation(FormatLogMessage("A user entry changed name field.", + Pair("Id", user.Id), Pair("Old Username", oldUsername), Pair("New Username", newUsername))); + RemoveCache(user.Id); + } } } -- cgit v1.2.3