Silent merge fail

This commit is contained in:
ivan-pelly
2026-02-21 10:55:09 -08:00
parent f27c8f2103
commit c71d8911ac
15 changed files with 999 additions and 0 deletions
@@ -0,0 +1,7 @@
namespace WinStudentGoalTracker.DataAccess;
public class LoginDto
{
public string? Email { get; set; }
public string? Password { get; set; }
}
@@ -0,0 +1,6 @@
namespace WinStudentGoalTracker.DataAccess;
public class RefreshTokenDto
{
public string? RefreshToken { get; set; }
}
@@ -0,0 +1,17 @@
namespace WinStudentGoalTracker.DataAccess;
public class dbRefreshToken
{
public Guid IdRefreshToken { get; set; }
public Guid IdUser { get; set; }
public required string TokenHash { get; set; }
public required string TokenSalt { get; set; }
public DateTime ExpiresAt { get; set; }
public DateTime LastUsedAt { get; set; }
public DateTime? RevokedAt { get; set; }
public string? DeviceInfo { get; set; }
public string? UserAgent { get; set; }
public Guid? ReplacedByTokenId { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
@@ -0,0 +1,16 @@
namespace WinStudentGoalTracker.DataAccess;
public class dbUser
{
public required Guid IdUser { get; set; }
public Guid? IdRole { get; set; }
public string? Email { get; set; }
public string? Name { get; set; }
public string? PasswordHash { get; set; }
public string? PasswordSalt { get; set; }
public int FailedLoginAttempts { get; set; }
public DateTime? LockedUntil { get; set; }
public DateTime? CreatedAt { get; set; }
public string? RoleInternalName { get; set; }
public string? RoleDisplayName { get; set; }
}
@@ -0,0 +1,83 @@
using System.Data;
using Dapper;
using MySql.Data.MySqlClient;
namespace WinStudentGoalTracker.DataAccess;
public class AuthRepository
{
private IDbConnection Connection => new MySqlConnection(DatabaseManager.ConnectionString);
public async Task<Guid?> CreateRefreshTokenAsync(
Guid refreshTokenId,
Guid userId,
string tokenHash,
string tokenSalt,
int expiresInSeconds,
string? deviceInfo,
string? userAgent)
{
using var db = Connection;
var result = await db.QuerySingleOrDefaultAsync<string?>(
"sp_RefreshToken_Create",
new
{
p_id_refresh_token = refreshTokenId.ToString(),
p_id_user = userId.ToString(),
p_token_hash = tokenHash,
p_token_salt = tokenSalt,
p_expires_in_seconds = expiresInSeconds,
p_device_info = deviceInfo,
p_user_agent = userAgent
},
commandType: CommandType.StoredProcedure);
return result != null ? Guid.Parse(result) : null;
}
public async Task<dbRefreshToken?> GetRefreshTokenByIdAsync(Guid refreshTokenId)
{
using var db = Connection;
return await db.QuerySingleOrDefaultAsync<dbRefreshToken>(
"sp_RefreshToken_GetById",
new { p_id_refresh_token = refreshTokenId.ToString() },
commandType: CommandType.StoredProcedure);
}
public async Task<bool> RevokeRefreshTokenAsync(Guid refreshTokenId)
{
using var db = Connection;
var rowsAffected = await db.QuerySingleOrDefaultAsync<int>(
"sp_RefreshToken_Revoke",
new { p_id_refresh_token = refreshTokenId.ToString() },
commandType: CommandType.StoredProcedure);
return rowsAffected > 0;
}
public async Task<Guid?> ReplaceRefreshTokenAsync(
Guid oldTokenId,
Guid newTokenId,
Guid userId,
string tokenHash,
string tokenSalt,
int expiresInSeconds,
string? deviceInfo,
string? userAgent)
{
using var db = Connection;
var result = await db.QuerySingleOrDefaultAsync<string?>(
"sp_RefreshToken_Replace",
new
{
p_old_token_id = oldTokenId.ToString(),
p_id_refresh_token = newTokenId.ToString(),
p_id_user = userId.ToString(),
p_token_hash = tokenHash,
p_token_salt = tokenSalt,
p_expires_in_seconds = expiresInSeconds,
p_device_info = deviceInfo,
p_user_agent = userAgent
},
commandType: CommandType.StoredProcedure);
return result != null ? Guid.Parse(result) : null;
}
}
@@ -0,0 +1,28 @@
using System.Data;
using Dapper;
using MySql.Data.MySqlClient;
namespace WinStudentGoalTracker.DataAccess;
public class UserRepository
{
private IDbConnection Connection => new MySqlConnection(DatabaseManager.ConnectionString);
public async Task<dbUser?> GetByEmailAsync(string email)
{
using var db = Connection;
return await db.QuerySingleOrDefaultAsync<dbUser>(
"sp_User_GetByEmail",
new { p_email = email },
commandType: CommandType.StoredProcedure);
}
public async Task<dbUser?> GetByIdAsync(Guid idUser)
{
using var db = Connection;
return await db.QuerySingleOrDefaultAsync<dbUser>(
"sp_User_GetById",
new { p_id_user = idUser.ToString() },
commandType: CommandType.StoredProcedure);
}
}