prevent add same user

This commit is contained in:
DismissedLight
2022-07-03 22:01:24 +08:00
parent ddc06c014f
commit dbad51d52f
9 changed files with 76 additions and 30 deletions

View File

@@ -9,7 +9,7 @@ namespace Snap.Hutao.Control.Cancellable;
public interface ISupportCancellation
{
/// <summary>
/// 用于通知取消的取消回执
/// 用于通知事件取消的取消令牌
/// </summary>
CancellationToken CancellationToken { get; set; }
}

View File

@@ -49,7 +49,7 @@ internal class NavigationService : INavigationService
navigationView.BackRequested -= OnBackRequested;
}
navigationView = Must.NotNull(value!, "NavigationView");
navigationView = Must.NotNull(value!);
// add new listener
if (navigationView != null)
@@ -138,7 +138,7 @@ internal class NavigationService : INavigationService
{
try
{
await data.WaitForCompletionAsync();
await data.WaitForCompletionAsync().ConfigureAwait(false);
}
catch (AggregateException)
{

View File

@@ -32,7 +32,7 @@ public interface IUserService
/// </summary>
/// <param name="user">待添加的用户</param>
/// <returns>用户初始化是否成功</returns>
Task<bool> TryAddUserAsync(User user);
Task<UserAddResult> TryAddUserAsync(User user);
/// <summary>
/// 异步移除用户
@@ -47,4 +47,4 @@ public interface IUserService
/// <param name="cookie">cookie的字符串形式</param>
/// <returns>包含cookie信息的字典</returns>
IDictionary<string, string> ParseCookie(string cookie);
}
}

View File

@@ -0,0 +1,25 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Service.Abstraction;
/// <summary>
/// 用户添加操作结果
/// </summary>
public enum UserAddResult
{
/// <summary>
/// 添加成功
/// </summary>
Ok,
/// <summary>
/// 已经存在该用户
/// </summary>
AlreadyExists,
/// <summary>
/// 初始化用户失败
/// </summary>
InitializeFailed,
}

View File

@@ -69,23 +69,41 @@ internal class UserService : IUserService
}
/// <inheritdoc/>
public async Task<bool> TryAddUserAsync(User user)
public async Task<UserAddResult> TryAddUserAsync(User user)
{
if (await user.InitializeAsync(userClient, userGameRoleClient))
string? newUsersCookie = user.Cookie;
// Prevent users add same account.
bool userAlreadyExists = await appDbContext.Users
.AnyAsync(u => u.Cookie == newUsersCookie)
.ConfigureAwait(false);
if (userAlreadyExists)
{
appDbContext.Users.Add(user);
await appDbContext.SaveChangesAsync();
return true;
return UserAddResult.AlreadyExists;
}
return false;
bool userInitialized = await user
.InitializeAsync(userClient, userGameRoleClient)
.ConfigureAwait(false);
if (userInitialized)
{
appDbContext.Users.Add(user);
await appDbContext
.SaveChangesAsync()
.ConfigureAwait(false);
return UserAddResult.Ok;
}
return UserAddResult.InitializeFailed;
}
/// <inheritdoc/>
public async Task RemoveUserAsync(User user)
public Task RemoveUserAsync(User user)
{
appDbContext.Users.Remove(user);
await appDbContext.SaveChangesAsync();
return appDbContext.SaveChangesAsync();
}
/// <inheritdoc/>

View File

@@ -11,7 +11,7 @@
Title="设置米游社Cookie"
DefaultButton="Primary"
PrimaryButtonText="请输入Cookie"
SecondaryButtonText="取消"
CloseButtonText="取消"
Style="{StaticResource DefaultContentDialogStyle}">
<StackPanel>

View File

@@ -34,9 +34,7 @@ public sealed partial class UserDialog : ContentDialog
private void InputTextChanged(object sender, TextChangedEventArgs e)
{
string text = InputText.Text;
bool inputEmpty = string.IsNullOrEmpty(text);
bool inputEmpty = string.IsNullOrEmpty(InputText.Text);
(PrimaryButtonText, IsPrimaryButtonEnabled) = inputEmpty switch
{

View File

@@ -4,6 +4,7 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Snap.Hutao.Core;
using Snap.Hutao.Service.Navigation;
namespace Snap.Hutao.View.Helper;
@@ -13,7 +14,7 @@ namespace Snap.Hutao.View.Helper;
public sealed class NavHelper
{
private static readonly DependencyProperty NavigateToProperty = Property<NavHelper>.Attach<Type>("NavigateTo");
private static readonly DependencyProperty ExtraDataProperty = Property<NavHelper>.Attach<object>("ExtraData");
private static readonly DependencyProperty ExtraDataProperty = Property<NavHelper>.Attach<INavigationExtra>("ExtraData");
/// <summary>
/// 获取导航项的目标页面类型
@@ -40,9 +41,9 @@ public sealed class NavHelper
/// </summary>
/// <param name="item">待获取的导航项</param>
/// <returns>目标页面类型的额外数据</returns>
public static object? GetExtraData(NavigationViewItem? item)
public static INavigationExtra? GetExtraData(NavigationViewItem? item)
{
return item?.GetValue(ExtraDataProperty);
return item?.GetValue(ExtraDataProperty) as INavigationExtra;
}
/// <summary>
@@ -50,7 +51,7 @@ public sealed class NavHelper
/// </summary>
/// <param name="item">待设置的导航项</param>
/// <param name="value">新的目标页面类型</param>
public static void SetExtraData(NavigationViewItem item, object value)
public static void SetExtraData(NavigationViewItem item, INavigationExtra value)
{
item.SetValue(ExtraDataProperty, value);
}

View File

@@ -117,9 +117,9 @@ internal class UserViewModel : ObservableObject
// user confirms the input
if (result.IsOk)
{
IDictionary<string, string> map = userService.ParseCookie(result.Value);
IDictionary<string, string> cookieMap = userService.ParseCookie(result.Value);
if (TryValidateCookie(map, out IDictionary<string, string>? filteredCookie))
if (TryValidateCookie(cookieMap, out IDictionary<string, string>? filteredCookie))
{
string simplifiedCookie = string.Join(';', filteredCookie.Select(kvp => $"{kvp.Key}={kvp.Value}"));
User user = new()
@@ -128,13 +128,17 @@ internal class UserViewModel : ObservableObject
RemoveCommand = removeUserCommandCache,
};
if (!await userService.TryAddUserAsync(user))
switch (await userService.TryAddUserAsync(user))
{
infoBarService.Warning("此Cookie无法获取用户信息请重新输入");
}
else
{
infoBarService.Success($"成功添加用户 [{user.UserInfo!.Nickname}]");
case UserAddResult.Ok:
infoBarService.Success($"用户 [{user.UserInfo!.Nickname}] 添加成功");
break;
case UserAddResult.AlreadyExists:
infoBarService.Information($"用户 [{user.UserInfo!.Nickname}] 已经存在");
break;
case UserAddResult.InitializeFailed:
infoBarService.Warning("此Cookie无法获取用户信息请重新输入");
break;
}
}
else
@@ -149,7 +153,7 @@ internal class UserViewModel : ObservableObject
if (!User.IsNone(user))
{
await userService.RemoveUserAsync(user);
infoBarService.Success($"成功移除用户 [{user.UserInfo!.Nickname}]");
infoBarService.Success($"用户 [{user.UserInfo!.Nickname}] 成功移除");
}
}
}