changed login flow to support 2 phase program selection login.

This commit is contained in:
2026-02-21 15:40:04 -08:00
parent d90eefacdd
commit 043ff337c1
14 changed files with 280 additions and 44 deletions
@@ -0,0 +1,6 @@
namespace WinStudentGoalTracker.DataAccess;
public class SelectProgramDto
{
public required string ProgramId { get; set; }
}
@@ -0,0 +1,13 @@
namespace WinStudentGoalTracker.DataAccess;
public class dbProgramUser
{
public required Guid IdUser { get; set; }
public string? Email { get; set; }
public string? Name { get; set; }
public required Guid IdProgram { get; set; }
public string? ProgramName { get; set; }
public required string RoleInternalName { get; set; }
public required string RoleDisplayName { get; set; }
public string? Status { get; set; }
}
@@ -4,6 +4,7 @@ public class dbRefreshToken
{
public Guid IdRefreshToken { get; set; }
public Guid IdUser { get; set; }
public Guid IdProgram { get; set; }
public required string TokenHash { get; set; }
public required string TokenSalt { get; set; }
public DateTime ExpiresAt { get; set; }
@@ -3,7 +3,6 @@ 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; }
@@ -11,6 +10,4 @@ public class dbUser
public int FailedLoginAttempts { get; set; }
public DateTime? LockedUntil { get; set; }
public DateTime? CreatedAt { get; set; }
public required string RoleInternalName { get; set; }
public required string RoleDisplayName { get; set; }
}
@@ -0,0 +1,11 @@
namespace WinStudentGoalTracker.DataAccess;
public class dbUserProgram
{
public required Guid IdProgram { get; set; }
public string? ProgramName { get; set; }
public required string RoleInternalName { get; set; }
public required string RoleDisplayName { get; set; }
public bool IsPrimary { get; set; }
public string? Status { get; set; }
}
@@ -11,6 +11,7 @@ public class AuthRepository
public async Task<Guid?> CreateRefreshTokenAsync(
Guid refreshTokenId,
Guid userId,
Guid programId,
string tokenHash,
string tokenSalt,
int expiresInSeconds,
@@ -24,6 +25,7 @@ public class AuthRepository
{
p_id_refresh_token = refreshTokenId.ToString(),
p_id_user = userId.ToString(),
p_id_program = programId.ToString(),
p_token_hash = tokenHash,
p_token_salt = tokenSalt,
p_expires_in_seconds = expiresInSeconds,
@@ -57,6 +59,7 @@ public class AuthRepository
Guid oldTokenId,
Guid newTokenId,
Guid userId,
Guid programId,
string tokenHash,
string tokenSalt,
int expiresInSeconds,
@@ -71,6 +74,7 @@ public class AuthRepository
p_old_token_id = oldTokenId.ToString(),
p_id_refresh_token = newTokenId.ToString(),
p_id_user = userId.ToString(),
p_id_program = programId.ToString(),
p_token_hash = tokenHash,
p_token_salt = tokenSalt,
p_expires_in_seconds = expiresInSeconds,
@@ -25,4 +25,22 @@ public class UserRepository
new { p_id_user = idUser.ToString() },
commandType: CommandType.StoredProcedure);
}
public async Task<dbProgramUser?> GetByIdWithProgramAsync(Guid idUser, Guid idProgram)
{
using var db = Connection;
return await db.QuerySingleOrDefaultAsync<dbProgramUser>(
"sp_User_GetById_WithProgram",
new { p_id_user = idUser.ToString(), p_id_program = idProgram.ToString() },
commandType: CommandType.StoredProcedure);
}
public async Task<IEnumerable<dbUserProgram>> GetProgramsForUserIdAsync(Guid idUser)
{
using var db = Connection;
return await db.QueryAsync<dbUserProgram>(
"sp_UserPrograms_GetByUserId",
new { p_id_user = idUser.ToString() },
commandType: CommandType.StoredProcedure);
}
}