add user list page

This commit is contained in:
Basique Evangelist 2022-05-19 21:16:11 +03:00
parent 6b6883bb20
commit c5d4db1c4c
No known key found for this signature in database
GPG Key ID: 0EBE8665AC252DF3
5 changed files with 152 additions and 24 deletions

View File

@ -0,0 +1,61 @@
using JetHerald.Authorization;
using JetHerald.Contracts;
using JetHerald.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace JetHerald.Controllers.Ui;
[Permission("admin.users")]
[Route("ui/admin/users")]
public class AdminUsersController : Controller
{
Db Db { get; }
public AdminUsersController(Db db)
{
Db = db;
}
[HttpGet]
public async Task<IActionResult> Index()
{
using var ctx = await Db.GetContext();
var users = await ctx.GetUsers();
var plans = await ctx.GetPlans();
var roles = await ctx.GetRoles();
return View(new AdminUsersModel
{
Users = users.ToArray(),
Plans = plans.ToDictionary(p => p.PlanId),
Roles = roles.ToDictionary(r => r.RoleId)
});
}
public class SetPermsRequest
{
[BindProperty(Name = "planId"), BindRequired]
public uint PlanId { get; set; }
[BindProperty(Name = "roleId"), BindRequired]
public uint RoleId { get; set; }
}
[Permission("admin.users.setperms")]
[HttpPost, Route("setperms/{userId?}")]
public async Task<IActionResult> SetPerms([FromRoute] uint userId, SetPermsRequest req)
{
using var ctx = await Db.GetContext();
await ctx.UpdatePerms(userId, req.PlanId, req.RoleId);
ctx.Commit();
return RedirectToAction(nameof(Index));
}
}
public class AdminUsersModel
{
public User[] Users { get; set; }
public Dictionary<uint, Plan> Plans { get; set; }
public Dictionary<uint, Role> Roles { get; set; }
}

View File

@ -2,15 +2,15 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
<PreserveCompilationContext>false</PreserveCompilationContext>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
<PreserveCompilationContext>false</PreserveCompilationContext>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper.Transaction" Version="2.0.35.2" />
<PackageReference Include="DSharpPlus" Version="4.1.0" />
<PackageReference Include="DSharpPlus.CommandsNext" Version="4.1.0" />
<PackageReference Include="DSharpPlus" Version="4.2.0" />
<PackageReference Include="DSharpPlus.CommandsNext" Version="4.2.0" />
<PackageReference Include="MySql.Data" Version="8.0.28" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.0.0-rc2" />
<PackageReference Include="Telegram.Bot.Extensions.Polling" Version="1.0.2" />

View File

@ -51,6 +51,15 @@ public class DbContext : IDisposable
=> Tran.QueryAsync<Topic>(
" SELECT * FROM topic WHERE CreatorId = @userId",
new { userId });
public Task UpdatePerms(uint userId, uint planId, uint roleId)
=> Tran.ExecuteAsync(@"
UPDATE user
SET PlanId = @planId,
RoleId = @roleId
WHERE UserId = @userId",
new { userId, planId, roleId });
public Task<IEnumerable<Plan>> GetPlans()
=> Tran.QueryAsync<Plan>("SELECT * FROM plan");
public Task<IEnumerable<Role>> GetRoles()
@ -60,6 +69,10 @@ public class DbContext : IDisposable
SELECT ui.*, u.Login as RedeemedByLogin
FROM userinvite ui
LEFT JOIN user u ON ui.RedeemedBy = u.UserId");
public Task<IEnumerable<User>> GetUsers()
=> Tran.QueryAsync<User>(@"
SELECT u.*
FROM user u;");
public Task<IEnumerable<Heart>> GetHeartsForUser(uint userId)
=> Tran.QueryAsync<Heart>(
@ -154,7 +167,7 @@ public class DbContext : IDisposable
( Login, Name, PasswordHash, PasswordSalt, HashType, PlanId, RoleId)
VALUES
(@Login, @Name, @PasswordHash, @PasswordSalt, @HashType, @PlanId, @RoleId);",
param:user);
param: user);
return await GetUser(user.Login);
}

View File

@ -0,0 +1,50 @@
@model AdminUsersModel
<h3>Invites</h3>
<ul class="issues-list">
@foreach (var user in Model.Users)
{
<li>
@user.Name <span class="username">@@@user.Login</span> (
@if (Context.UserCan("admin.users.setperms"))
{
<form asp-controller="AdminUsers" asp-action="SetPerms" asp-route-userid="@user.UserId" method="POST"
enctype="application/x-www-form-urlencoded" style="display:inline">
r:<select name="roleId" required class="blueunderline">
@foreach (var role in Model.Roles.Values)
{
if (role.RoleId == user.RoleId)
{
<option value="@role.RoleId" selected>@role.Name</option>
}
else
{
<option value="@role.RoleId">@role.Name</option>
}
}
</select>,
p:<select name="planId" required class="blueunderline">
@foreach (var plan in Model.Plans.Values)
{
if (plan.PlanId == user.PlanId)
{
<option value="@plan.PlanId" selected>@plan.Name</option>
}
else
{
<option value="@plan.PlanId">@plan.Name</option>
}
}
</select>
<input type="submit" value="Set permissions">
</form>
}
else
{
@: r:@Model.Roles[user.RoleId].Name,
@: p:@Model.Plans[user.PlanId].Name
}
)
</li>
}
</ul>

View File

@ -396,3 +396,7 @@ td.numeric {
a.show-button {
display: inline;
}
.username {
color: gray;
}