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 "; public static async Task 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().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; } } }