From 536dba83194800befce9357bc1cffbed4bb47728 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 11 Aug 2020 00:39:10 +0800 Subject: User service update time fields of user. --- Timeline.Tests/Helpers/TestDatabase.cs | 2 +- Timeline.Tests/Services/TimelineServiceTest.cs | 2 +- Timeline/Models/User.cs | 10 ++++++---- Timeline/Services/UserService.cs | 27 +++++++++++++++++++++----- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/Timeline.Tests/Helpers/TestDatabase.cs b/Timeline.Tests/Helpers/TestDatabase.cs index 40f8f2d4..f0c26180 100644 --- a/Timeline.Tests/Helpers/TestDatabase.cs +++ b/Timeline.Tests/Helpers/TestDatabase.cs @@ -36,7 +36,7 @@ namespace Timeline.Tests.Helpers if (_createUser) { var passwordService = new PasswordService(); - var userService = new UserService(NullLogger.Instance, context, passwordService); + var userService = new UserService(NullLogger.Instance, context, passwordService, new Clock()); await userService.CreateUser(new User { diff --git a/Timeline.Tests/Services/TimelineServiceTest.cs b/Timeline.Tests/Services/TimelineServiceTest.cs index 919400a3..e129b49d 100644 --- a/Timeline.Tests/Services/TimelineServiceTest.cs +++ b/Timeline.Tests/Services/TimelineServiceTest.cs @@ -41,7 +41,7 @@ namespace Timeline.Tests.Services await _testDatabase.InitializeAsync(); _databaseContext = _testDatabase.CreateContext(); _dataManager = new DataManager(_databaseContext, _eTagGenerator); - _userService = new UserService(NullLogger.Instance, _databaseContext, _passwordService); + _userService = new UserService(NullLogger.Instance, _databaseContext, _passwordService, _clock); _timelineService = new TimelineService(NullLogger.Instance, _databaseContext, _dataManager, _userService, _imageValidator, _clock); } diff --git a/Timeline/Models/User.cs b/Timeline/Models/User.cs index fa780efd..3d0b2f1a 100644 --- a/Timeline/Models/User.cs +++ b/Timeline/Models/User.cs @@ -1,19 +1,21 @@ -namespace Timeline.Models +using System; + +namespace Timeline.Models { public class User { public string? UniqueId { get; set; } public string? Username { get; set; } public string? Nickname { get; set; } - - #region adminsecret public bool? Administrator { get; set; } - #endregion adminsecret #region secret public long? Id { get; set; } public string? Password { get; set; } public long? Version { get; set; } + public DateTimeOffset? UsernameChangeTime { get; set; } + public DateTimeOffset? CreateTime { get; set; } + public DateTimeOffset? LastModified { get; set; } #endregion secret } } diff --git a/Timeline/Services/UserService.cs b/Timeline/Services/UserService.cs index 91d27965..4e56c86a 100644 --- a/Timeline/Services/UserService.cs +++ b/Timeline/Services/UserService.cs @@ -158,6 +158,7 @@ namespace Timeline.Services public class UserService : IUserService { private readonly ILogger _logger; + private readonly IClock _clock; private readonly DatabaseContext _databaseContext; @@ -165,9 +166,10 @@ namespace Timeline.Services private readonly UsernameValidator _usernameValidator = new UsernameValidator(); private readonly NicknameValidator _nicknameValidator = new NicknameValidator(); - public UserService(ILogger logger, DatabaseContext databaseContext, IPasswordService passwordService) + public UserService(ILogger logger, DatabaseContext databaseContext, IPasswordService passwordService, IClock clock) { _logger = logger; + _clock = clock; _databaseContext = databaseContext; _passwordService = passwordService; } @@ -210,7 +212,10 @@ namespace Timeline.Services Administrator = UserRoleConvert.ToBool(entity.Roles), Nickname = string.IsNullOrEmpty(entity.Nickname) ? entity.Username : entity.Nickname, Id = entity.Id, - Version = entity.Version + Version = entity.Version, + CreateTime = entity.CreateTime, + UsernameChangeTime = entity.UsernameChangeTime, + LastModified = entity.LastModified }; } @@ -343,14 +348,19 @@ namespace Timeline.Services { if (info != null) { + DateTimeOffset now = _clock.GetCurrentTime(); + bool updateLastModified = false; + var username = info.Username; - if (username != null) + if (username != null && username != entity.Username) { var conflict = await _databaseContext.Users.AnyAsync(u => u.Username == username); if (conflict) ThrowUsernameConflict(); entity.Username = username; + entity.UsernameChangeTime = now; + updateLastModified = true; } var password = info.Password; @@ -361,15 +371,22 @@ namespace Timeline.Services } var administrator = info.Administrator; - if (administrator.HasValue) + if (administrator.HasValue && UserRoleConvert.ToBool(entity.Roles) != administrator) { entity.Roles = UserRoleConvert.ToString(administrator.Value); + updateLastModified = true; } var nickname = info.Nickname; - if (nickname != null) + if (nickname != null && nickname != entity.Nickname) { entity.Nickname = nickname; + updateLastModified = true; + } + + if (updateLastModified) + { + entity.LastModified = now; } } } -- cgit v1.2.3