feat: add user management, refs NOISSUE
This commit is contained in:
@@ -1,4 +1,15 @@
|
||||
<!DOCTYPE html>
|
||||
@{
|
||||
bool DoesUserHaveClaimedPhoneNumber()
|
||||
{
|
||||
using (var dci = DataContext.Instance)
|
||||
{
|
||||
var user = dci.Users.Where(u => u.LdapUserName == User.Identity.Name);
|
||||
return user.Any();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
@@ -26,9 +37,18 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-page="/SuggestionHelpers">Suggestion Helpers</a>
|
||||
</li>
|
||||
@if (this.User.Identity.IsAuthenticated && !DoesUserHaveClaimedPhoneNumber())
|
||||
{
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-page="/UnclaimedPhoneNumbers">Unclaimed Phone Numbers</a>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container" style="min-height: auto; width: 400px;">
|
||||
<partial name="_LoginView" />
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
<div class="container">
|
||||
|
36
song_of_the_day/Pages/Shared/_LoginView.cshtml
Normal file
36
song_of_the_day/Pages/Shared/_LoginView.cshtml
Normal file
@@ -0,0 +1,36 @@
|
||||
@using Microsoft.AspNetCore.Authentication
|
||||
|
||||
<div class="loginform">
|
||||
@if (!this.User.Identity.IsAuthenticated)
|
||||
{
|
||||
<form method="post" action="Auth/Login">
|
||||
<div>
|
||||
<label for="username">Username:</label>
|
||||
</div>
|
||||
<div>
|
||||
<input name="username" type="text" />
|
||||
</div>
|
||||
<div>
|
||||
<label for="password">Password:</label>
|
||||
</div>
|
||||
<div>
|
||||
<input name="password" type="password" />
|
||||
</div>
|
||||
<div>
|
||||
<input name="submit" type="submit" value="Login" />
|
||||
</div>
|
||||
</form>
|
||||
}
|
||||
else
|
||||
{
|
||||
<form method="post" action="Auth/Logout">
|
||||
<div>
|
||||
Welcome, @User.Identity.Name!
|
||||
</div>
|
||||
<div>
|
||||
<input name="submit" type="submit" value="Logout" />
|
||||
</div>
|
||||
</form>
|
||||
}
|
||||
|
||||
</div>
|
38
song_of_the_day/Pages/UnclaimedPhoneNumbers.cshtml
Normal file
38
song_of_the_day/Pages/UnclaimedPhoneNumbers.cshtml
Normal file
@@ -0,0 +1,38 @@
|
||||
@page
|
||||
@model UnclaimedPhoneNumbersModel
|
||||
@{
|
||||
ViewData["Title"] = "Unclaimed Phone Numbers";
|
||||
|
||||
var codeService = HttpContext.RequestServices.GetService<PhoneClaimCodeProviderService>();
|
||||
var codeGenerated = codeService.IsCodeGeneratedForUser(User.Identity.Name);
|
||||
}
|
||||
|
||||
<div class="text-left">
|
||||
<table>
|
||||
<tr>
|
||||
<th>Phone Number</th>
|
||||
<th>Claim</th>
|
||||
</tr>
|
||||
@foreach (var user in @Model.UnclaimedUsers)
|
||||
{
|
||||
var phone = user.SignalMemberId; var userId = user.UserId;
|
||||
<tr>
|
||||
<td>@phone</td>
|
||||
<td>
|
||||
<form method="post">
|
||||
<input name="userIndex" value="@userId" type="hidden" />
|
||||
<input type="submit" title="Claim" value="Claim" disabled="@codeGenerated" />
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
@if(codeGenerated)
|
||||
{
|
||||
<form method="post">
|
||||
<label for="code">Verification code:</label>
|
||||
<input type="text" id="code" name="code" />
|
||||
<input type="submit" title="Verify" value="Verify" asp-page-handler="SubmitCode" />
|
||||
</form>
|
||||
}
|
||||
</div>
|
64
song_of_the_day/Pages/UnclaimedPhoneNumbers.cshtml.cs
Normal file
64
song_of_the_day/Pages/UnclaimedPhoneNumbers.cshtml.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
using Microsoft.VisualBasic;
|
||||
|
||||
namespace sotd.Pages;
|
||||
|
||||
public class UnclaimedPhoneNumbersModel : PageModel
|
||||
{
|
||||
private readonly ILogger<UserModel> _logger;
|
||||
|
||||
public UnclaimedPhoneNumbersModel(ILogger<UserModel> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public int userId { get; set; }
|
||||
|
||||
[BindProperty]
|
||||
public List<User> UnclaimedUsers { get; set; }
|
||||
|
||||
public void OnGet()
|
||||
{
|
||||
using (var dci = DataContext.Instance)
|
||||
{
|
||||
this.UnclaimedUsers = dci.Users.Where(u => string.IsNullOrEmpty(u.LdapUserName)).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
public void OnPost(int userIndex)
|
||||
{
|
||||
using (var dci = DataContext.Instance)
|
||||
{
|
||||
var user = dci.Users.Find(userIndex);
|
||||
var claimCodeService = HttpContext.RequestServices.GetService<PhoneClaimCodeProviderService>();
|
||||
claimCodeService.GenerateClaimCodeForUserAndNumber(HttpContext.User.Identity.Name, user.SignalMemberId);
|
||||
this.UnclaimedUsers = dci.Users.Where(u => string.IsNullOrEmpty(u.LdapUserName)).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
public IActionResult OnPostSubmitCode(string code)
|
||||
{
|
||||
var claimCodeService = HttpContext.RequestServices.GetService<PhoneClaimCodeProviderService>();
|
||||
var validatedNumber = claimCodeService.ValidateClaimCodeForUser(code, HttpContext.User.Identity.Name);
|
||||
if (!string.IsNullOrEmpty(validatedNumber))
|
||||
{
|
||||
using (var dci = DataContext.Instance)
|
||||
{
|
||||
var user = dci.Users.Where(u => u.SignalMemberId == validatedNumber).FirstOrDefault();
|
||||
if (user == default(User))
|
||||
{
|
||||
throw new Exception("User with specified phone number not found!");
|
||||
}
|
||||
user.LdapUserName = HttpContext.User.Identity.Name;
|
||||
dci.SaveChanges();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("Invalid code provided!");
|
||||
}
|
||||
|
||||
return RedirectToPage("/");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user