/// <summary> /// Populate a stnadard sentItem model from database into a Postcard object /// </summary> /// <param name="sentItem"></param> /// <returns></returns> private PostCard PopulatePostCardItem(SentItem sentItem) { var postcard = new PostCard(); postcard.FrontHtml = sentItem.FrontHtml; postcard.BackHtml = sentItem.BackHtml; postcard.ToAddress = this.GetAddressFromRecipientProfile(sentItem.RecipientProfile); postcard.FromAddress = this.GetAddressFromRecipientProfile(sentItem.FromRecipient); return(postcard); }
/// <summary> /// Transfer a sentItem model from database to a standard letter /// </summary> /// <param name="sentItem"></param> /// <returns></returns> private Letter PopulateLetterItem(SentItem sentItem) { var letter = new Letter(); letter.FrontHtml = sentItem.FrontHtml; letter.BackHtml = sentItem.BackHtml; letter.ToAddress = this.GetAddressFromRecipientProfile(sentItem.RecipientProfile); letter.FromAddress = this.GetAddressFromRecipientProfile(sentItem.FromRecipient); return(letter); }
/// <summary> /// Handle the populating of database model object to the relevant PostCard, Letter model for processing /// </summary> /// <param name="sentItem"></param> /// <returns></returns> private IPostItem PopulateSendItem(SentItem sentItem) { switch (sentItem.ItemTypeId) { case ItemType.PostCard: return(PopulatePostCardItem(sentItem)); case ItemType.Letter: return(PopulateLetterItem(sentItem)); default: throw new UnsupportedPostItemException(); } }
/// <summary> /// Method to send an item and control the state /// </summary> /// <param name="sentItem"></param> private void SendItem(SentItem sentItem) { // Get the service necessary for the given country IPostService postService = this.GetServiceForCountry(sentItem.RecipientProfile.CountryId); // populate the item into a sendItem IPostItem postItem = this.PopulateSendItem(sentItem); // Validate the item can be sent string outputMessage; if (postService.ValidatePostItem(postItem, out outputMessage)) { // Update to sending item status to SendingMail using (var db = new PostessDB()) using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead })) { var sentItemDB = db.SentItems.Find(sentItem.Id); // Do not attempt to send if the item is not in a default state if (sentItemDB.SentItemStateId == SentItemState.SendingMail || sentItemDB.SentItemStateId == SentItemState.MailSent || sentItemDB.SentItemStateId == SentItemState.MailSendingError ) { return; } sentItemDB.SentItemStateId = SentItemState.SendingMail; db.SaveChanges(); } try { postService.SendPost(postItem); } catch (Exception e) { // Update sending item status to MailSendingError using (var db = new PostessDB()) { // Mail sending error var sentItemDB = db.SentItems.Find(sentItem.Id); sentItemDB.SentItemStateId = SentItemState.MailSendingError; db.SaveChanges(); } } // Update sending item status to SendingSuccess using (var db = new PostessDB()) { var sentItemDB = db.SentItems.Find(sentItem.Id); sentItemDB.SentItemStateId = SentItemState.MailSent; db.SaveChanges(); } } else { // Process that this item could not be sent because of outputMessage } }