40 lines
1.1 KiB
C#
40 lines
1.1 KiB
C#
using MongoDB.Entities;
|
|||
|
|
|
||
|
|
using PrivaPub.ClientModels;
|
||
|
|
using PrivaPub.Models.User;
|
||
|
|
|
||
|
|
namespace PrivaPub.Infrastructure.Cli
|
||
|
|
{
|
||
|
|
public static class AdminCommands
|
||
|
|
{
|
||
|
|
const string Usage = "usage: PrivaPub admin promote|demote <root username>";
|
||
|
|
|
||
|
|
public static async Task<int> Run(string[] args)
|
||
|
|
{
|
||
|
|
if (args is not [("promote" or "demote") and var verb, var userName])
|
||
|
|
{
|
||
|
|
Console.Error.WriteLine(Usage);
|
||
|
|
return 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
userName = userName.ToLowerInvariant();
|
||
|
|
var user = await DB.Default.Find<RootUser>().Match(u => u.UserName == userName).ExecuteFirstAsync();
|
||
|
|
if (user == default)
|
||
|
|
{
|
||
|
|
Console.Error.WriteLine($"no root user '{userName}'");
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
user.Policies.RemoveAll(p => p is Policies.IsAdmin or Policies.IsModerator);
|
||
|
|
if (verb == "promote")
|
||
|
|
user.Policies.AddRange(new[] { Policies.IsAdmin, Policies.IsModerator });
|
||
|
|
if (!user.Policies.Contains(Policies.IsUser))
|
||
|
|
user.Policies.Add(Policies.IsUser);
|
||
|
|
user.UpdatedAt = DateTime.UtcNow;
|
||
|
|
await DB.Default.SaveAsync(user);
|
||
|
|
|
||
|
|
Console.WriteLine($"{userName}: {string.Join(", ", user.Policies)}");
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|