aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline/Services/User
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-03-25 20:20:47 +0800
committercrupest <crupest@outlook.com>2022-03-25 20:20:47 +0800
commit34305283aca89b8b2ebacd26ad3faf859a6a78b0 (patch)
tree7eb0d518111a4714056fe50b538bc0dd6311b4e3 /BackEnd/Timeline/Services/User
parent65b2e7f6984b8776e603bd8ae847c9e2a9bd5ad6 (diff)
downloadtimeline-34305283aca89b8b2ebacd26ad3faf859a6a78b0.tar.gz
timeline-34305283aca89b8b2ebacd26ad3faf859a6a78b0.tar.bz2
timeline-34305283aca89b8b2ebacd26ad3faf859a6a78b0.zip
Diffstat (limited to 'BackEnd/Timeline/Services/User')
-rw-r--r--BackEnd/Timeline/Services/User/Avatar/UserAvatarService.cs14
-rw-r--r--BackEnd/Timeline/Services/User/BasicUserService.cs65
-rw-r--r--BackEnd/Timeline/Services/User/CreateTokenResult.cs12
-rw-r--r--BackEnd/Timeline/Services/User/IBasicUserService.cs36
-rw-r--r--BackEnd/Timeline/Services/User/IUserService.cs29
-rw-r--r--BackEnd/Timeline/Services/User/UserPermissionService.cs8
-rw-r--r--BackEnd/Timeline/Services/User/UserService.cs71
-rw-r--r--BackEnd/Timeline/Services/User/UserServiceExtensions.cs (renamed from BackEnd/Timeline/Services/User/BasicUserServiceExtensions.cs)4
-rw-r--r--BackEnd/Timeline/Services/User/UserServicesServiceCollectionExtensions.cs1
9 files changed, 96 insertions, 144 deletions
diff --git a/BackEnd/Timeline/Services/User/Avatar/UserAvatarService.cs b/BackEnd/Timeline/Services/User/Avatar/UserAvatarService.cs
index 92979a68..8b1a69a0 100644
--- a/BackEnd/Timeline/Services/User/Avatar/UserAvatarService.cs
+++ b/BackEnd/Timeline/Services/User/Avatar/UserAvatarService.cs
@@ -15,7 +15,7 @@ namespace Timeline.Services.User.Avatar
{
private readonly ILogger<UserAvatarService> _logger;
private readonly DatabaseContext _database;
- private readonly IBasicUserService _basicUserService;
+ private readonly IUserService _userService;
private readonly IDefaultUserAvatarProvider _defaultUserAvatarProvider;
private readonly IImageService _imageService;
private readonly IDataManager _dataManager;
@@ -24,7 +24,7 @@ namespace Timeline.Services.User.Avatar
public UserAvatarService(
ILogger<UserAvatarService> logger,
DatabaseContext database,
- IBasicUserService basicUserService,
+ IUserService basicUserService,
IDefaultUserAvatarProvider defaultUserAvatarProvider,
IImageService imageValidator,
IDataManager dataManager,
@@ -32,7 +32,7 @@ namespace Timeline.Services.User.Avatar
{
_logger = logger;
_database = database;
- _basicUserService = basicUserService;
+ _userService = basicUserService;
_defaultUserAvatarProvider = defaultUserAvatarProvider;
_imageService = imageValidator;
_dataManager = dataManager;
@@ -41,7 +41,7 @@ namespace Timeline.Services.User.Avatar
public async Task<ICacheableDataDigest> GetAvatarDigestAsync(long userId)
{
- var usernameChangeTime = await _basicUserService.GetUsernameLastModifiedTimeAsync(userId);
+ var usernameChangeTime = await _userService.GetUsernameLastModifiedTimeAsync(userId);
var entity = await _database.UserAvatars.Where(a => a.UserId == userId).Select(a => new { a.DataTag, a.LastModified }).SingleOrDefaultAsync();
@@ -63,7 +63,7 @@ namespace Timeline.Services.User.Avatar
public async Task<ByteData> GetAvatarAsync(long userId)
{
- await _basicUserService.ThrowIfUserNotExist(userId);
+ await _userService.ThrowIfUserNotExist(userId);
var entity = await _database.UserAvatars.Where(a => a.UserId == userId).SingleOrDefaultAsync();
@@ -91,7 +91,7 @@ namespace Timeline.Services.User.Avatar
await _imageService.ValidateAsync(avatar.Data, avatar.ContentType, true);
- await _basicUserService.ThrowIfUserNotExist(userId);
+ await _userService.ThrowIfUserNotExist(userId);
var entity = await _database.UserAvatars.Where(a => a.UserId == userId).SingleOrDefaultAsync();
@@ -133,7 +133,7 @@ namespace Timeline.Services.User.Avatar
public async Task DeleteAvatarAsync(long userId)
{
- await _basicUserService.ThrowIfUserNotExist(userId);
+ await _userService.ThrowIfUserNotExist(userId);
var entity = await _database.UserAvatars.Where(a => a.UserId == userId).SingleOrDefaultAsync();
diff --git a/BackEnd/Timeline/Services/User/BasicUserService.cs b/BackEnd/Timeline/Services/User/BasicUserService.cs
deleted file mode 100644
index 0ee8dabd..00000000
--- a/BackEnd/Timeline/Services/User/BasicUserService.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using Timeline.Entities;
-using Timeline.Models.Validation;
-
-namespace Timeline.Services.User
-{
- public class BasicUserService : IBasicUserService
- {
- private readonly DatabaseContext _database;
-
- private readonly UsernameValidator _usernameValidator = new UsernameValidator();
-
- public BasicUserService(DatabaseContext database)
- {
- _database = database;
- }
-
- protected static EntityNotExistException CreateUserNotExistException(string username)
- {
- return new EntityNotExistException(EntityTypes.User,
- new Dictionary<string, object> { ["username"] = username });
- }
-
- protected static EntityNotExistException CreateUserNotExistException(long id)
- {
- return new EntityNotExistException(EntityTypes.User,
- new Dictionary<string, object> { ["id"] = id });
- }
-
- public async Task<bool> CheckUserExistenceAsync(long id)
- {
- return await _database.Users.AnyAsync(u => u.Id == id);
- }
-
- public async Task<long> GetUserIdByUsernameAsync(string username)
- {
- if (username == null)
- throw new ArgumentNullException(nameof(username));
-
- if (!_usernameValidator.Validate(username, out var message))
- throw new ArgumentException(message);
-
- var entity = await _database.Users.Where(user => user.Username == username).Select(u => new { u.Id }).SingleOrDefaultAsync();
-
- if (entity == null)
- throw CreateUserNotExistException(username);
-
- return entity.Id;
- }
-
- public async Task<DateTime> GetUsernameLastModifiedTimeAsync(long userId)
- {
- var entity = await _database.Users.Where(u => u.Id == userId).Select(u => new { u.UsernameChangeTime }).SingleOrDefaultAsync();
-
- if (entity is null)
- throw CreateUserNotExistException(userId);
-
- return entity.UsernameChangeTime;
- }
- }
-}
diff --git a/BackEnd/Timeline/Services/User/CreateTokenResult.cs b/BackEnd/Timeline/Services/User/CreateTokenResult.cs
deleted file mode 100644
index b71a9e9e..00000000
--- a/BackEnd/Timeline/Services/User/CreateTokenResult.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using Timeline.Entities;
-
-namespace Timeline.Services.User
-{
- public class CreateTokenResult
- {
- public string Token { get; set; } = default!;
- public UserEntity User { get; set; } = default!;
- }
-}
-
diff --git a/BackEnd/Timeline/Services/User/IBasicUserService.cs b/BackEnd/Timeline/Services/User/IBasicUserService.cs
deleted file mode 100644
index 0ae3fdff..00000000
--- a/BackEnd/Timeline/Services/User/IBasicUserService.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.Threading.Tasks;
-
-namespace Timeline.Services.User
-{
- /// <summary>
- /// This service provide some basic user features, which should be used internally for other services.
- /// </summary>
- public interface IBasicUserService
- {
- /// <summary>
- /// Check if a user exists.
- /// </summary>
- /// <param name="id">The id of the user.</param>
- /// <returns>True if exists. Otherwise false.</returns>
- Task<bool> CheckUserExistenceAsync(long id);
-
- /// <summary>
- /// Get the user id of given username.
- /// </summary>
- /// <param name="username">Username of the user.</param>
- /// <returns>The id of the user.</returns>
- /// <exception cref="ArgumentNullException">Thrown when <paramref name="username"/> is null.</exception>
- /// <exception cref="ArgumentException">Thrown when <paramref name="username"/> is of bad format.</exception>
- /// <exception cref="EntityNotExistException">Thrown when the user with given username does not exist.</exception>
- Task<long> GetUserIdByUsernameAsync(string username);
-
- /// <summary>
- /// Get the username modified time of a user.
- /// </summary>
- /// <param name="userId">User id.</param>
- /// <returns>The time.</returns>
- /// <exception cref="EntityNotExistException">Thrown when user does not exist.</exception>
- Task<DateTime> GetUsernameLastModifiedTimeAsync(long userId);
- }
-}
diff --git a/BackEnd/Timeline/Services/User/IUserService.cs b/BackEnd/Timeline/Services/User/IUserService.cs
index 745bd524..6ea9a4d2 100644
--- a/BackEnd/Timeline/Services/User/IUserService.cs
+++ b/BackEnd/Timeline/Services/User/IUserService.cs
@@ -5,8 +5,33 @@ using Timeline.Entities;
namespace Timeline.Services.User
{
- public interface IUserService : IBasicUserService
- {
+ public interface IUserService
+ {
+ /// <summary>
+ /// Check if a user exists.
+ /// </summary>
+ /// <param name="id">The id of the user.</param>
+ /// <returns>True if exists. Otherwise false.</returns>
+ Task<bool> CheckUserExistenceAsync(long id);
+
+ /// <summary>
+ /// Get the user id of given username.
+ /// </summary>
+ /// <param name="username">Username of the user.</param>
+ /// <returns>The id of the user.</returns>
+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="username"/> is null.</exception>
+ /// <exception cref="ArgumentException">Thrown when <paramref name="username"/> is of bad format.</exception>
+ /// <exception cref="EntityNotExistException">Thrown when the user with given username does not exist.</exception>
+ Task<long> GetUserIdByUsernameAsync(string username);
+
+ /// <summary>
+ /// Get the username modified time of a user.
+ /// </summary>
+ /// <param name="userId">User id.</param>
+ /// <returns>The time.</returns>
+ /// <exception cref="EntityNotExistException">Thrown when user does not exist.</exception>
+ Task<DateTime> GetUsernameLastModifiedTimeAsync(long userId);
+
/// <summary>
/// Try to get a user by id.
/// </summary>
diff --git a/BackEnd/Timeline/Services/User/UserPermissionService.cs b/BackEnd/Timeline/Services/User/UserPermissionService.cs
index f6f11c61..69c23b84 100644
--- a/BackEnd/Timeline/Services/User/UserPermissionService.cs
+++ b/BackEnd/Timeline/Services/User/UserPermissionService.cs
@@ -8,19 +8,19 @@ namespace Timeline.Services.User
public class UserPermissionService : IUserPermissionService
{
private readonly DatabaseContext _database;
- private readonly IBasicUserService _basicUserService;
+ private readonly IUserService _userService;
- public UserPermissionService(DatabaseContext database, IBasicUserService basicUserService)
+ public UserPermissionService(DatabaseContext database, IUserService userService)
{
_database = database;
- _basicUserService = basicUserService;
+ _userService = userService;
}
private async Task CheckUserExistence(long userId, bool checkUserExistence)
{
if (checkUserExistence)
{
- await _basicUserService.ThrowIfUserNotExist(userId);
+ await _userService.ThrowIfUserNotExist(userId);
}
}
diff --git a/BackEnd/Timeline/Services/User/UserService.cs b/BackEnd/Timeline/Services/User/UserService.cs
index 1ad74bec..d5ee9a2f 100644
--- a/BackEnd/Timeline/Services/User/UserService.cs
+++ b/BackEnd/Timeline/Services/User/UserService.cs
@@ -11,12 +11,12 @@ using Timeline.Services.Token;
namespace Timeline.Services.User
{
- public class UserService : BasicUserService, IUserService
+ public class UserService : IUserService
{
private readonly ILogger<UserService> _logger;
private readonly IClock _clock;
- private readonly DatabaseContext _databaseContext;
+ private readonly DatabaseContext _database;
private readonly IPasswordService _passwordService;
@@ -25,10 +25,10 @@ namespace Timeline.Services.User
private readonly UsernameValidator _usernameValidator = new UsernameValidator();
private readonly NicknameValidator _nicknameValidator = new NicknameValidator();
- public UserService(ILogger<UserService> logger, DatabaseContext databaseContext, IPasswordService passwordService, IUserTokenService userTokenService, IClock clock) : base(databaseContext)
+ public UserService(ILogger<UserService> logger, DatabaseContext database, IPasswordService passwordService, IUserTokenService userTokenService, IClock clock)
{
_logger = logger;
- _databaseContext = databaseContext;
+ _database = database;
_passwordService = passwordService;
_userTokenService = userTokenService;
_clock = clock;
@@ -58,15 +58,56 @@ namespace Timeline.Services.User
}
}
+ private static EntityNotExistException CreateUserNotExistException(string username)
+ {
+ throw new EntityNotExistException(EntityTypes.User, new Dictionary<string, object> { ["username"] = username });
+ }
+
+ private static EntityNotExistException CreateUserNotExistException(long userId)
+ {
+ throw new EntityNotExistException(EntityTypes.User, new Dictionary<string, object> { ["id"] = userId });
+ }
+
private static EntityAlreadyExistException CreateUsernameConflictException(string username)
{
throw new EntityAlreadyExistException(EntityTypes.User,
new Dictionary<string, object> { ["username"] = username });
+ }
+
+ public async Task<bool> CheckUserExistenceAsync(long id)
+ {
+ return await _database.Users.AnyAsync(u => u.Id == id);
+ }
+
+ public async Task<long> GetUserIdByUsernameAsync(string username)
+ {
+ if (username == null)
+ throw new ArgumentNullException(nameof(username));
+
+ if (!_usernameValidator.Validate(username, out var message))
+ throw new ArgumentException(message);
+
+ var entity = await _database.Users.Where(user => user.Username == username).Select(u => new { u.Id }).SingleOrDefaultAsync();
+
+ if (entity == null)
+ throw CreateUserNotExistException(username);
+
+ return entity.Id;
+ }
+
+ public async Task<DateTime> GetUsernameLastModifiedTimeAsync(long userId)
+ {
+ var entity = await _database.Users.Where(u => u.Id == userId).Select(u => new { u.UsernameChangeTime }).SingleOrDefaultAsync();
+
+ if (entity is null)
+ throw CreateUserNotExistException(userId);
+
+ return entity.UsernameChangeTime;
}
public async Task<UserEntity> GetUserAsync(long id)
{
- var user = await _databaseContext.Users.Where(u => u.Id == id).SingleOrDefaultAsync();
+ var user = await _database.Users.Where(u => u.Id == id).SingleOrDefaultAsync();
if (user is null)
throw CreateUserNotExistException(id);
@@ -76,7 +117,7 @@ namespace Timeline.Services.User
public async Task<List<UserEntity>> GetUsersAsync()
{
- return await _databaseContext.Users.ToListAsync();
+ return await _database.Users.ToListAsync();
}
public async Task<UserEntity> CreateUserAsync(CreateUserParams param)
@@ -92,7 +133,7 @@ namespace Timeline.Services.User
if (param.Nickname is not null)
CheckNicknameFormat(param.Nickname, nameof(param));
- var conflict = await _databaseContext.Users.AnyAsync(u => u.Username == param.Username);
+ var conflict = await _database.Users.AnyAsync(u => u.Username == param.Username);
if (conflict)
throw CreateUsernameConflictException(param.Username);
@@ -103,8 +144,8 @@ namespace Timeline.Services.User
Nickname = param.Nickname,
Version = 1
};
- _databaseContext.Users.Add(newEntity);
- await _databaseContext.SaveChangesAsync();
+ _database.Users.Add(newEntity);
+ await _database.SaveChangesAsync();
_logger.LogInformation(Resource.LogUserCreated, param.Username, newEntity.Id);
return newEntity;
@@ -124,7 +165,7 @@ namespace Timeline.Services.User
CheckNicknameFormat(param.Nickname, nameof(param));
}
- var entity = await _databaseContext.Users.Where(u => u.Id == id).SingleOrDefaultAsync();
+ var entity = await _database.Users.Where(u => u.Id == id).SingleOrDefaultAsync();
if (entity is null)
throw CreateUserNotExistException(id);
@@ -136,7 +177,7 @@ namespace Timeline.Services.User
var username = param.Username;
if (username is not null && username != entity.Username)
{
- var conflict = await _databaseContext.Users.AnyAsync(u => u.Username == username);
+ var conflict = await _database.Users.AnyAsync(u => u.Username == username);
if (conflict)
throw CreateUsernameConflictException(username);
@@ -164,7 +205,7 @@ namespace Timeline.Services.User
entity.LastModified = now;
}
- await _databaseContext.SaveChangesAsync();
+ await _database.SaveChangesAsync();
_logger.LogInformation(Resource.LogUserModified, entity.Username, id);
if (password is not null)
@@ -185,7 +226,7 @@ namespace Timeline.Services.User
CheckUsernameFormat(username, nameof(username));
CheckPasswordFormat(password, nameof(password));
- var entity = await _databaseContext.Users.Where(u => u.Username == username).Select(u => new { u.Id, u.Password }).SingleOrDefaultAsync();
+ var entity = await _database.Users.Where(u => u.Username == username).Select(u => new { u.Id, u.Password }).SingleOrDefaultAsync();
if (entity is null)
{
@@ -211,7 +252,7 @@ namespace Timeline.Services.User
CheckPasswordFormat(oldPassword, nameof(oldPassword));
CheckPasswordFormat(newPassword, nameof(newPassword));
- var entity = await _databaseContext.Users.Where(u => u.Id == id).SingleOrDefaultAsync();
+ var entity = await _database.Users.Where(u => u.Id == id).SingleOrDefaultAsync();
if (entity is null)
throw CreateUserNotExistException(id);
@@ -221,7 +262,7 @@ namespace Timeline.Services.User
entity.Password = _passwordService.HashPassword(newPassword);
entity.Version += 1;
- await _databaseContext.SaveChangesAsync();
+ await _database.SaveChangesAsync();
_logger.LogInformation(Resource.LogChangePassowrd, entity.Username, id);
await _userTokenService.RevokeAllTokenByUserIdAsync(id);
diff --git a/BackEnd/Timeline/Services/User/BasicUserServiceExtensions.cs b/BackEnd/Timeline/Services/User/UserServiceExtensions.cs
index 8a05f452..82b55fba 100644
--- a/BackEnd/Timeline/Services/User/BasicUserServiceExtensions.cs
+++ b/BackEnd/Timeline/Services/User/UserServiceExtensions.cs
@@ -3,9 +3,9 @@ using System.Threading.Tasks;
namespace Timeline.Services.User
{
- public static class BasicUserServiceExtensions
+ public static class UserServiceExtensions
{
- public static async Task ThrowIfUserNotExist(this IBasicUserService service, long userId)
+ public static async Task ThrowIfUserNotExist(this IUserService service, long userId)
{
if (!await service.CheckUserExistenceAsync(userId))
{
diff --git a/BackEnd/Timeline/Services/User/UserServicesServiceCollectionExtensions.cs b/BackEnd/Timeline/Services/User/UserServicesServiceCollectionExtensions.cs
index a5a743df..76d101a0 100644
--- a/BackEnd/Timeline/Services/User/UserServicesServiceCollectionExtensions.cs
+++ b/BackEnd/Timeline/Services/User/UserServicesServiceCollectionExtensions.cs
@@ -9,7 +9,6 @@ namespace Timeline.Services.User
public static IServiceCollection AddUserServices(this IServiceCollection services)
{
services.TryAddTransient<IPasswordService, PasswordService>();
- services.TryAddScoped<IBasicUserService, BasicUserService>();
services.TryAddScoped<IUserService, UserService>();
services.TryAddScoped<IUserDeleteService, UserDeleteService>();
services.TryAddScoped<IUserPermissionService, UserPermissionService>();