From b86c8cf5130d21ac56e733640cecd08945d30e6d Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 18 Apr 2019 21:23:21 +0800 Subject: Add user management REST api. --- Timeline/Services/UserService.cs | 155 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 146 insertions(+), 9 deletions(-) (limited to 'Timeline/Services/UserService.cs') diff --git a/Timeline/Services/UserService.cs b/Timeline/Services/UserService.cs index ad36c37b..caeb4efe 100644 --- a/Timeline/Services/UserService.cs +++ b/Timeline/Services/UserService.cs @@ -13,10 +13,40 @@ namespace Timeline.Services public UserInfo UserInfo { get; set; } } - public enum CreateUserResult + public enum PutUserResult { + /// + /// A new user is created. + /// + Created, + /// + /// A existing user is modified. + /// + Modified + } + + public enum PatchUserResult + { + /// + /// Succeed to modify user. + /// Success, - AlreadyExists + /// + /// A user of given username does not exist. + /// + NotExists + } + + public enum DeleteUserResult + { + /// + /// Succeed to delete user. + /// + Success, + /// + /// A user of given username does not exist. + /// + NotExists } public interface IUserService @@ -38,7 +68,51 @@ namespace Timeline.Services /// Return null if verification failed. The user info if verification succeeded. Task VerifyToken(string token); - Task CreateUser(string username, string password, string[] roles); + /// + /// Get the user info of given username. + /// + /// Username of the user. + /// The info of the user. Null if the user of given username does not exists. + Task GetUser(string username); + + /// + /// List all users. + /// + /// The user info of users. + Task ListUsers(); + + /// + /// Create or modify a user with given username. + /// Return if a new user is created. + /// Return if a existing user is modified. + /// + /// Username of user. + /// Password of user. + /// Array of roles of user. + /// Return if a new user is created. + /// Return if a existing user is modified. + Task PutUser(string username, string password, string[] roles); + + /// + /// Partially modify a use of given username. + /// + /// Username of the user to modify. + /// New password. If not modify, then null. + /// New roles. If not modify, then null. + /// Return if modification succeeds. + /// Return if the user of given username doesn't exist. + Task PatchUser(string username, string password, string[] roles); + + /// + /// Delete a user of given username. + /// Return if success to delete. + /// Return if the user of given username + /// does not exist. + /// + /// Username of thet user to delete. + /// if success to delete. + /// if the user doesn't exist. + Task DeleteUser(string username); } public class UserService : IUserService @@ -108,19 +182,82 @@ namespace Timeline.Services return new UserInfo(user); } - public async Task CreateUser(string username, string password, string[] roles) + public async Task GetUser(string username) { - var exists = (await _databaseContext.Users.Where(u => u.Name == username).ToListAsync()).Count != 0; + return await _databaseContext.Users + .Where(user => user.Name == username) + .Select(user => new UserInfo(user)).SingleOrDefaultAsync(); + } - if (exists) + public async Task ListUsers() + { + return await _databaseContext.Users.Select(user => new UserInfo(user)).ToArrayAsync(); + } + + public async Task PutUser(string username, string password, string[] roles) + { + var user = await _databaseContext.Users.Where(u => u.Name == username).SingleOrDefaultAsync(); + + if (user == null) { - return CreateUserResult.AlreadyExists; + await _databaseContext.AddAsync(new User + { + Name = username, + EncryptedPassword = _passwordService.HashPassword(password), + RoleString = string.Join(',', roles) + }); + await _databaseContext.SaveChangesAsync(); + return PutUserResult.Created; } - await _databaseContext.Users.AddAsync(new User { Name = username, EncryptedPassword = _passwordService.HashPassword(password), RoleString = string.Join(',', roles) }); + user.EncryptedPassword = _passwordService.HashPassword(password); + user.RoleString = string.Join(',', roles); await _databaseContext.SaveChangesAsync(); - return CreateUserResult.Success; + return PutUserResult.Modified; + } + + public async Task PatchUser(string username, string password, string[] roles) + { + var user = await _databaseContext.Users.Where(u => u.Name == username).SingleOrDefaultAsync(); + + if (user == null) + return PatchUserResult.NotExists; + + bool modified = false; + + if (password != null) + { + modified = true; + user.EncryptedPassword = _passwordService.HashPassword(password); + } + + if (roles != null) + { + modified = true; + user.RoleString = string.Join(',', roles); + } + + if (modified) + { + await _databaseContext.SaveChangesAsync(); + } + + return PatchUserResult.Success; + } + + public async Task DeleteUser(string username) + { + var user = await _databaseContext.Users.Where(u => u.Name == username).SingleOrDefaultAsync(); + + if (user == null) + { + return DeleteUserResult.NotExists; + } + + _databaseContext.Users.Remove(user); + await _databaseContext.SaveChangesAsync(); + return DeleteUserResult.Success; } } } -- cgit v1.2.3