diff --git a/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml b/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml new file mode 100644 index 00000000..a965d891 --- /dev/null +++ b/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml @@ -0,0 +1,54 @@ +@page "/{eventId}/{eventRole}/Events/AddAdminOrAuthor" +@model ServerCore.Pages.Events.AddAdminOrAuthorModel + +@{ + ViewData["Title"] = "Add admin or author"; + ViewData["AdminRoute"] = "/Events/Players"; + var roleString = Model.addAdmin ? "admin" : "author"; +} + +

Add @roleString

+ +
+ Cancel +
+ +

Select a user to make an @roleString

+ + + + + + + + + + + @foreach (var item in Model.Users) + { + + + + + + } + +
+ @Html.DisplayNameFor(model => model.Users[0].Name) + + @Html.DisplayNameFor(model => model.Users[0].Email) + +
+ @Html.DisplayFor(modelItem => item.Name) + + @Html.DisplayFor(modelItem => item.Email) + + @if (Model.addAdmin) + { + Add + } + else + { + Add + } +
\ No newline at end of file diff --git a/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml.cs b/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml.cs new file mode 100644 index 00000000..ae0bc6c8 --- /dev/null +++ b/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.EntityFrameworkCore; +using ServerCore.DataModel; +using ServerCore.ModelBases; + +namespace ServerCore.Pages.Events +{ + [Authorize("IsEventAdmin")] + public class AddAdminOrAuthorModel : EventSpecificPageModel + { + public IList Users { get; set; } + + public bool addAdmin { get; set; } + + public AddAdminOrAuthorModel(PuzzleServerContext serverContext, UserManager userManager) : base(serverContext, userManager) + { + } + + public async Task OnGetAsync(bool addAdmin) + { + this.addAdmin = addAdmin; + + if (addAdmin) + { + Users = await (from user in _context.PuzzleUsers + where !((from eventAdmin in _context.EventAdmins + where eventAdmin.Event == Event + where eventAdmin.Admin == user + select eventAdmin).Any()) + select user).ToListAsync(); + } + else + { + Users = await (from user in _context.PuzzleUsers + where !((from eventAuthor in _context.EventAuthors + where eventAuthor.Event == Event + where eventAuthor.Author == user + select eventAuthor).Any()) + select user).ToListAsync(); + } + + return Page(); + } + + public async Task OnGetAddAdminAsync(int userId) + { + // Check that the user isn't already an admin + if (await (from admin in _context.EventAdmins + where admin.Admin.ID == userId && + admin.Event == Event + select admin).AnyAsync()) + { + return NotFound("User is already an admin in this event."); + } + + EventAdmins Admin = new EventAdmins(); + + PuzzleUser user = await _context.PuzzleUsers.FirstOrDefaultAsync(m => m.ID == userId); + if (user == null) + { + return NotFound("Could not find user with ID '" + userId + "'. Check to make sure the user hasn't been removed."); + } + Admin.Admin = user; + + Admin.Event = Event; + + _context.EventAdmins.Add(Admin); + await _context.SaveChangesAsync(); + return RedirectToPage("/Events/Players"); + } + + public async Task OnGetAddAuthorAsync(int userId) + { + // Check that the user isn't already an author + if (await (from author in _context.EventAuthors + where author.Author.ID == userId && + author.Event == Event + select author).AnyAsync()) + { + return NotFound("User is already an author in this event."); + } + + EventAuthors Author = new EventAuthors(); + + PuzzleUser user = await _context.PuzzleUsers.FirstOrDefaultAsync(m => m.ID == userId); + if (user == null) + { + return NotFound("Could not find user with ID '" + userId + "'. Check to make sure the user hasn't been removed."); + } + Author.Author = user; + + Author.Event = Event; + + _context.EventAuthors.Add(Author); + await _context.SaveChangesAsync(); + return RedirectToPage("/Events/Players"); + } + } +} \ No newline at end of file diff --git a/ServerCore/Pages/Events/Players.cshtml b/ServerCore/Pages/Events/Players.cshtml index 6d2d9f8a..24f113c6 100644 --- a/ServerCore/Pages/Events/Players.cshtml +++ b/ServerCore/Pages/Events/Players.cshtml @@ -1,42 +1,136 @@ @page "/{eventId}/{eventRole}/Events/Players" @model ServerCore.Pages.Events.PlayersModel @{ - ViewData["Title"] = "Players"; + ViewData["Title"] = "Users"; ViewData["AdminRoute"] = "/Events/Players"; ViewData["AuthorRoute"] = "/EventSpecific/Index"; ViewData["PlayRoute"] = "/EventSpecific/Index"; } -

Players

+

Users

+ +

Admins

+Add admin + + + + + + + + + + + + + @foreach (var item in Model.Admins) + { + + + + + + + + } + +
+ @Html.DisplayNameFor(model => model.Admins[0].Name) + + @Html.DisplayNameFor(model => model.Admins[0].Email) + + @Html.DisplayNameFor(model => model.Admins[0].EmployeeAlias) + +
+ @Html.DisplayFor(modelItem => item.Name) + + @Html.DisplayFor(modelItem => item.Email) + + @Html.DisplayFor(modelItem => item.EmployeeAlias) + + Remove +
+ +

All admin e-mails

+ +

@Model.AdminEmails

+ +

Authors

+Add author - @foreach (var item in Model.Players) + @foreach (var item in Model.Authors) { + + + + + + + } + +
- Player @Html.DisplayNameFor(model => model.Players[0].Member.ID) + @Html.DisplayNameFor(model => model.Authors[0].Item1.Name) - Player @Html.DisplayNameFor(model => model.Players[0].Member.Name) + @Html.DisplayNameFor(model => model.Authors[0].Item1.Email) - Player @Html.DisplayNameFor(model => model.Players[0].Member.Email) + @Html.DisplayNameFor(model => model.Authors[0].Item1.EmployeeAlias) - Team @Html.DisplayNameFor(model => model.Players[0].Team.ID) + Puzzle count - Team @Html.DisplayNameFor(model => model.Players[0].Team.Name)
- @Html.DisplayFor(modelItem => item.Member.ID) + @Html.DisplayFor(modelItem => item.Item1.Name) + @Html.DisplayFor(modelItem => item.Item1.Email) + + @Html.DisplayFor(modelItem => item.Item1.EmployeeAlias) + + @Html.DisplayFor(modelItem => item.Item2) + + Remove +
+ +

All author e-mails

+ +

@Model.AuthorEmails

+ +

Players

+ + + + + + + + + + + + + @foreach (var item in Model.Players) + { + @@ -44,10 +138,10 @@ @Html.DisplayFor(modelItem => item.Member.Email) @@ -55,10 +149,6 @@
+ @Html.DisplayNameFor(model => model.Players[0].Member.Name) + + @Html.DisplayNameFor(model => model.Players[0].Member.Email) + + @Html.DisplayNameFor(model => model.Players[0].Member.EmployeeAlias) + + @Html.DisplayNameFor(model => model.Players[0].Team.Name) +
@Html.DisplayFor(modelItem => item.Member.Name) - @Html.DisplayFor(modelItem => item.Team.ID) + @Html.DisplayFor(modelItem => item.Member.EmployeeAlias) - @Html.DisplayFor(modelItem => item.Team.Name) + @Html.DisplayFor(modelItem => item.Team.Name)
-

All player e-mails

- -

@Model.Emails

+

All player e-mails

- \ No newline at end of file +

@Model.PlayerEmails

\ No newline at end of file diff --git a/ServerCore/Pages/Events/Players.cshtml.cs b/ServerCore/Pages/Events/Players.cshtml.cs index 5ee72a39..86c766b1 100644 --- a/ServerCore/Pages/Events/Players.cshtml.cs +++ b/ServerCore/Pages/Events/Players.cshtml.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -12,28 +13,101 @@ namespace ServerCore.Pages.Events { public class PlayersModel : EventSpecificPageModel { + public IList Admins { get; set; } + + public string AdminEmails { get; set; } + + public IList> Authors { get; set; } + + public string AuthorEmails { get; set; } + public IList Players { get; set; } - public string Emails { get; set; } + public string PlayerEmails { get; set; } public PlayersModel(PuzzleServerContext serverContext, UserManager userManager) : base(serverContext, userManager) { } - public async Task OnGetAsync(int teamId) + public async Task OnGetAsync() { + // Get admins + + Admins = await _context.EventAdmins + .Where(admin => admin.Event == Event).Select(admin => admin.Admin) + .ToListAsync(); + + StringBuilder adminEmailList = new StringBuilder(""); + foreach (PuzzleUser admin in Admins) + { + adminEmailList.Append(admin.Email + "; "); + } + AdminEmails = adminEmailList.ToString(); + + // Get authors + + IList allAuthors = await (from author in _context.EventAuthors + where author.Event == Event + select author.Author).ToListAsync(); + + Dictionary allPuzzles = await (from puzzleAuthor in _context.PuzzleAuthors + where puzzleAuthor.Puzzle.Event == Event + group puzzleAuthor by puzzleAuthor.Author.ID into puzzleGroup + select new { authorId = puzzleGroup.Key, count = puzzleGroup.Count() }) + .ToDictionaryAsync(x => x.authorId, x => x.count); + + StringBuilder authorEmailList = new StringBuilder(""); + Authors = new List>(); + foreach (PuzzleUser author in allAuthors) + { + authorEmailList.Append(author.Email + "; "); + int puzzleCount = allPuzzles.ContainsKey(author.ID) ? allPuzzles[author.ID] : 0; + Authors.Add(new Tuple(author, puzzleCount)); + } + AuthorEmails = authorEmailList.ToString(); + + // Get players + Players = await _context.TeamMembers .Where(member => member.Team.Event == Event) .ToListAsync(); - StringBuilder emailList = new StringBuilder(""); + StringBuilder playerEmailList = new StringBuilder(""); foreach (TeamMembers Player in Players) { - emailList.Append(Player.Member.Email + "; "); + playerEmailList.Append(Player.Member.Email + "; "); } - Emails = emailList.ToString(); + PlayerEmails = playerEmailList.ToString(); + + // Return page return Page(); } + + public async Task OnGetRemoveAdminAsync(int userId) + { + EventAdmins Admin = await _context.EventAdmins.FirstOrDefaultAsync(admin => admin.Admin.ID == userId && admin.Event == Event); + if (Admin == null) + { + return NotFound("Could not find event admin with ID '" + userId + "'. They may have already been removed from the admin role."); + } + + _context.EventAdmins.Remove(Admin); + await _context.SaveChangesAsync(); + return RedirectToPage("/Events/Players"); + } + + public async Task OnGetRemoveAuthorAsync(int userId) + { + EventAuthors Author = await _context.EventAuthors.FirstOrDefaultAsync(author => author.Author.ID == userId && author.Event == Event); + if (Author == null) + { + return NotFound("Could not find event author with ID '" + userId + "'. They may have already been removed from the author role."); + } + + _context.EventAuthors.Remove(Author); + await _context.SaveChangesAsync(); + return RedirectToPage("/Events/Players"); + } } } \ No newline at end of file diff --git a/ServerCore/Pages/Teams/AddMember.cshtml.cs b/ServerCore/Pages/Teams/AddMember.cshtml.cs index f239aad0..8d0cadd2 100644 --- a/ServerCore/Pages/Teams/AddMember.cshtml.cs +++ b/ServerCore/Pages/Teams/AddMember.cshtml.cs @@ -53,6 +53,7 @@ public async Task OnGetAsync(int teamId) Users = await (from user in _context.PuzzleUsers where !((from teamMember in _context.TeamMembers where teamMember.Team.Event == Event + where teamMember.Member == user select teamMember).Any()) select new Tuple(user, -1)).ToListAsync(); } @@ -60,9 +61,6 @@ public async Task OnGetAsync(int teamId) return Page(); } - [BindProperty] - public TeamMembers Member { get; set; } - public async Task OnGetAddMemberAsync(int teamId, int userId, int applicationId) { if (applicationId == -1) diff --git a/ServerCore/ServerCore.csproj b/ServerCore/ServerCore.csproj index 0a669c79..6d9ed873 100644 --- a/ServerCore/ServerCore.csproj +++ b/ServerCore/ServerCore.csproj @@ -50,6 +50,9 @@ $(IncludeRazorContentInPack) + + $(IncludeRazorContentInPack) + $(IncludeRazorContentInPack)