83 lines
No EOL
2.3 KiB
C#
83 lines
No EOL
2.3 KiB
C#
using Isopoh.Cryptography.Argon2;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Mizuki.Database;
|
|
using Mizuki.Database.Models;
|
|
|
|
namespace Mizuki.Services;
|
|
|
|
/// <summary>
|
|
/// The user service.
|
|
/// </summary>
|
|
/// <param name="dbContext">The Mizuki database context.</param>
|
|
public class UserService(
|
|
MizukiDbContext dbContext)
|
|
{
|
|
/// <summary>
|
|
/// Check if a user with the given username exists.
|
|
/// </summary>
|
|
/// <param name="username">The username.</param>
|
|
/// <returns>Whether they exist.</returns>
|
|
public async Task<bool> UsernameTaken(
|
|
string username)
|
|
{
|
|
return await dbContext.Users
|
|
.AnyAsync(u => u.Username == username);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a user with the given username.
|
|
/// </summary>
|
|
/// <param name="username">The username.</param>
|
|
/// <returns>The user model.</returns>
|
|
public async Task<User> GetUserForUsername(
|
|
string username)
|
|
{
|
|
return await dbContext.Users
|
|
.FirstAsync(u => u.Username == username);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check if the password is valid for the given user.
|
|
/// </summary>
|
|
/// <param name="username">The user's name.</param>
|
|
/// <param name="password">The password.</param>
|
|
/// <returns>Whether it's valid.</returns>
|
|
public async Task<bool> CheckPasswordForUser(
|
|
string username,
|
|
string password)
|
|
{
|
|
var user = await dbContext.Users
|
|
.FirstOrDefaultAsync(u => u.Username == username);
|
|
|
|
if (user is null)
|
|
return false;
|
|
|
|
return Argon2.Verify(user.PasswordHash, password);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a user with the given username and password.
|
|
/// </summary>
|
|
/// <param name="username">The username.</param>
|
|
/// <param name="password">The password.</param>
|
|
/// <returns>Whether the user was created.</returns>
|
|
public async Task<bool> CreateUser(
|
|
string username,
|
|
string password)
|
|
{
|
|
if (await UsernameTaken(username))
|
|
return false;
|
|
|
|
var hash = Argon2.Hash(password);
|
|
var userModel = new User
|
|
{
|
|
Id = Guid.NewGuid(),
|
|
Username = username,
|
|
PasswordHash = hash
|
|
};
|
|
|
|
await dbContext.Users.AddAsync(userModel);
|
|
await dbContext.SaveChangesAsync();
|
|
return true;
|
|
}
|
|
} |