1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
using System.Threading.Tasks;
using Timeline.Entities;
using static Timeline.Resources.Services.UserDetailService;
namespace Timeline.Services
{
public interface IUserDetailService
{
/// <summary>
/// Get the nickname of the user with given username.
/// If the user does not set a nickname, the username is returned as the nickname.
/// </summary>
/// <param name="username">The username of the user to get nickname of.</param>
/// <returns>The nickname of the user.</returns>
/// <exception cref="ArgumentNullException">Thrown when <paramref name="username"/> is null.</exception>
/// <exception cref="UsernameBadFormatException">Thrown when <paramref name="username"/> is of bad format.</exception>
/// <exception cref="UserNotExistException">Thrown when the user does not exist.</exception>
Task<string> GetNickname(string username);
/// <summary>
/// Set the nickname of the user with given username.
/// </summary>
/// <param name="username">The username of the user to set nickname of.</param>
/// <param name="nickname">The nickname. Pass null to unset.</param>
/// <exception cref="ArgumentNullException">Thrown when <paramref name="username"/> is null.</exception>
/// <exception cref="ArgumentException">Thrown when <paramref name="nickname"/> is not null but its length is bigger than 10.</exception>
/// <exception cref="UsernameBadFormatException">Thrown when <paramref name="username"/> is of bad format.</exception>
/// <exception cref="UserNotExistException">Thrown when the user does not exist.</exception>
Task SetNickname(string username, string? nickname);
}
public class UserDetailService : IUserDetailService
{
private readonly DatabaseContext _database;
private readonly ILogger<UserDetailService> _logger;
public UserDetailService(DatabaseContext database, ILogger<UserDetailService> logger)
{
_database = database;
_logger = logger;
}
public async Task<string> GetNickname(string username)
{
var userId = await DatabaseExtensions.CheckAndGetUser(_database.Users, username);
var nickname = _database.UserDetails.Where(d => d.UserId == userId).Select(d => new { d.Nickname }).SingleOrDefault()?.Nickname;
return nickname ?? username;
}
public async Task SetNickname(string username, string? nickname)
{
if (nickname != null && nickname.Length > 10)
{
throw new ArgumentException(ExceptionNicknameTooLong, nameof(nickname));
}
var userId = await DatabaseExtensions.CheckAndGetUser(_database.Users, username);
var userDetail = _database.UserDetails.Where(d => d.UserId == userId).SingleOrDefault();
if (nickname == null)
{
if (userDetail == null || userDetail.Nickname == null)
{
return;
}
else
{
userDetail.Nickname = null;
await _database.SaveChangesAsync();
_logger.LogInformation(LogEntityNicknameSetToNull, userId);
}
}
else
{
var create = userDetail == null;
if (create)
{
userDetail = new UserDetailEntity
{
UserId = userId
};
}
userDetail!.Nickname = nickname;
if (create)
{
_database.UserDetails.Add(userDetail);
}
await _database.SaveChangesAsync();
if (create)
{
_logger.LogInformation(LogEntityNicknameCreate, userId, nickname);
}
else
{
_logger.LogInformation(LogEntityNicknameSetNotNull, userId, nickname);
}
}
}
}
}
|