public override ViewBase Post(ControllerContext context) { User user; if (!UserService.TryAuthenticateUser(context.User, out user)) { return new StatusCodeView(HttpStatusCode.BadGateway); // TODO: return a better error code that doesn't cause forms authentication to overwrite our response } else if (!UserService.TryAuthorizeUser(user, UserRole.Admin)) { return new StatusCodeView(HttpStatusCode.Forbidden); } using (var db = DataService.Connect(true)) { FileService.PregenerateApp(); var issuesIds = db.SqlList<long>("SELECT Id FROM Issue"); foreach (var issueId in issuesIds) { IssueViewModel vm; if (QueryService.TryGetIssueWithCommentsUsingDb(issueId, db, out vm)) { vm.Location = context.ApplicationPath + vm.Id + "/"; var breadcrumbs = new BreadcrumbsViewModel(new Breadcrumb("Issues", context.ApplicationPath), new Breadcrumb("#" + vm.Id + " - " + vm.Title, vm.Location)); FileService.WriteIssue(vm, breadcrumbs); } } } return null; }
public IssueViewModel SaveIssue(ControllerContext context, Issue issue) { IssueViewModel vm = null; using (var db = DataService.Connect()) using (var tx = db.BeginTransaction()) { db.Insert(issue); issue.Id = db.GetLastInsertId(); var issueSearch = new FullTextSearchIssue() { DocId = issue.Id, Text = issue.Text, Title = issue.Title, }; db.InsertParam(issueSearch); if (QueryService.TryGetIssueWithCommentsUsingDb(issue.Id, db, out vm)) { vm.Location = context.ApplicationPath + vm.Id + "/"; var breadcrumbs = new BreadcrumbsViewModel(new Breadcrumb("Issues", context.ApplicationPath), new Breadcrumb("#" + vm.Id + " - " + vm.Title, vm.Location)); FileService.WriteIssue(vm, breadcrumbs); tx.Commit(); } } return vm; }
public static void WriteIssue(IssueViewModel issue, BreadcrumbsViewModel breadcrumbs, AppViewModel app = null) { string file = Path.Combine(ConfigService.RootPath, issue.Id.ToString() + "\\index.html"); Template template = LoadTemplate("bug.mustache"); RenderTemplateToFile(template, new { app = app ?? new AppViewModel(), breadcrumbs = breadcrumbs, issue = issue }, file); }
public IssueViewModel UpdateIssue(ControllerContext context, Issue issue, long userId, string commentText, Dictionary<string, PopulateResults.UpdatedValue> updates) { IssueViewModel vm = null; IssueComment comment = new IssueComment(); comment.IssueId = issue.Id; comment.CommentByUserId = userId; comment.CreatedAt = issue.UpdatedAt; comment.Text = commentText; foreach (var kvp in updates) { if (kvp.Key.Equals("UpdatedAt", StringComparison.OrdinalIgnoreCase)) { continue; } object oldValue = kvp.Value.FriendlyOld ?? kvp.Value.Old ?? String.Empty; object newValue = kvp.Value.FriendlyNew ?? kvp.Value.New ?? String.Empty; IssueChange change = new IssueChange(); change.Column = kvp.Value.FriendlyName ?? kvp.Key; change.Old = oldValue.ToString(); change.New = newValue.ToString(); comment.Changes.Add(change); } comment.Changes.Sort(); using (var db = DataService.Connect()) using (var tx = db.BeginTransaction()) { // If there is some sort of recognizable change. if (!String.IsNullOrEmpty(comment.Text) || comment.Changes.Count > 0) { db.UpdateOnly(issue, v => v.Update(updates.Keys.ToArray()).Where(i => i.Id == issue.Id)); if (updates.ContainsKey("Text") || updates.ContainsKey("Title")) { db.Update<FullTextSearchIssue>(new { Text = issue.Text, Title = issue.Title }, s => s.DocId == issue.Id); } db.Insert(comment); comment.Id = db.GetLastInsertId(); } if (QueryService.TryGetIssueWithCommentsUsingDb(issue.Id, db, out vm)) { vm.Location = context.ApplicationPath + vm.Id + "/"; var breadcrumbs = new BreadcrumbsViewModel(new Breadcrumb("Issues", context.ApplicationPath), new Breadcrumb("#" + vm.Id + " - " + vm.Title, vm.Location)); FileService.WriteIssue(vm, breadcrumbs); tx.Commit(); // best effort email about changes to issue. try { MailService.SendIssueComment(vm, comment.Id); } catch (Exception e) { LogManager.GetLogger("error").Error(String.Format(" failed to send update about issue #{0}, comment #{1}", issue.Id, comment.Id), e); } } } return vm; }