using System; using System.Linq; using System.Web.Mvc; using JetBrains.Annotations; using VideoGameQuotes.Api; using VideoGameQuotes.Web.Models; using VideoGameQuotes.Web.Security; using VideoGameQuotes.Web.Services; namespace VideoGameQuotes.Web.Controllers { public class QuoteController : Controller { private readonly IQuoteService quoteService; private readonly ICurrentUserProvider currentUserProvider; public QuoteController(IQuoteService quoteService, ICurrentUserProvider currentUserProvider) { this.quoteService = quoteService; this.currentUserProvider = currentUserProvider; } [IsValidUser] public ActionResult Submit() { var model = new QuoteSubmitModel(); ResetModel(model); return View(model); } [HttpPost, IsValidUser] public ActionResult Submit(QuoteSubmitModel model) { if (!ModelState.IsValid) { ResetModel(model); return View(model); } try { var quote = new Quote { Creator = currentUserProvider.CurrentUser, Game = GetGameFromModelData(model), Text = model.QuoteText }; if (quote.Game == null) { ResetModel(model); return View(model); } quote = quoteService.SaveQuote(quote); return RedirectToAction("Quote", new { id = quote.Id }); } catch (Exception e) { ModelState.AddModelError("save", e.Message); ResetModel(model); return View(model); } } [CanBeNull] private Game GetGameFromModelData(QuoteSubmitModel model) { if (model.GameId > 0) { try { return quoteService.GetGame(model.GameId); } catch { throw new Exception("Unable to find game with ID " + model.GameId); } } if (string.IsNullOrEmpty(model.GameName)) { ModelState.AddModelError("GameName", "Game name must be non-empty"); return null; } //construct game from model data var game = new Game { Name = model.GameName, Region = model.GameRegions.Aggregate(Region.Unknown, (current, next) => current | (Region)Enum.Parse(typeof(Region), next)), Website = model.GameWebsite, Creator = currentUserProvider.CurrentUser }; //publishers if ((model.PublisherIds != null && model.PublisherIds.Count > 0) || !string.IsNullOrEmpty(model.PublisherName)) { //modifying publishers, so remove errthing game.ClearPublishers(); if (model.PublisherIds != null && model.PublisherIds.Count > 0) { foreach (var publisherId in model.PublisherIds) { game.AddPublisher(quoteService.GetPublisher(publisherId)); } } if (!string.IsNullOrEmpty(model.PublisherName)) { game.AddPublisher(new Publisher { Name = model.PublisherName, Website = model.PublisherWebsite }); } } //systems if ((model.SystemIds != null && model.SystemIds.Count > 0) || !string.IsNullOrEmpty(model.SystemName)) { //modifying systems, so remove errthing game.ClearSystems(); if (model.SystemIds != null && model.SystemIds.Count > 0) { foreach (var systemId in model.SystemIds) { game.AddSystem(quoteService.GetSystem(systemId)); } } if (!string.IsNullOrEmpty(model.SystemName)) { game.AddSystem(new GamingSystem { Name = model.SystemName, Abbreviation = model.SystemAbbreviation, ReleaseDate = model.SystemReleaseDate }); } } return game; } private void ResetModel(QuoteSubmitModel model) { model.AllGames = quoteService.GetAllGames().OrderBy(game => game.Name); model.AllSystems = quoteService.GetAllSystems().OrderBy(system => system.ReleaseDate); model.AllPublishers = quoteService.GetAllPublishers(); } public ActionResult Quote(int id) { return View(quoteService.GetQuote(id)); } } }