diff options
author | 杨宇千 <crupest@outlook.com> | 2019-08-22 14:54:47 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-08-22 14:54:47 +0800 |
commit | 2541f11b5d637d47b39f25cc03dc4173a6b7efe6 (patch) | |
tree | 652b674f8aeccc96245802b7f980f6993fc53db7 | |
parent | 693367c1ba22f9eff8554c987dc61c0283386caa (diff) | |
download | timeline-2541f11b5d637d47b39f25cc03dc4173a6b7efe6.tar.gz timeline-2541f11b5d637d47b39f25cc03dc4173a6b7efe6.tar.bz2 timeline-2541f11b5d637d47b39f25cc03dc4173a6b7efe6.zip |
Add nickname. Step 1.
-rw-r--r-- | Timeline.Tests/UserDetailServiceTest.cs | 70 | ||||
-rw-r--r-- | Timeline/Entities/UserDetail.cs | 3 | ||||
-rw-r--r-- | Timeline/Models/UserDetail.cs | 7 | ||||
-rw-r--r-- | Timeline/Services/UserDetailService.cs | 48 |
4 files changed, 117 insertions, 11 deletions
diff --git a/Timeline.Tests/UserDetailServiceTest.cs b/Timeline.Tests/UserDetailServiceTest.cs index 292b528b..f9170c42 100644 --- a/Timeline.Tests/UserDetailServiceTest.cs +++ b/Timeline.Tests/UserDetailServiceTest.cs @@ -35,6 +35,68 @@ namespace Timeline.Tests }
[Fact]
+ public void GetNickname_ShouldThrow_ArgumentException()
+ {
+ // no need to await because arguments are checked syncronizedly.
+ _service.Invoking(s => s.GetUserNickname(null)).Should().Throw<ArgumentException>()
+ .Where(e => e.ParamName == "username" && e.Message.Contains("null", StringComparison.OrdinalIgnoreCase));
+ _service.Invoking(s => s.GetUserNickname("")).Should().Throw<ArgumentException>()
+ .Where(e => e.ParamName == "username" && e.Message.Contains("empty", StringComparison.OrdinalIgnoreCase));
+ }
+
+ [Fact]
+ public void GetNickname_ShouldThrow_UserNotExistException()
+ {
+ const string username = "usernotexist";
+ _service.Awaiting(s => s.GetUserNickname(username)).Should().Throw<UserNotExistException>()
+ .Where(e => e.Username == username);
+ }
+
+ [Fact]
+ public async Task GetNickname_Should_Create_And_ReturnDefault()
+ {
+ {
+ var nickname = await _service.GetUserNickname(MockUsers.UserUsername);
+ nickname.Should().BeNull();
+ }
+
+ {
+ var context = _database.DatabaseContext;
+ var userId = await DatabaseExtensions.CheckAndGetUser(context.Users, MockUsers.UserUsername);
+ var detail = context.UserDetails.Where(e => e.UserId == userId).Single();
+ detail.Nickname.Should().BeNullOrEmpty();
+ detail.QQ.Should().BeNullOrEmpty();
+ detail.EMail.Should().BeNullOrEmpty();
+ detail.PhoneNumber.Should().BeNullOrEmpty();
+ detail.Description.Should().BeNullOrEmpty();
+ }
+ }
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("")]
+ [InlineData("nickname")]
+ public async Task GetNickname_Should_ReturnData(string nickname)
+ {
+ {
+ var context = _database.DatabaseContext;
+ var userId = await DatabaseExtensions.CheckAndGetUser(context.Users, MockUsers.UserUsername);
+ var entity = new UserDetailEntity
+ {
+ Nickname = nickname,
+ UserId = userId
+ };
+ context.Add(entity);
+ await context.SaveChangesAsync();
+ }
+
+ {
+ var n = await _service.GetUserNickname(MockUsers.UserUsername);
+ n.Should().Equals(string.IsNullOrEmpty(nickname) ? null : nickname);
+ }
+ }
+
+ [Fact]
public void GetDetail_ShouldThrow_ArgumentException()
{
// no need to await because arguments are checked syncronizedly.
@@ -64,6 +126,7 @@ namespace Timeline.Tests var context = _database.DatabaseContext;
var userId = await DatabaseExtensions.CheckAndGetUser(context.Users, MockUsers.UserUsername);
var detail = context.UserDetails.Where(e => e.UserId == userId).Single();
+ detail.Nickname.Should().BeNullOrEmpty();
detail.QQ.Should().BeNullOrEmpty();
detail.EMail.Should().BeNullOrEmpty();
detail.PhoneNumber.Should().BeNullOrEmpty();
@@ -77,12 +140,11 @@ namespace Timeline.Tests const string email = "ha@aaa.net";
const string description = "hahaha";
- var context = _database.DatabaseContext;
- UserDetailEntity entity;
{
+ var context = _database.DatabaseContext;
var userId = await DatabaseExtensions.CheckAndGetUser(context.Users, MockUsers.UserUsername);
- entity = new UserDetailEntity
+ var entity = new UserDetailEntity
{
EMail = email,
Description = description,
@@ -130,6 +192,7 @@ namespace Timeline.Tests var context = _database.DatabaseContext;
var userId = await DatabaseExtensions.CheckAndGetUser(context.Users, MockUsers.UserUsername);
var entity = context.UserDetails.Where(e => e.UserId == userId).Single();
+ entity.Nickname.Should().BeNullOrEmpty();
entity.QQ.Should().BeNullOrEmpty();
entity.EMail.Should().BeNullOrEmpty();
entity.PhoneNumber.Should().BeNullOrEmpty();
@@ -137,6 +200,7 @@ namespace Timeline.Tests }
[Theory]
+ [InlineData(nameof(UserDetail.Nickname), nameof(UserDetailEntity.Nickname), "aaaa", "bbbb")]
[InlineData(nameof(UserDetail.QQ), nameof(UserDetailEntity.QQ), "12345678910", "987654321")]
[InlineData(nameof(UserDetail.EMail), nameof(UserDetailEntity.EMail), "aaa@aaa.aaa", "bbb@bbb.bbb")]
[InlineData(nameof(UserDetail.PhoneNumber), nameof(UserDetailEntity.PhoneNumber), "12345678910", "987654321")]
diff --git a/Timeline/Entities/UserDetail.cs b/Timeline/Entities/UserDetail.cs index 9bc6f5e5..6e582234 100644 --- a/Timeline/Entities/UserDetail.cs +++ b/Timeline/Entities/UserDetail.cs @@ -9,6 +9,9 @@ namespace Timeline.Entities [Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
+ [Column("nickname"), MaxLength(15)]
+ public string Nickname { get; set; }
+
[Column("qq"), MaxLength(15)]
public string QQ { get; set; }
diff --git a/Timeline/Models/UserDetail.cs b/Timeline/Models/UserDetail.cs index 4af88450..86866d8b 100644 --- a/Timeline/Models/UserDetail.cs +++ b/Timeline/Models/UserDetail.cs @@ -1,10 +1,14 @@ -using Timeline.Entities;
+using System.ComponentModel.DataAnnotations;
+using Timeline.Entities;
using Timeline.Models.Validation;
namespace Timeline.Models
{
public class UserDetail
{
+ [MaxLength(10)]
+ public string Nickname { get; set; }
+
[ValidateWith(typeof(UserDetailValidators.QQValidator))]
public string QQ { get; set; }
@@ -28,6 +32,7 @@ namespace Timeline.Models {
return new UserDetail
{
+ Nickname = CoerceEmptyToNull(entity.Nickname),
QQ = CoerceEmptyToNull(entity.QQ),
EMail = CoerceEmptyToNull(entity.EMail),
PhoneNumber = CoerceEmptyToNull(entity.PhoneNumber),
diff --git a/Timeline/Services/UserDetailService.cs b/Timeline/Services/UserDetailService.cs index 0bb745f3..a8ed662b 100644 --- a/Timeline/Services/UserDetailService.cs +++ b/Timeline/Services/UserDetailService.cs @@ -12,6 +12,15 @@ namespace Timeline.Services public interface IUserDetailService
{
/// <summary>
+ /// Get the nickname of user.
+ /// </summary>
+ /// <param name="username">The username to get nickname of.</param>
+ /// <returns>The user's nickname. Null if not set.</returns>
+ /// <exception cref="ArgumentException">Thrown if <paramref name="username"/> is null or empty.</exception>
+ /// <exception cref="UserNotExistException">Thrown if user doesn't exist.</exception>
+ Task<string> GetUserNickname(string username);
+
+ /// <summary>
/// Get the detail of user.
/// </summary>
/// <param name="username">The username to get user detail of.</param>
@@ -42,23 +51,45 @@ namespace Timeline.Services _databaseContext = databaseContext;
}
+ private async Task<UserDetailEntity> CreateEntity(long userId)
+ {
+ var entity = new UserDetailEntity()
+ {
+ UserId = userId
+ };
+ _databaseContext.UserDetails.Add(entity);
+ await _databaseContext.SaveChangesAsync();
+ _logger.LogInformation("An entity is created in user_details.");
+ return entity;
+ }
+
// Check the existence of user detail entry
private async Task<UserDetailEntity> CheckAndInit(long userId)
{
var detail = await _databaseContext.UserDetails.Where(e => e.UserId == userId).SingleOrDefaultAsync();
if (detail == null)
{
- detail = new UserDetailEntity()
- {
- UserId = userId
- };
- _databaseContext.UserDetails.Add(detail);
- await _databaseContext.SaveChangesAsync();
- _logger.LogInformation("An entity is created in user_details.");
+ detail = await CreateEntity(userId);
}
return detail;
}
+ public async Task<string> GetUserNickname(string username)
+ {
+ var userId = await DatabaseExtensions.CheckAndGetUser(_databaseContext.Users, username);
+ var detail = await _databaseContext.UserDetails.Where(e => e.UserId == userId).Select(e => new { e.Nickname }).SingleOrDefaultAsync();
+ if (detail == null)
+ {
+ var entity = await CreateEntity(userId);
+ return null;
+ }
+ else
+ {
+ var nickname = detail.Nickname;
+ return string.IsNullOrEmpty(nickname) ? null : nickname;
+ }
+ }
+
public async Task<UserDetail> GetUserDetail(string username)
{
var userId = await DatabaseExtensions.CheckAndGetUser(_databaseContext.Users, username);
@@ -74,6 +105,9 @@ namespace Timeline.Services var userId = await DatabaseExtensions.CheckAndGetUser(_databaseContext.Users, username);
var detailEntity = await CheckAndInit(userId);
+ if (detail.Nickname != null)
+ detailEntity.Nickname = detail.Nickname;
+
if (detail.QQ != null)
detailEntity.QQ = detail.QQ;
|