111 lines
3.6 KiB
C#
111 lines
3.6 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Web.Mvc;
|
|
using Portoa.Persistence;
|
|
using Portoa.Util;
|
|
using Portoa.Web.Controllers;
|
|
using Portoa.Web.Security;
|
|
using Portoa.Web.Util;
|
|
using VideoGameQuotes.Api;
|
|
using VideoGameQuotes.Web.Models;
|
|
using VideoGameQuotes.Web.Security;
|
|
using VideoGameQuotes.Web.Services;
|
|
|
|
namespace VideoGameQuotes.Web.Controllers {
|
|
public class GameController : Controller {
|
|
private readonly IGameService gameService;
|
|
private readonly ICurrentUserProvider<User> userProvider;
|
|
|
|
public GameController(IGameService gameService, ICurrentUserProvider<User> userProvider) {
|
|
this.gameService = gameService;
|
|
this.userProvider = userProvider;
|
|
}
|
|
|
|
protected new ActionResult Json(object data) {
|
|
return this.SerializeToJson(data);
|
|
}
|
|
|
|
[HttpPost, VerifyUser(Group = UserGroup.Admin)]
|
|
public ActionResult Delete(int id) {
|
|
if (id < 1) {
|
|
return Json(this.CreateJsonResponse("Invalid ID"));
|
|
}
|
|
|
|
try {
|
|
var game = gameService.FindById(id);
|
|
var numQuotes = gameService.GetQuotesForGame(game);
|
|
if (numQuotes > 0) {
|
|
return Json(this.CreateJsonErrorResponse(
|
|
string.Format("There are {0} quotes that are still using this game", numQuotes)
|
|
));
|
|
}
|
|
} catch (EntityNotFoundException) {
|
|
return Json(this.CreateJsonErrorResponse("No game exists for ID " + id));
|
|
}
|
|
|
|
gameService.Delete(id);
|
|
return Json(this.CreateJsonResponse());
|
|
}
|
|
|
|
[HttpPost, VerifyUser(Group = UserGroup.Admin)]
|
|
public ActionResult Edit(EditGameModel model) {
|
|
if (model.GameId < 1) {
|
|
ModelState.AddModelError("GameId", "Invalid game ID");
|
|
}
|
|
|
|
byte[] icon = null;
|
|
if (model.GameIcon != null) {
|
|
icon = Convert.FromBase64String(model.GameIcon);
|
|
if (icon.Length > 1024) {
|
|
ModelState.AddModelError("GameIcon", "Icon must be smaller than 1KB");
|
|
}
|
|
}
|
|
|
|
if (!ModelState.IsValid) {
|
|
return Json(this.CreateJsonErrorResponse("Some errors occurred"));
|
|
}
|
|
|
|
var game = gameService.FindById(model.GameId);
|
|
game.Name = model.GameName;
|
|
game.Icon = icon;
|
|
game.Region = model.GameRegions;
|
|
game.Website = model.GameWebsite;
|
|
|
|
game.ClearPublishers();
|
|
game.ClearSystems();
|
|
(model.PublisherIds ?? Enumerable.Empty<int>()).Walk(id => game.AddPublisher(new Publisher { Id = id }));
|
|
(model.SystemIds ?? Enumerable.Empty<int>()).Walk(id => game.AddSystem(new GamingSystem { Id = id }));
|
|
|
|
game = gameService.Save(game);
|
|
return Json(this.CreateJsonResponse(data: game.ToDto()));
|
|
}
|
|
|
|
[HttpPost, VerifyUser]
|
|
public ActionResult Create(EditGameModel model) {
|
|
byte[] icon = null;
|
|
if (model.GameIcon != null) {
|
|
icon = Convert.FromBase64String(model.GameIcon);
|
|
if (icon.Length > 1024) {
|
|
ModelState.AddModelError("GameIcon", "Icon must be smaller than 1KB");
|
|
}
|
|
}
|
|
|
|
if (!ModelState.IsValid) {
|
|
return Json(this.CreateJsonErrorResponse("Some errors occurred."));
|
|
}
|
|
|
|
if (gameService.FindByNameAndSystems(model.GameName, model.SystemIds) != null) {
|
|
return Json(this.CreateJsonResponse("A game with that name for one of those systems already exists."));
|
|
}
|
|
|
|
var game = new Game { Name = model.GameName, Website = model.GameWebsite, Region = model.GameRegions, Creator = userProvider.CurrentUser, Icon = icon };
|
|
model.SystemIds.Walk(id => game.AddSystem(new GamingSystem { Id = id }));
|
|
if (model.PublisherIds != null) {
|
|
model.PublisherIds.Walk(id => game.AddPublisher(new Publisher {Id = id}));
|
|
}
|
|
|
|
game = gameService.Save(game);
|
|
return Json(this.CreateJsonResponse(data: game.ToDto()));
|
|
}
|
|
}
|
|
} |