create admin
This commit is contained in:
parent
b45c82e5fa
commit
8522cf50b0
@ -1,4 +1,5 @@
|
||||
using System.Web.Mvc;
|
||||
using Portoa.Persistence;
|
||||
using Portoa.Web;
|
||||
using Portoa.Web.ErrorHandling;
|
||||
using VideoGameQuotes.Api;
|
||||
@ -17,6 +18,66 @@ namespace VideoGameQuotes.Web.Controllers {
|
||||
this.adminService = adminService;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public ActionResult Create() {
|
||||
var model = new CreateAdminModel();
|
||||
ResetCreateAdminModel(model);
|
||||
return View(model);
|
||||
}
|
||||
|
||||
private void ResetCreateAdminModel(CreateAdminModel model) {
|
||||
model.Users = adminService.GetAllUsers();
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult Create(CreateAdminModel model) {
|
||||
if (!ModelState.IsValid) {
|
||||
ResetCreateAdminModel(model);
|
||||
return View(model);
|
||||
}
|
||||
|
||||
try {
|
||||
var user = new User {
|
||||
Username = model.Username,
|
||||
Group = UserGroup.Admin
|
||||
};
|
||||
|
||||
if (model.UserId > 0) {
|
||||
user = adminService.GetUser(model.UserId);
|
||||
if (user.Group == UserGroup.Admin) {
|
||||
ModelState.AddModelError("UserId", string.Format("The user {0} is already an admin", user.Username));
|
||||
} else {
|
||||
user.Group = UserGroup.Admin;
|
||||
}
|
||||
|
||||
if (user.Username == null) {
|
||||
if (string.IsNullOrWhiteSpace(model.Username)) {
|
||||
ModelState.AddModelError("Username", "Username must be given if the user does not have a username");
|
||||
} else {
|
||||
user.Username = model.Username;
|
||||
}
|
||||
}
|
||||
} else if (string.IsNullOrWhiteSpace(model.Username)) {
|
||||
ModelState.AddModelError("Username", "Username must be non-empty if creating a new user");
|
||||
}
|
||||
|
||||
if (!ModelState.IsValid) {
|
||||
ResetCreateAdminModel(model);
|
||||
return View(model);
|
||||
}
|
||||
|
||||
user.IpAddress = null; //must delete ip address or it's kind of a glaring security hole
|
||||
user.ChangePassword(model.Password);
|
||||
|
||||
adminService.SaveUser(user);
|
||||
return View("CreateAdminSuccess", model);
|
||||
} catch (EntityNotFoundException) {
|
||||
ModelState.AddModelError("UserId", string.Format("User not found for id {0}", model.UserId));
|
||||
ResetCreateAdminModel(model);
|
||||
return View(model);
|
||||
}
|
||||
}
|
||||
|
||||
public ActionResult Index() {
|
||||
return View();
|
||||
}
|
||||
|
28
Src/VideoGameQuotes.Web/Models/CreateAdminModel.cs
Normal file
28
Src/VideoGameQuotes.Web/Models/CreateAdminModel.cs
Normal file
@ -0,0 +1,28 @@
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using VideoGameQuotes.Api;
|
||||
|
||||
namespace VideoGameQuotes.Web.Models {
|
||||
public class CreateAdminModel {
|
||||
[DisplayName("Use existing user")]
|
||||
public int UserId { get; set; }
|
||||
public string Username { get; set; }
|
||||
[Required]
|
||||
public string Password { get; set; }
|
||||
|
||||
public IEnumerable<User> Users { get; set; }
|
||||
|
||||
public IEnumerable<SelectListItem> GetUserList() {
|
||||
return new[] { new SelectListItem { Text = "--none--", Value = "0" } }
|
||||
.Concat(Users
|
||||
.Where(user => user.Group != UserGroup.Admin)
|
||||
.OrderBy(user => user.Username)
|
||||
.ThenBy(user => user.IpAddress)
|
||||
.Select(user => new SelectListItem { Text = user.Username ?? user.IpAddress, Value = user.Id.ToString() })
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
@ -7,6 +7,8 @@ namespace VideoGameQuotes.Web.Services {
|
||||
public interface IAdministrationService {
|
||||
User SaveUser(User user);
|
||||
IEnumerable<Quote> GetFlaggedQuotes();
|
||||
User GetUser(int id);
|
||||
IEnumerable<User> GetAllUsers();
|
||||
}
|
||||
|
||||
public class AdministrationService : IAdministrationService {
|
||||
@ -31,5 +33,14 @@ namespace VideoGameQuotes.Web.Services {
|
||||
.OrderByDescending(quote => quote.Flags.Count());
|
||||
}
|
||||
|
||||
[UnitOfWork]
|
||||
public User GetUser(int id) {
|
||||
return userRepository.FindById(id);
|
||||
}
|
||||
|
||||
[UnitOfWork]
|
||||
public IEnumerable<User> GetAllUsers() {
|
||||
return userRepository.Records;
|
||||
}
|
||||
}
|
||||
}
|
@ -91,6 +91,7 @@
|
||||
<Compile Include="Models\BrowseModel.cs" />
|
||||
<Compile Include="Models\BrowseModelBinder.cs" />
|
||||
<Compile Include="Models\ChangePasswordModel.cs" />
|
||||
<Compile Include="Models\CreateAdminModel.cs" />
|
||||
<Compile Include="Models\MainMenuModel.cs" />
|
||||
<Compile Include="Models\QualifiedBrowseModel.cs" />
|
||||
<Compile Include="Models\PagedQuoteCollectionModel.cs" />
|
||||
@ -131,6 +132,8 @@
|
||||
<Content Include="media\images\search.png" />
|
||||
<Content Include="media\js\jquery.cookie.js" />
|
||||
<Content Include="media\js\vgquotes.js" />
|
||||
<Content Include="Views\Admin\Create.aspx" />
|
||||
<Content Include="Views\Admin\CreateAdminSuccess.aspx" />
|
||||
<Content Include="Views\Admin\FlaggedQuote.ascx" />
|
||||
<Content Include="Views\Admin\Flags.aspx" />
|
||||
<Content Include="Views\Admin\Index.aspx" />
|
||||
|
30
Src/VideoGameQuotes.Web/Views/Admin/Create.aspx
Normal file
30
Src/VideoGameQuotes.Web/Views/Admin/Create.aspx
Normal file
@ -0,0 +1,30 @@
|
||||
<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<VideoGameQuotes.Web.Models.CreateAdminModel>" MasterPageFile="~/Views/Shared/Site.Master" %>
|
||||
<%@ Import Namespace="Portoa.Web.Util" %>
|
||||
<asp:Content runat="server" ID="Title" ContentPlaceHolderID="TitleContent">Create Admin</asp:Content>
|
||||
<asp:Content runat="server" ID="Main" ContentPlaceHolderID="MainContent">
|
||||
<h2>Create Admin</h2>
|
||||
|
||||
<%= Html.ValidationSummary("Some errors occurred") %>
|
||||
|
||||
<% using (Html.BeginForm()) { %>
|
||||
<p>
|
||||
<%= Html.LabelFor(model => model.UserId) %> <%= Html.ValidationMessageFor(model => model.UserId) %>
|
||||
<br />
|
||||
<%= Html.DropDownListFor(model => model.UserId, Model.GetUserList()) %>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<%= Html.LabelFor(model => model.Username) %> <%= Html.ValidationMessageFor(model => model.Username) %>
|
||||
<br />
|
||||
<%= Html.TextBoxFor(model => model.Username) %>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<%= Html.LabelFor(model => model.Password) %> <%= Html.ValidationMessageFor(model => model.Password) %>
|
||||
<br />
|
||||
<%= Html.PasswordFor(model => model.Password) %>
|
||||
</p>
|
||||
|
||||
<%= Html.Submit("Create Admin") %>
|
||||
<% } %>
|
||||
</asp:Content>
|
@ -0,0 +1,9 @@
|
||||
<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<VideoGameQuotes.Web.Models.CreateAdminModel>" MasterPageFile="~/Views/Shared/Site.Master" %>
|
||||
<asp:Content runat="server" ID="Title" ContentPlaceHolderID="TitleContent">Create Admin</asp:Content>
|
||||
<asp:Content runat="server" ID="Main" ContentPlaceHolderID="MainContent">
|
||||
<h2>Success</h2>
|
||||
<p>
|
||||
The user <%= Html.ActionLink(Model.Username, "user", "admin", new { id = Model.UserId }, null) %> is now
|
||||
an admin.
|
||||
</p>
|
||||
</asp:Content>
|
@ -32,7 +32,7 @@ alter table quote_flag drop foreign key fk_flag_user
|
||||
;
|
||||
|
||||
|
||||
alter table quote_flag drop foreign key fk_flag_quote
|
||||
alter table quote_flag drop foreign key fk_quote_flag
|
||||
;
|
||||
|
||||
|
||||
@ -61,6 +61,8 @@ alter table quote_category_map drop foreign key FK5892F846C2AA09DD
|
||||
|
||||
drop table if exists publisher;
|
||||
|
||||
drop table if exists category;
|
||||
|
||||
drop table if exists vgquote_user;
|
||||
|
||||
drop table if exists quote_flag;
|
||||
@ -71,8 +73,6 @@ alter table quote_category_map drop foreign key FK5892F846C2AA09DD
|
||||
|
||||
drop table if exists system;
|
||||
|
||||
drop table if exists category;
|
||||
|
||||
create table vote (
|
||||
vote_id INTEGER NOT NULL AUTO_INCREMENT,
|
||||
created DATETIME not null,
|
||||
@ -113,6 +113,13 @@ alter table quote_category_map drop foreign key FK5892F846C2AA09DD
|
||||
primary key (publisher_id)
|
||||
);
|
||||
|
||||
create table category (
|
||||
category_id INTEGER NOT NULL AUTO_INCREMENT,
|
||||
category_name VARCHAR(255) not null unique,
|
||||
created DATETIME not null,
|
||||
primary key (category_id)
|
||||
);
|
||||
|
||||
create table vgquote_user (
|
||||
user_id INTEGER NOT NULL AUTO_INCREMENT,
|
||||
username VARCHAR(50),
|
||||
@ -159,13 +166,6 @@ alter table quote_category_map drop foreign key FK5892F846C2AA09DD
|
||||
primary key (system_id)
|
||||
);
|
||||
|
||||
create table category (
|
||||
category_id INTEGER NOT NULL AUTO_INCREMENT,
|
||||
category_name VARCHAR(255) not null unique,
|
||||
created DATETIME not null,
|
||||
primary key (category_id)
|
||||
);
|
||||
|
||||
alter table vote
|
||||
add index (voter_id),
|
||||
add constraint fk_vote_user
|
||||
@ -216,7 +216,7 @@ alter table quote_category_map drop foreign key FK5892F846C2AA09DD
|
||||
|
||||
alter table quote_flag
|
||||
add index (quote_id),
|
||||
add constraint fk_flag_quote
|
||||
add constraint fk_quote_flag
|
||||
foreign key (quote_id)
|
||||
references game_quote (quote_id);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user