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 userProvider; public GameController(IGameService gameService, ICurrentUserProvider 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()).Walk(id => game.AddPublisher(new Publisher { Id = id })); (model.SystemIds ?? Enumerable.Empty()).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())); } } }