diff --git a/Lib/Portoa.Web.dll b/Lib/Portoa.Web.dll index 029d8be..a9d8e38 100644 Binary files a/Lib/Portoa.Web.dll and b/Lib/Portoa.Web.dll differ diff --git a/Lib/Portoa.Web.xml b/Lib/Portoa.Web.xml index 37ee86e..0394886 100644 --- a/Lib/Portoa.Web.xml +++ b/Lib/Portoa.Web.xml @@ -11,6 +11,18 @@ + + + Enables you to dynamically add filters to a ControllerActionInvoker. This class will also + perform injection on all filters that are annotated with NeedsBuildUpAttribute. + + Adapted from http://blog.ploeh.dk/2009/12/01/GlobalErrorHandlingInASPNETMVC.aspx + + + + Overridden to add the new filters to the default filters + + Signifies that this controller can handle errors that aren't handled by @@ -32,6 +44,18 @@ Executed when the user is forbidden from seeing the requested page + + + whose lifetime lasts as long as the HTTP request. + The object is stored in HttpContext.Current.Items, keyed by a . + + + + + Matching rule that matches when a method is annotated with an attribute + + The attribute to match against + Model binder that uses an IUnityContainer to resolve the model binder designated by @@ -54,6 +78,11 @@ The service provider to use to resolve the model binder + + + Controller factory that uses a service provider to resolve controllers + + Gets the HTML-safe string representation of the tag. Thanks, Microsoft, for making @@ -91,6 +120,12 @@ The text that the button will display Any additional HTML attributes for the input tag + + + Indicates that an object needs to be built up by the container + + + Service for authenticating users @@ -203,6 +238,13 @@ not be null. + + + Flattens a FilterInfo object into a single IEnumerable containing + the ActionFilter, ExceptionFilter, ResultFilter and + AuthorizationFilter collections + + This class exists to get rid of the SessionState and TempData error. Just google it. @@ -261,6 +303,17 @@ Configures the application to use log4net + + + decorator that allows you to explicitly control + how the object disposes (useful for 3rd-party objects that do not implement + ) + + + + The LifetimeManager to decorate + Action to call when the value is removed to dispose of the object + Provides an interface for interacting with session data @@ -336,6 +389,21 @@ The base class/interface to match against + + + Gets a value from the request and casts it to the specified type + + + + + Gets a value from the request + + + + + Adds an error to the model state + + Error result factory that returns a result suitable @@ -359,6 +427,17 @@ Session store that uses the current HttpContext + + + IControllerFactory that provides a mechanism to perform injection + on the controller after it is instantiated + + + + + Event that fires after a controller is instantiated + + Controller for handling and displaying errors that aren't handled by application code @@ -367,6 +446,11 @@ The factory to use to create the action results + + + Uses an IUnityContainer to create controllers + + Call handler that wraps a method call in a unit of work @@ -405,6 +489,18 @@ Gets or sets the currently logged in user, or null if no one is logged in + + + Provides an interface for identifying the current user + + The user type + + + + Returns the user currently performing actions on the site, or null + if the user cannot be identified + + Gets all model state errors as a line feed-delimited string @@ -513,22 +609,6 @@ later. - - - Uses an IUnityContainer to create controllers - - - - - IControllerFactory that provides a mechanism to perform injection - on the controller after it is instantiated - - - - - Event that fires after a controller is instantiated - - Negates a matching rule @@ -564,13 +644,19 @@ Reads the app config and applies the Unity configuration, if applicable - + - Model for displaying a paging menu + Gets an object from the request variables, or its default value if + the key does not exist + The type to convert the value to + The request key of the object to retrieve - - The model used for displaying the paged data + + + Strongly-typed model for displaying data that should be paged + + The type of data to be paged @@ -627,11 +713,114 @@ Gets or sets filtered record set; Count() should be less than or equal to the page size - + - Strongly-typed model for displaying data that is paged + Gets or sets filtered record set; Count() should be less than or equal to the page size + + + + + Model for displaying a paging menu + + + + The model used for displaying the paged data + + + + Gets the data needed to display a link to a certain page + + The number of the page to retrieve + + + + Gets or sets action to navigate to when going to the next or previous page + + + + + Gets or sets the controller to navigate to when going to the next or previous page + + + + + Gets the starting point of the current page + + + + + Gets the actual ending point of the current page + + + + + Gets the theoretical ending point of the current page + + + + + Gets the total number of pages in the set + + + + + Gets the current page number + + + + + Gets whether or not a previous page is possible + + + + + Gets whether or not a next page is possible + + + + + Gets the page size + + + + + Gets the total number of records + + + + + Gets whether or not the menu should be shown + + + + + Gets whether or not the current page is a valid page number for the given data + + + + + Gets the data needed to display a link to all the pages + + + + + Represents the data needed to show a link to a page + + + + + Gets or sets the starting point of this page + + + + + Gets or sets the ending point of this page + + + + + Gets or sets the page number - The type of data to be paged @@ -667,92 +856,11 @@ - + - Matching rule that matches when a method is annotated with an attribute - - The attribute to match against - - - - whose lifetime lasts as long as the HTTP request. - The object is stored in HttpContext.Current.Items, keyed by a . - - - - - decorator that allows you to explicitly control - how the object disposes (useful for 3rd-party objects that do not implement - ) - - - - The LifetimeManager to decorate - Action to call when the value is removed to dispose of the object - - - - Gets an object from the request variables, or its default value if - the key does not exist - - The type to convert the value to - The request key of the object to retrieve - - - - Gets a value from the request and casts it to the specified type - - - - - Gets a value from the request - - - - - Adds an error to the model state - - - - - Indicates that an object needs to be built up by the container - - - - - - Flattens a FilterInfo object into a single IEnumerable containing - the ActionFilter, ExceptionFilter, ResultFilter and - AuthorizationFilter collections - - - - - Enables you to dynamically add filters to a ControllerActionInvoker. This class will also - perform injection on all filters that are annotated with NeedsBuildUpAttribute. - - Adapted from http://blog.ploeh.dk/2009/12/01/GlobalErrorHandlingInASPNETMVC.aspx - - - - Overridden to add the new filters to the default filters - - - - - Controller factory that uses a service provider to resolve controllers - - - - - Provides an interface for identifying the current user - - The user type - - - - Returns the user currently performing actions on the site, or null - if the user cannot be identified + Disallows public access to a controller's action. This is basically a more useful version of + . When the action is accessed publicly, an + with a 404 status code is raised. diff --git a/Src/VideoGameQuotes.Api/Quote.cs b/Src/VideoGameQuotes.Api/Quote.cs index 0793e68..a127345 100644 --- a/Src/VideoGameQuotes.Api/Quote.cs +++ b/Src/VideoGameQuotes.Api/Quote.cs @@ -130,7 +130,7 @@ namespace VideoGameQuotes.Api { Game = Game.ToDto(), Created = Created, Categories = Categories.Select(category => category.ToDto()), - TotalVotes = Votes.Count(), + TotalVotes = UpVotes + DownVotes, UpVotes = UpVotes, DownVotes = DownVotes, Score = Score @@ -188,12 +188,12 @@ namespace VideoGameQuotes.Api { return years == 1 ? "1 year ago" : years + " years ago"; } - if (timespan.TotalDays >= 50) { + if (timespan.TotalDays >= 31) { var months = (int)Math.Round(timespan.TotalDays / 30); return months == 1 ? "1 month ago" : months + " months ago"; } - if (timespan.TotalDays >= 10) { + if (timespan.TotalDays >= 7) { var weeks = (int)Math.Round(timespan.TotalDays / 7); return weeks == 1 ? "1 week ago" : weeks + " weeks ago"; } @@ -202,11 +202,11 @@ namespace VideoGameQuotes.Api { return (int)timespan.TotalDays == 1 ? "1 day ago" : (int)timespan.TotalDays + " days ago"; } - if (timespan.TotalMinutes >= 90) { + if (timespan.TotalMinutes >= 60) { return (int)timespan.TotalHours == 1 ? "1 hour ago" : (int)timespan.TotalHours + " hours ago"; } - if (timespan.TotalSeconds >= 90) { + if (timespan.TotalSeconds >= 60) { return (int)timespan.TotalMinutes == 1 ? "1 minute ago" : (int)timespan.TotalMinutes + " minutes ago"; } diff --git a/Src/VideoGameQuotes.Web/Controllers/HomeController.cs b/Src/VideoGameQuotes.Web/Controllers/HomeController.cs index 6dad0be..5eace87 100644 --- a/Src/VideoGameQuotes.Web/Controllers/HomeController.cs +++ b/Src/VideoGameQuotes.Web/Controllers/HomeController.cs @@ -6,6 +6,7 @@ using System.Text; using System.Web.Mvc; using Portoa.Web; using Portoa.Web.Controllers; +using Portoa.Web.Filters; using Portoa.Web.Security; using VideoGameQuotes.Api; using VideoGameQuotes.Web.Models; @@ -53,7 +54,7 @@ namespace VideoGameQuotes.Web.Controllers { return Json(this.CreateJsonResponse()); } - [ChildActionOnly] + [PrivateAction] public ActionResult MainMenu() { var model = new MainMenuModel { User = userProvider.CurrentUser }; return PartialView("MainMenu", model); diff --git a/Src/VideoGameQuotes.Web/Controllers/QuoteController.cs b/Src/VideoGameQuotes.Web/Controllers/QuoteController.cs index ed12483..b1ffd9d 100644 --- a/Src/VideoGameQuotes.Web/Controllers/QuoteController.cs +++ b/Src/VideoGameQuotes.Web/Controllers/QuoteController.cs @@ -6,6 +6,7 @@ using Portoa.Persistence; using Portoa.Search; using Portoa.Validation.DataAnnotations; using Portoa.Web.Controllers; +using Portoa.Web.Filters; using Portoa.Web.Models; using Portoa.Web.Results; using Portoa.Web.Security; @@ -135,7 +136,7 @@ namespace VideoGameQuotes.Web.Controllers { return RedirectToAction("Quote", new { id = quote.Id, text = quote.GetUrlFriendlyText() }); } - [ChildActionOnly] + [PrivateAction] public ActionResult QuoteOfTheDay() { var today = DateTime.UtcNow.DayOfYear; var quote = quoteService.GetQuoteForDayOfYear(today); diff --git a/VideoGameQuotes.sln b/VideoGameQuotes.sln index f27059e..5645ba0 100644 --- a/VideoGameQuotes.sln +++ b/VideoGameQuotes.sln @@ -13,6 +13,47 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Src", "Src", "{C8E910E1-B84 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{236929F9-AE7D-4C78-A3D9-E0ED2EA84609}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lib", "Lib", "{4C702D70-7D2E-410D-A3C6-50598863E102}" + ProjectSection(SolutionItems) = preProject + Lib\Antlr3.Runtime.dll = Lib\Antlr3.Runtime.dll + Lib\Iesi.Collections.dll = Lib\Iesi.Collections.dll + Lib\Iesi.Collections.xml = Lib\Iesi.Collections.xml + Lib\LinFu.DynamicProxy.dll = Lib\LinFu.DynamicProxy.dll + Lib\log4net.dll = Lib\log4net.dll + Lib\log4net.xml = Lib\log4net.xml + Lib\Lucene.Net.dll = Lib\Lucene.Net.dll + Lib\Lucene.Net.xml = Lib\Lucene.Net.xml + Lib\Microsoft.Practices.Unity.Configuration.dll = Lib\Microsoft.Practices.Unity.Configuration.dll + Lib\Microsoft.Practices.Unity.Configuration.xml = Lib\Microsoft.Practices.Unity.Configuration.xml + Lib\Microsoft.Practices.Unity.dll = Lib\Microsoft.Practices.Unity.dll + Lib\Microsoft.Practices.Unity.Interception.Configuration.dll = Lib\Microsoft.Practices.Unity.Interception.Configuration.dll + Lib\Microsoft.Practices.Unity.Interception.Configuration.xml = Lib\Microsoft.Practices.Unity.Interception.Configuration.xml + Lib\Microsoft.Practices.Unity.Interception.dll = Lib\Microsoft.Practices.Unity.Interception.dll + Lib\Microsoft.Practices.Unity.Interception.xml = Lib\Microsoft.Practices.Unity.Interception.xml + Lib\Microsoft.Practices.Unity.xml = Lib\Microsoft.Practices.Unity.xml + Lib\Moq.dll = Lib\Moq.dll + Lib\Moq.xml = Lib\Moq.xml + Lib\MySql.Data.dll = Lib\MySql.Data.dll + Lib\NHibernate.ByteCode.LinFu.dll = Lib\NHibernate.ByteCode.LinFu.dll + Lib\NHibernate.ByteCode.LinFu.xml = Lib\NHibernate.ByteCode.LinFu.xml + Lib\NHibernate.dll = Lib\NHibernate.dll + Lib\NHibernate.xml = Lib\NHibernate.xml + Lib\nunit.framework.dll = Lib\nunit.framework.dll + Lib\nunit.framework.xml = Lib\nunit.framework.xml + Lib\Portoa.dll = Lib\Portoa.dll + Lib\Portoa.Log4Net.dll = Lib\Portoa.Log4Net.dll + Lib\Portoa.Log4Net.xml = Lib\Portoa.Log4Net.xml + Lib\Portoa.Lucene.dll = Lib\Portoa.Lucene.dll + Lib\Portoa.Lucene.xml = Lib\Portoa.Lucene.xml + Lib\Portoa.NHibernate.dll = Lib\Portoa.NHibernate.dll + Lib\Portoa.NHibernate.xml = Lib\Portoa.NHibernate.xml + Lib\Portoa.Web.dll = Lib\Portoa.Web.dll + Lib\Portoa.Web.xml = Lib\Portoa.Web.xml + Lib\Portoa.xml = Lib\Portoa.xml + Lib\Remotion.Data.Linq.dll = Lib\Remotion.Data.Linq.dll + Lib\UnityGenerics.dll = Lib\UnityGenerics.dll + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU