Api(ISession session) : base("/api") { Post["/downloaded"] = parameters => { if (!Request.Form.ApiKey.HasValue) { return new Response {StatusCode = HttpStatusCode.Unauthorized}; } if (!Request.Form.Title.HasValue) { return new Response { StatusCode = HttpStatusCode.ExpectationFailed }; } string apiKey = Request.Form.ApiKey.Value; //string title = Request.Form.Title.Value; using (var db = session.SessionFactory("")) { using (var s = db.OpenSession()) { using (s.BeginTransaction()) { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); if (apiKey != userSettings.ApiKey) { return new Response { StatusCode = HttpStatusCode.Forbidden }; } return new Response { StatusCode = HttpStatusCode.OK }; } } } }; }
public Settings(ISession session) : base("/settings") { string dbFile = ConfigurationManager.AppSettings["DBFile"]; Get["/"] = parameters => { var args = Environment.GetCommandLineArgs(); var model = new { AppPath = args[0], Args = String.Join(",", args.Skip(1).Take(args.Count())), OS = Environment.OSVersion.ToString(), Runtime = Environment.Version.ToString() }; return View["Settings/Index", model]; }; Get["/general"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); return View["Settings/General", new { userSettings.ApiKey, userSettings.C2CPreference, userSettings.SearchInterval }]; } } }; Post["/general"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); string covertocoverStr = Request.Form.C2CPreference.Value; C2CPreference covertocover; if (!Enum.TryParse(covertocoverStr, false, out covertocover)) { throw new ArgumentException("Unknown download provider {0}", covertocoverStr); } userSettings.ApiKey = Request.Form.ApiKey; userSettings.Enabled = true; userSettings.C2CPreference = covertocover; userSettings.SearchInterval = int.Parse(Request.Form.SearchInterval); s.SaveOrUpdate(userSettings); transaction.Commit(); return Response.AsRedirect("/settings/general"); } } } }; Get["/search"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var searchSettings = s.QueryOver<SearchProviderSettings>().List<SearchProviderSettings>(); if (searchSettings.Count == 0) { using (var transaction = s.BeginTransaction()) { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); var searchSettingsDefault = new SearchProviderSettings { ApiKey = "", Type = SearchProviders.NZBINDEXdotNL, Enabled = true, UserSettings = userSettings, }; transaction.Commit(); s.SaveOrUpdate(searchSettingsDefault); searchSettings.Add(searchSettingsDefault); } } return View["Settings/Search", new { Search = searchSettings, }]; } } }; Post["/search"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { if (Request.Form.id.HasValue) { int id = int.Parse(Request.Form.id.Value); var searchSettings = s.QueryOver<SearchProviderSettings>().Where(se => se.Id == id).SingleOrDefault <SearchProviderSettings>(); if (Request.Form.ApiKey.HasValue) { searchSettings.ApiKey = Request.Form.ApiKey; } if (Request.Form.Host.HasValue) { searchSettings.Host = Request.Form.Host; } if (Request.Form.Port.HasValue) { searchSettings.Port = Request.Form.Port; } if (Request.Form.Path.HasValue) { searchSettings.Path = Request.Form.Path; } searchSettings.SSL = Request.Form.SSL.HasValue; searchSettings.Enabled = Request.Form.Enabled.HasValue; s.SaveOrUpdate(searchSettings); } else { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); string typeStr = Request.Form.Type.Value; SearchProviders type; bool enabled = Request.Form.Enabled.HasValue; bool ssl = Request.Form.SSL.HasValue; string host = Request.Form.Host.Value; string port = Request.Form.Port.Value; string path = Request.Form.Path.Value; if (!Enum.TryParse(typeStr, false, out type)) { throw new ArgumentException("Unknown search provider {0}", typeStr); } var searchSettings = new SearchProviderSettings { ApiKey = Request.Form.ApiKey, Type = type, Enabled = enabled, UserSettings = userSettings, Host = host, Port = port, Path = path, SSL = ssl, }; s.SaveOrUpdate(searchSettings); } transaction.Commit(); return Response.AsRedirect("/settings/search"); } } } }; Get["/download"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { var destinationSettings = s.QueryOver<DownloadProviderSettings>().List<DownloadProviderSettings>(); if (destinationSettings.Count == 0) { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); /* var searchSettingsDefaultSave = new DownloadProviderSettings { ApiKey = "", Host = "", Port = "", Type = DownloadProviders.SaveFile, Enabled = false, Path = "./", UserSettings = userSettings, Category = "", Username = "", Password = "", }; s.SaveOrUpdate(searchSettingsDefaultSave); destinationSettings.Add(searchSettingsDefaultSave); */ var searchSettingsDefaultSABnzbd = new DownloadProviderSettings { ApiKey = "FIXME", Host = "localhost", Port = "9090", Type = DownloadProviders.SABnzbd, Enabled = false, Path = "sabnzbd", UserSettings = userSettings, Category = "books", Username = "", Password = "", }; s.SaveOrUpdate(searchSettingsDefaultSABnzbd); destinationSettings.Add(searchSettingsDefaultSABnzbd); } transaction.Commit(); return View["Settings/Download", new { Destination = destinationSettings, }]; } } } }; Post["/download"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { if (Request.Form.id.HasValue) { int id = int.Parse(Request.Form.id.Value); var destinationSettings = s.QueryOver<DownloadProviderSettings>().Where(d => d.Id == id).SingleOrDefault <DownloadProviderSettings>(); if (Request.Form.ApiKey.HasValue) { destinationSettings.ApiKey = Request.Form.ApiKey; destinationSettings.Host = Request.Form.Host; destinationSettings.Port = Request.Form.Port; destinationSettings.Enabled = Request.Form.Enabled.HasValue; destinationSettings.Path = Request.Form.Path; destinationSettings.Category = Request.Form.Category; destinationSettings.Username = Request.Form.Username; destinationSettings.Password = Request.Form.Password; } } else { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); string typeStr = Request.Form.Type; DownloadProviders type; if (!Enum.TryParse(typeStr, false, out type)) { throw new ArgumentException("Unknown download provider {0}", typeStr); } var destinationSettings = new DownloadProviderSettings { ApiKey = Request.Form.ApiKey.Value, Host = Request.Form.Host.Value, Port = Request.Form.Port.Value, Type = type, Enabled = Request.Form.Enabled.HasValue, Path = Request.Form.Path.Value, UserSettings = userSettings, Category = Request.Form.Category.Value, Username = Request.Form.Username.Value, Password = Request.Form.Password.Value, }; s.SaveOrUpdate(destinationSettings); } transaction.Commit(); return Response.AsRedirect("/settings/download"); } } } }; Get["/wizard"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>() ?? new UserSettings { ApiKey = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh".Randomise(), Enabled = false, }; s.SaveOrUpdate(userSettings); /* var destinationSettings = s.QueryOver<DownloadProviderSettings>().List<DownloadProviderSettings>(); if (destinationSettings.Count == 0) { var searchSettingsDefaultSABnzbd = new DownloadProviderSettings { ApiKey = "FIXME", Host = "localhost", Port = "9090", Type = DownloadProviders.SABnzbd, Enabled = false, Path = "sabnzbd", UserSettings = userSettings, Category = "books", Username = "", Password = "", }; s.SaveOrUpdate(searchSettingsDefaultSABnzbd); destinationSettings.Add(searchSettingsDefaultSABnzbd); } var searchSettings = s.QueryOver<SearchProviderSettings>().List<SearchProviderSettings>(); if (searchSettings.Count == 0) { var searchSettingsDefault = new SearchProviderSettings { ApiKey = "", Type = SearchProviders.NZBINDEXdotNL, Enabled = true, UserSettings = userSettings }; s.SaveOrUpdate(searchSettingsDefault); searchSettings.Add(searchSettingsDefault); } */ transaction.Commit(); return View["Settings/Wizard", new { //Search = searchSettings, //Destination = destinationSettings, userSettings.ApiKey, }]; } } } }; Post["/wizard"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { string covertocoverStr = Request.Form.C2CPreference.Value; C2CPreference covertocover; if (!Enum.TryParse(covertocoverStr, false, out covertocover)) { throw new ArgumentException("Unknown download provider {0}", covertocoverStr); } var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); userSettings.ApiKey = Request.Form.AppApiKey; userSettings.Enabled = true; userSettings.C2CPreference = covertocover; userSettings.SearchInterval = int.Parse(Request.Form.SearchInterval); s.SaveOrUpdate(userSettings); ScheduleUpdater.AddReleaseURL(int.Parse(Request.Form.Weeks)); string downloadTypeStr = Request.Form.DownloadType.Value; DownloadProviders downloadType; if (!Enum.TryParse(downloadTypeStr, false, out downloadType)) { throw new ArgumentException("Unknown download provider {0}", downloadTypeStr); } var destinationSettings = new DownloadProviderSettings { ApiKey = Request.Form.DownloadApiKey, Host = Request.Form.DownloadHost, Port = Request.Form.DownloadPort, Type = downloadType, Enabled = Request.Form.DownloadEnabled.HasValue, Path = Request.Form.DownloadPath, UserSettings = userSettings, Category = Request.Form.DownloadCategory, Username = Request.Form.DownloadUsername, Password = Request.Form.DownloadPassword, }; s.SaveOrUpdate(destinationSettings); string searchTypeStr = Request.Form.SearchType.Value; SearchProviders searchType; if (!Enum.TryParse(searchTypeStr, false, out searchType)) { throw new ArgumentException("Unknown search provider {0}", searchTypeStr); } var searchSettings = new SearchProviderSettings { ApiKey = Request.Form.SearchApiKey, Type = searchType, Enabled = Request.Form.SearchEnabled.HasValue, UserSettings = userSettings, Host = Request.Form.SearchHost, Port = Request.Form.SearchPort, Path = Request.Form.SearchPath, SSL = Request.Form.SearchSSL.HasValue, }; s.SaveOrUpdate(searchSettings); transaction.Commit(); return Response.AsRedirect("/"); } } } }; }
public Publishers(ISession session) : base("/publishers") { Get["/"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var publishers = s.QueryOver<Publisher>().OrderBy(p => p.Name).Asc.List<Publisher>(); IList list = new ArrayList(); foreach (var publisher in publishers) { list.Add(new {publisher.Id, publisher.Name, Titles = publisher.Titles.Count}); } return View["Publishers/Index", new {Publishers = list}]; } } }; Get["/titles"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var titles = s.QueryOver<Title>().Where(t => t.Subscribed == false).OrderBy(t => t.Publisher).Asc.ThenBy(t => t.Name).Asc.List<Title>(); IList list = new ArrayList(); foreach (var title in titles) { list.Add(new { LatestNum = title.LatestIssue().Num, Latest = title.LatestIssue().Release.Date.NiceDate(), title.Limited, title.Subscribed, title.Name, title.Id, Publisher = new { title.Publisher.Name, title.Publisher.Id }, }); } var model = new { titles = list }; return View["Publishers/Titles", model]; } } }; Post["/titles"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { string titles = Request.Form.title; var titlelist = titles.Split(','); foreach (var t in titlelist) { int titleid = int.Parse(t); var title = s.QueryOver<Title>().Where(ti => ti.Id == titleid).SingleOrDefault<Title>(); if (title != null) { title.Subscribed = true; foreach (var i in title.Issues) { if (i.Status == IssueStatus.New) { i.Status = IssueStatus.Wanted; s.SaveOrUpdate(i); } } } s.SaveOrUpdate(title); } transaction.Commit(); return Response.AsRedirect("/"); } } } }; Get["/single/{id}"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { int id = int.Parse(parameters.id); var publisher = s.QueryOver<Publisher>().Where(p => p.Id == id).SingleOrDefault<Publisher>(); IList list = new ArrayList(); foreach (var title in publisher.Titles.OrderBy(t => t.Name)) { list.Add( new { title.Id, title.Name, title.Limited, Have = title.Have(), Total = title.Total(), title.Mature, title.OneShot, title.GraphicNovel, title.HardCover, Latest = title.LatestIssue().Release.Date.NiceDate(), }); } var model = new { Titles = list, Publisher = new { publisher.Id, publisher.Name, } }; return View["Publishers/Single", model]; } } }; }
public Titles(ISession session) : base("/titles") { string dbFile = ConfigurationManager.AppSettings["DBFile"]; Get["/"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var titles = s.QueryOver<Title>().Where(t => t.Subscribed == false).OrderBy(t => t.Name).Asc.List<Title>(); IList list = new ArrayList(); foreach (var title in titles) { list.Add(new { LatestNum = title.LatestIssue().Num, Latest = title.LatestIssue().Release.Date.NiceDate(), title.Limited, title.Subscribed, title.Name, title.Id, Publisher = new { title.Publisher.Name, title.Publisher.Id }, }); } var model = new { titles = list }; return View["Titles/Index", model]; } } }; Post["/"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { string titles = Request.Form.title; var titlelist = titles.Split(','); foreach (var t in titlelist) { int titleid = int.Parse(t); var title = s.QueryOver<Title>().Where(ti => ti.Id == titleid).SingleOrDefault<Title>(); if (title != null) { title.Subscribed = true; foreach (var i in title.Issues) { if (i.Status == IssueStatus.New) { i.Status = IssueStatus.Wanted; s.SaveOrUpdate(i); } } } s.SaveOrUpdate(title); } transaction.Commit(); return Response.AsRedirect("/"); } } } }; Get["/search"] = parameters => { return View["Titles/Search", new { Count = 0, Results = new ArrayList(), SearchTerm = "" }]; }; Post["/search"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { string search = Request.Form.search; var titles = s.QueryOver<Title>().Where(t => t.Name.IsInsensitiveLike(search, MatchMode.Anywhere)).OrderBy(t => t.Name).Asc.List<Title>(); IList results = new ArrayList(); foreach (var title in titles) { results.Add(new { title.Limited, title.Subscribed, title.Name, title.Id, Publisher = new {title.Publisher.Name, title.Publisher.Id} }); } return View["Titles/Search", new { Results = results, SearchTerm = search }]; } } }; Get["/single/{id}"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { int id = int.Parse(parameters.id); var title = s.QueryOver<Title>().Where(t => t.Id == id).SingleOrDefault<Title>(); IList list = new ArrayList(); foreach (var issue in title.Issues.OrderBy(i => i.Num).Reverse()) { list.Add(new { issue.Id, issue.Num, issue.Status, issue.Variant, issue.Code, Released = issue.Release.Date.NiceDate() }); } var model = new { issues = list, Title = new { title.Limited, title.Id, title.Name, Have = title.Have(), Total = title.Total(), title.Mature, title.SearchTitle, title.SearchYear, title.OneShot, title.GraphicNovel, title.HardCover, Latest = title.LatestIssue().Release.Date.NiceDate(), title.Subscribed, MatchTitle = title.MatchTitle.ToString(), Publisher = new { title.Publisher.Name, title.Publisher.Id } } }; return View["Titles/Single", model]; } } }; Post["/single/{id}"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { int titleid = int.Parse(Request.Form.titleid); if (Request.Form.issue.HasValue && Request.Form.Status.HasValue) { string statusStr = Request.Form.Status; string issues = Request.Form.issue; IssueStatus status; if (!Enum.TryParse(statusStr, false, out status)) { throw new ArgumentException("Unknown issue status {0}", statusStr); } var issuelist = issues.Split(','); foreach (var idstr in issuelist) { var id = int.Parse(idstr); var issue = s.QueryOver<Issue>().Where(i => i.Id == id).SingleOrDefault<Issue>(); if (issue.Status != status) { issue.Status = status; s.SaveOrUpdate(issue); } } } if (Request.Form.MatchTitle.HasValue) { string matchTitleStr = Request.Form.MatchTitle; bool subscribed = Request.Form.Subscribed.HasValue; MatchTitle matchTitle; if (!Enum.TryParse(matchTitleStr, false, out matchTitle)) { throw new ArgumentException("Unknown title match {0}", matchTitleStr); } var title = s.QueryOver<Title>().Where(i => i.Id == titleid).SingleOrDefault<Title>(); if (subscribed) { foreach (var issue in title.Issues.Where(i => i.Status == IssueStatus.New).ToList()) { issue.Status = IssueStatus.Skipped; s.SaveOrUpdate(issue); } } title.Subscribed = subscribed; title.MatchTitle = matchTitle; s.SaveOrUpdate(title); } if (Request.Form.SearchTitle.HasValue) { string searchTitle = Request.Form.SearchTitle; var title = s.QueryOver<Title>().Where(i => i.Id == titleid).SingleOrDefault<Title>(); title.SearchTitle = searchTitle; title.SearchYear = Request.Form.SearchYear.HasValue; s.SaveOrUpdate(title); } if (Request.Form.Action.HasValue) { if (Request.Form.Action.Value == "force-search") { var title = s.QueryOver<Title>().Where(i => i.Id == titleid).SingleOrDefault<Title>(); title.LastSearch = DateTime.MinValue; s.SaveOrUpdate(title); } } transaction.Commit(); return Response.AsRedirect(string.Format("/titles/single/{0}", titleid)); } } } }; }
public bool Insert(ISession session) { using (var db = session.SessionFactory("test")) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { var publisher = s.QueryOver<Publisher>().Where(p => p.Name == Publisher).SingleOrDefault<Publisher>(); if (publisher == null) { publisher = new Publisher {Name = Publisher}; s.SaveOrUpdate(publisher); } var release = s.QueryOver<Release>().Where(r => r.Date == Released).SingleOrDefault<Release>(); if (release == null) { release = new Release {Created = DateTime.Now, Date = Released}; s.SaveOrUpdate(release); } var title = s.QueryOver<Title>().Where( t => t.Name == Name && t.Publisher == publisher && t.Limited == Limited).SingleOrDefault(); if (title == null) { title = new Title { Name = Name, SearchTitle = Name, GraphicNovel = GraphicNovel, HardCover = HardCover, Hidden = false, Limited = Limited, Mature = Mature, OneShot = OneShot, Publisher = publisher }; s.SaveOrUpdate(title); } var issue = s.QueryOver<Issue>().Where(i => i.Code == Code).SingleOrDefault<Issue>(); if (issue == null) { var status = IssueStatus.New; if (title.Subscribed) { status = IssueStatus.Wanted; } issue = new Issue { Code = Code, Num = Num, Title = title, Release = release, Status = status, Variant = Variant }; s.SaveOrUpdate(issue); } transaction.Commit(); } } } return true; }
public Main(ISession session) { string dbFile = ConfigurationManager.AppSettings["DBFile"]; Get["/"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); if (userSettings == null || !userSettings.IsConfigured()) { return Response.AsRedirect("/settings/wizard"); } var titles = s.QueryOver<Title>().Where(t => t.Subscribed).OrderBy(t => t.Name).Asc.List<Title>(); IList list = new ArrayList(); foreach (var title in titles) { list.Add(new { Latest = title.LatestIssue().Release.Date.NiceDate(), title.Limited, title.Subscribed, title.Name, title.Id, Publisher = new {title.Publisher.Name, title.Publisher.Id }, Have = title.Have(), Total = title.Total()}); } var model = new { titles = list }; return View["Index", model]; } } }; Get["/add"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var userSettings = s.QueryOver<UserSettings>().SingleOrDefault<UserSettings>(); if (userSettings == null || !userSettings.IsConfigured()) { return Response.AsRedirect("/settings/wizard"); } var titles = s.QueryOver<Title>().Where(t => t.Subscribed == false).OrderBy(t => t.Name).Asc.List<Title>(); var list = new List<string>(); foreach (var title in titles) { list.Add(title.Name); } var serialiser = new JavaScriptSerializer(); var model = new { titles = serialiser.Serialize(list) }; return View["Add", model]; } } }; Post["/add"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { string titleName = Request.Form.TitleName; string matchTitleStr = Request.Form.MatchTitle; string issueStatusStr = Request.Form.IssueStatus; MatchTitle matchTitle; IssueStatus issueStatus; if (!Enum.TryParse(matchTitleStr, false, out matchTitle)) { throw new ArgumentException("Unknown match title {0}", matchTitleStr); } if (!Enum.TryParse(issueStatusStr, false, out issueStatus)) { throw new ArgumentException("Unknown match title {0}", matchTitleStr); } var title = s.QueryOver<Title>().Where(ti => ti.Name == titleName).SingleOrDefault<Title>(); if (title != null) { title.Subscribed = true; title.MatchTitle = matchTitle; foreach (var i in title.Issues) { if (i.Status == IssueStatus.New) { i.Status = issueStatus; s.SaveOrUpdate(i); } } s.SaveOrUpdate(title); transaction.Commit(); } return Response.AsRedirect("/"); } } } }; }
public Releases(ISession session) : base("/releases") { string dbFile = ConfigurationManager.AppSettings["DBFile"]; Get["/"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var issues = s.QueryOver<Issue>().Where(i => i.Status == IssueStatus.Wanted).OrderBy(i => i.Release).Asc.List<Issue>(); IList list = new ArrayList(); foreach (var issue in issues) { list.Add(new {issue.Id, issue.Num, Released = issue.Release.Date.NiceDate(), Title = new {issue.Title.Id, issue.Title.Name}, Publisher = new {issue.Title.Publisher.Name, issue.Title.Publisher.Id}}); } return View["Releases/Index", new {Pending = list}]; } } }; Get["/history"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { var releases = s.QueryOver<Release>().OrderBy(r => r.Date).Desc.List<Release>(); IList list = new ArrayList(); foreach (var release in releases) { list.Add(new { release.Id, Grabbed = release.Created.NiceDate(), Released = release.Date.NiceDate(), Issues = release.Issues.Count }); } return View["Releases/History", new { Releases = list }]; } } }; Get["/upload"] = parameters => { return View["Releases/Upload"]; }; Post["/upload"] = parameters => { string weeks = Request.Form.Weeks.Value; string url = Request.Form.Url.Value; if (weeks.Length > 0) { ScheduleUpdater.AddReleaseURL(int.Parse(weeks)); } if (url.Length > 0) { ScheduleUpdater.AddReleaseURL(new Uri(url)); } return View["Releases/Upload"]; }; Get["/single/{id}"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { int id = int.Parse(parameters.id); //var issues = s.QueryOver<Issue>().Where(i => i.Release.Id == id).OrderBy(i => i.Title.Name).Asc.List<Issue>(); var release = s.QueryOver<Release>().Where(i => i.Id == id).SingleOrDefault<Release>(); IList list = new ArrayList(); var issues = release.Issues.OrderBy(i => i.Title.Name).ThenBy(i => i.Num).ThenBy(i => i.Variant.Length); foreach (var issue in issues) { list.Add(new { issue.Id, issue.Num, issue.Status, issue.Variant, issue.Code, Title = new { issue.Title.Id, issue.Title.Name, Publisher = new { issue.Title.Publisher.Name, issue.Title.Publisher.Id } } }); } var model = new { Issues = list, Release = release }; return View["Releases/Single", model]; } } }; Post["/single/{id}"] = parameters => { using (var db = session.SessionFactory(dbFile)) { using (var s = db.OpenSession()) { using (var transaction = s.BeginTransaction()) { string statusStr = Request.Form.Status; string titleid = Request.Form.titleid; IssueStatus status; if (!Enum.TryParse(statusStr, false, out status)) { throw new ArgumentException("Unknown issue status {0}", statusStr); } string issues = Request.Form.issue; var issuelist = issues.Split(','); foreach (var idstr in issuelist) { var id = int.Parse(idstr); var issue = s.QueryOver<Issue>().Where(i => i.Id == id).SingleOrDefault<Issue>(); if (issue.Status != status) { issue.Status = status; s.SaveOrUpdate(issue); } } transaction.Commit(); return Response.AsRedirect(string.Format("/titles/single/{0}", titleid)); } } } }; }