using System; using System.Collections.Generic; using System.Linq; using Iesi.Collections.Generic; using JetBrains.Annotations; using Portoa.Persistence; namespace VideoGameQuotes.Api { public class Game : Entity, IDtoMappable { private readonly Iesi.Collections.Generic.ISet systems = new HashedSet(); private readonly Iesi.Collections.Generic.ISet publishers = new HashedSet(); public Game() { Created = DateTime.UtcNow; } public virtual string Website { get; set; } public virtual User Creator { get; set; } public virtual DateTime Created { get; set; } public virtual IEnumerable Systems { get { return systems; } } public virtual string Name { get; set; } public virtual IEnumerable Publishers { get { return publishers; } } [CanBeNull] public virtual byte[] Screenshot { get; set; } public virtual Region Region { get; set; } #region adding and removing stuff public virtual Game AddSystem(GamingSystem system) { systems.Add(system); return this; } public virtual void ClearSystems() { systems.Clear(); } public virtual Game AddPublisher(Publisher publisher) { publishers.Add(publisher); return this; } public virtual void ClearPublishers() { publishers.Clear(); } #endregion public virtual GameDto ToDto() { return new GameDto { Id = Id, Website = Website, Created = Created, Systems = Systems.Select(system => system.ToDto()), Name = Name, Region = Region, Publishers = Publishers.Select(publisher => publisher.ToDto()) }; } #region criterion handlers public sealed class SystemCriterionHandler : CriterionHandler { protected override Func HandleInteger(int value) { return game => game.Systems.Any(system => system.Id == value); } protected override Func HandleString(string value) { return game => game.Systems.Any(system => system.Name == value); } } public sealed class PublisherCriterionHandler : CriterionHandler { protected override Func HandleInteger(int value) { return game => game.Publishers.Any(publisher => publisher.Id == value); } protected override Func HandleString(string value) { return game => game.Publishers.Any(publisher => publisher.Name == value); } } #endregion } public class GameDto { public int Id { get; set; } public string Website { get; set; } public DateTime Created { get; set; } public IEnumerable Systems { get; set; } public string Name { get; set; } public IEnumerable Publishers { get; set; } public Region Region { get; set; } } }