/// <summary> /// Handles the Click event of the cmdAddComment control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void CmdAddCommentClick(object sender, EventArgs e) { if (CommentHtmlEditor.Text.Trim().Length == 0) return; var comment = new IssueComment { IssueId = IssueId, Comment = CommentHtmlEditor.Text.Trim(), CreatorUserName = Security.GetUserName(), DateCreated = DateTime.Now }; IssueCommentManager.SaveOrUpdate(comment); CommentHtmlEditor.Text = String.Empty; BindComments(); }
/// <summary> /// Saves this instance. /// </summary> /// <returns></returns> public static bool SaveOrUpdate(IssueComment entity) { if (entity == null) throw new ArgumentNullException("entity"); if (entity.IssueId <= Globals.NEW_ID) throw (new ArgumentException("Cannot save issue comment, the issue id is invalid")); if (string.IsNullOrEmpty(entity.Comment)) throw (new ArgumentException("The issue comment cannot be empty or null")); if (entity.Id > Globals.NEW_ID) return DataProviderManager.Provider.UpdateIssueComment(entity); var tempId = DataProviderManager.Provider.CreateNewIssueComment(entity); if (tempId <= Globals.NEW_ID) return false; entity.Id = tempId; IssueNotificationManager.SendNewIssueCommentNotification(entity.IssueId, GetById(entity.Id)); return true; }
/// <summary> /// Updates the issue comment. /// </summary> /// <param name="issueCommentToUpdate">The issue comment to update.</param> /// <returns></returns> public override bool UpdateIssueComment(IssueComment issueCommentToUpdate) { // Validate Parameters if (issueCommentToUpdate == null) throw (new ArgumentNullException("issueCommentToUpdate")); try { using (var sqlCmd = new SqlCommand()) { AddParamToSqlCmd(sqlCmd, "@ReturnValue", SqlDbType.Int, 0, ParameterDirection.ReturnValue, null); AddParamToSqlCmd(sqlCmd, "@IssueCommentId", SqlDbType.Int, 0, ParameterDirection.Input, issueCommentToUpdate.Id); AddParamToSqlCmd(sqlCmd, "@IssueId", SqlDbType.Int, 0, ParameterDirection.Input, issueCommentToUpdate.IssueId); AddParamToSqlCmd(sqlCmd, "@CreatorUserName", SqlDbType.NVarChar, 255, ParameterDirection.Input, issueCommentToUpdate.CreatorUserName); AddParamToSqlCmd(sqlCmd, "@Comment", SqlDbType.NText, 0, ParameterDirection.Input, issueCommentToUpdate.Comment); SetCommandType(sqlCmd, CommandType.StoredProcedure, SP_ISSUECOMMENT_UPDATE); ExecuteScalarCmd(sqlCmd); var returnValue = (int)sqlCmd.Parameters["@ReturnValue"].Value; return (returnValue == 0); } } catch (Exception ex) { throw ProcessException(ex); } }
/// <summary> /// Creates the new issue comment. /// </summary> /// <param name="newComment">The new comment.</param> /// <returns></returns> public override int CreateNewIssueComment(IssueComment newComment) { // Validate Parameters if (newComment == null) throw (new ArgumentNullException("newComment")); using (var sqlCmd = new SqlCommand()) { AddParamToSqlCmd(sqlCmd, "@ReturnValue", SqlDbType.Int, 0, ParameterDirection.ReturnValue, null); AddParamToSqlCmd(sqlCmd, "@IssueId", SqlDbType.Int, 0, ParameterDirection.Input, newComment.IssueId); AddParamToSqlCmd(sqlCmd, "@CreatorUserName", SqlDbType.NVarChar, 255, ParameterDirection.Input, newComment.CreatorUserName); AddParamToSqlCmd(sqlCmd, "@Comment", SqlDbType.NText, 0, ParameterDirection.Input, newComment.Comment); SetCommandType(sqlCmd, CommandType.StoredProcedure, SP_ISSUECOMMENT_CREATE); ExecuteScalarCmd(sqlCmd); return ((int)sqlCmd.Parameters["@ReturnValue"].Value); } }
public abstract bool UpdateIssueComment(IssueComment issueCommentToUpdate);
// IssueComments public abstract int CreateNewIssueComment(IssueComment newComment);
private bool ProcessNewComment(List<string> recipients, POP3_ClientMessage message, Mail_Message mailHeader, MailboxReaderResult result) { string messageFrom = string.Empty; if (mailHeader.From.Count > 0) { messageFrom = string.Join("; ", mailHeader.From.ToList().Select(p => p.Address).ToArray()).Trim(); } bool processed = false; foreach (var address in recipients) { Regex isReply = new Regex(@"(.*)(\+iid-)(\d+)@(.*)"); Match commentMatch = isReply.Match(address); if (commentMatch.Success && commentMatch.Groups.Count >= 4) { // we are in a reply and group 4 must contain the id of the original issue int issueId; if (int.TryParse(commentMatch.Groups[3].Value, out issueId)) { var _currentIssue = IssueManager.GetById(issueId); if (_currentIssue != null) { var project = ProjectManager.GetById(_currentIssue.ProjectId); var mailbody = Mail_Message.ParseFromByte(message.MessageToByte()); bool isHtml; List<MIME_Entity> attachments = null; string content = GetMessageContent(mailbody, project, out isHtml, ref attachments); IssueComment comment = new IssueComment { IssueId = issueId, Comment = content, DateCreated = mailHeader.Date }; // try to find if the creator is valid user in the project, otherwise take // the user defined in the mailbox config var users = UserManager.GetUsersByProjectId(project.Id); var emails = messageFrom.Split(';').Select(e => e.Trim().ToLower()); var user = users.Find(x => emails.Contains(x.Email.ToLower())); if (user != null) { comment.CreatorUserName = user.UserName; } else { // user not found continue; } var saved = IssueCommentManager.SaveOrUpdate(comment); if (saved) { //add history record var history = new IssueHistory { IssueId = issueId, CreatedUserName = comment.CreatorUserName, DateChanged = comment.DateCreated, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Comment", "Comment"), OldValue = string.Empty, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Added", "Added"), TriggerLastUpdateChange = true }; IssueHistoryManager.SaveOrUpdate(history); var projectFolderPath = Path.Combine(Config.UploadsFolderPath, project.UploadPath); // save attachments as new files int attachmentsSavedCount = 1; foreach (MIME_Entity mimeEntity in attachments) { string fileName; var contentType = mimeEntity.ContentType.Type.ToLower(); var attachment = new IssueAttachment { Id = 0, Description = "File attached by mailbox reader", DateCreated = DateTime.Now, ContentType = mimeEntity.ContentType.TypeWithSubtype, CreatorDisplayName = user.DisplayName, CreatorUserName = user.UserName, IssueId = issueId, ProjectFolderPath = projectFolderPath }; attachment.Attachment = ((MIME_b_SinglepartBase)mimeEntity.Body).Data; if (contentType.Equals("attachment")) // this is an attached email { fileName = mimeEntity.ContentDisposition.Param_FileName; } else if (contentType.Equals("message")) // message has no filename so we create one { fileName = string.Format("Attached_Message_{0}.eml", attachmentsSavedCount); } else { fileName = string.IsNullOrWhiteSpace(mimeEntity.ContentType.Param_Name) ? string.Format("untitled.{0}", mimeEntity.ContentType.SubType) : mimeEntity.ContentType.Param_Name; } attachment.FileName = fileName; var saveFile = IsAllowedFileExtension(fileName); var fileSaved = false; // can we save the file? if (saveFile) { fileSaved = IssueAttachmentManager.SaveOrUpdate(attachment); if (fileSaved) { attachmentsSavedCount++; } else { LogWarning("MailboxReader: Attachment could not be saved, please see previous logs"); } } } processed = true; // add the entry if the save did not throw any exceptions result.MailboxEntries.Add(new MailboxEntry()); } } } } } return processed; }
/// <summary> /// Sends the new issue comment notification. /// </summary> /// <param name="issueId">The issue id.</param> /// <param name="newComment">The new comment.</param> public static void SendNewIssueCommentNotification(int issueId, IssueComment newComment) { if (issueId <= Globals.NEW_ID) throw (new ArgumentOutOfRangeException("issueId")); if (newComment == null) throw new ArgumentNullException("newComment"); // TODO - create this via dependency injection at some point. IMailDeliveryService mailService = new SmtpMailDeliveryService(); var issue = DataProviderManager.Provider.GetIssueById(issueId); var issNotifications = DataProviderManager.Provider.GetIssueNotificationsByIssueId(issueId); var emailFormatType = HostSettingManager.Get(HostSettingNames.SMTPEMailFormat, EmailFormatType.Text); // data for template var data = new Dictionary<string, object> { { "Issue", issue }, { "Comment", newComment } }; var displayname = UserManager.GetUserDisplayName(newComment.CreatorUserName); var templateCache = new List<CultureNotificationContent>(); var emailFormatKey = (emailFormatType == EmailFormatType.Text) ? "" : "HTML"; const string subjectKey = "NewIssueCommentSubject"; var bodyKey = string.Concat("NewIssueComment", emailFormatKey); // get a list of distinct cultures var distinctCultures = (from c in issNotifications select c.NotificationCulture ).Distinct().ToList(); // populate the template cache of the cultures needed foreach (var culture in from culture in distinctCultures let notificationContent = templateCache.FirstOrDefault(p => p.CultureString == culture) where notificationContent == null select culture) { templateCache.Add(new CultureNotificationContent().LoadContent(culture, subjectKey, bodyKey)); } foreach (var notification in issNotifications) { var nc = templateCache.First(p => p.CultureString == notification.NotificationCulture); var emailSubject = nc.CultureContents .First(p => p.ContentKey == subjectKey) .FormatContent(issue.FullId, displayname); var bodyContent = nc.CultureContents .First(p => p.ContentKey == bodyKey) .TransformContent(data); try { //send notifications to everyone except who changed it. if (notification.NotificationUsername.ToLower() == newComment.CreatorUserName.ToLower()) continue; var user = UserManager.GetUser(notification.NotificationUsername); // skip to the next user if this user is not approved if (!user.IsApproved) continue; // skip to next user if this user doesn't have notifications enabled. if (!new WebProfile().GetProfile(user.UserName).ReceiveEmailNotifications) continue; var message = new MailMessage { Subject = emailSubject, Body = bodyContent, IsBodyHtml = true }; mailService.Send(user.Email, message, issueId); } catch (Exception ex) { ProcessException(ex); } } }
/// <summary> /// Handles the Click event of the cmdAddComment control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void CmdAddCommentClick(object sender, EventArgs e) { if (CommentHtmlEditor.Text.Trim().Length == 0) return; var comment = new IssueComment { IssueId = IssueId, Comment = CommentHtmlEditor.Text.Trim(), CreatorUserName = Security.GetUserName(), DateCreated = DateTime.Now }; var result = IssueCommentManager.SaveOrUpdate(comment); if(result) { //add history record var history = new IssueHistory { IssueId = IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Comment", "Comment"), OldValue = string.Empty, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Added", "Added"), TriggerLastUpdateChange = true }; IssueHistoryManager.SaveOrUpdate(history); } CommentHtmlEditor.Text = String.Empty; BindComments(); }
/// <summary> /// Sends the new issue comment notification. /// </summary> /// <param name="issueId">The issue id.</param> /// <param name="newComment">The new comment.</param> public static void SendNewIssueCommentNotification(int issueId, IssueComment newComment) { if (issueId <= Globals.NEW_ID) throw (new ArgumentOutOfRangeException("issueId")); if (newComment == null) throw new ArgumentNullException("newComment"); var issue = DataProviderManager.Provider.GetIssueById(issueId); var issNotifications = DataProviderManager.Provider.GetIssueNotificationsByIssueId(issueId); var emailFormatType = HostSettingManager.Get(HostSettingNames.SMTPEMailFormat, EmailFormatType.Text); //load template var template = NotificationManager.Instance.LoadEmailNotificationTemplate("NewIssueComment", emailFormatType); var data = new Dictionary<string, object> {{"Issue", issue}, {"Comment", newComment}}; template = NotificationManager.GenerateNotificationContent(template, data); var subject = NotificationManager.Instance.LoadNotificationTemplate("NewIssueCommentSubject"); var displayname = UserManager.GetUserDisplayName(Security.GetUserName()); foreach (var notify in issNotifications) { try { var context = new NotificationContext { BodyText = template, EmailFormatType = emailFormatType, Subject = String.Format(subject, issue.FullId, displayname), UserDisplayName = UserManager.GetUserDisplayName(notify.NotificationUsername), Username = notify.NotificationUsername }; NotificationManager.Instance.SendNotification(context); } catch (Exception ex) { ProcessException(ex); } } }