public ActionResult BulkRequestValuation(BulkRequestValuationViewModel model) { if (model.File == null) { return(View(model)); } try { var invited = 0; var notInvited = new List <NotInvitedViewModel>(); var errorWhenInvited = new List <ErrorInvitedViewModel>(); var data = _bulkImporter.Execute(model.File.InputStream); Logger.Info("Sending bulk validation requests..."); var emails = (from a in data where !string.IsNullOrWhiteSpace(a.ISSN) && !string.IsNullOrWhiteSpace(a.AuthorEmail) && EmailValidator.IsValid(a.AuthorEmail) let journal = journalRepository.FindByIssn(a.ISSN) where journal != null select new RequestValuationViewModel { JournalId = journal.Id, JournalTitle = journal.Title, JournalISSN = journal.ISSN, EmailFrom = "*****@*****.**", EmailTo = a.AuthorEmail, RecipientName = a.AuthorName, EmailBody = $"Dear {a.AuthorName},\r\n\r\n{model.EmailBody.Replace("<<JournalTitle>>", journal.Title)}\r\n\r\n-----------\r\n\r\nYou are being invited by: {model.EmailFrom}", EmailSubject = model.EmailSubject.Replace("<<JournalTitle>>", journal.Title).Replace("<<JournalISSN>>", journal.ISSN), IsKnownEmailAddress = IsKnownEmailAddress(a.AuthorEmail), HasKnownEmailDomain = HasKnownEmailDomain(a.AuthorEmail) }).ToList(); foreach (var item in emails.Select(e => new { Email = e.ToRequestValuationEmail(), Model = e })) { // NOTE: Requirements have changed. Leo Waaijers requested that e-mail addresses with unknown domains could be invited to fill in a Score Card - Sergi Papaseit (2015-12-10) try { item.Email.Url = FillEmailUrl(item.Model); item.Email.Send(); Logger.Info($"Sent validation request to {item.Email.To}."); invited++; } catch (Exception ex) { Logger.Error($"Error sending validation request to {item.Email.To}: {ex}.", ex); errorWhenInvited.Add(new ErrorInvitedViewModel { ISSN = string.IsNullOrWhiteSpace(item.Model.JournalISSN) ? "Unknown" : item.Model.JournalISSN, AuthorName = item.Model.RecipientName, AuthorEmail = string.IsNullOrWhiteSpace(item.Model.EmailTo) ? "Unknown" : item.Model.EmailTo }); } } notInvited.AddRange( from a in data where string.IsNullOrWhiteSpace(a.ISSN) || string.IsNullOrWhiteSpace(a.AuthorEmail) || !EmailValidator.IsValid(a.AuthorEmail) select new NotInvitedViewModel { ISSN = string.IsNullOrWhiteSpace(a.ISSN) ? "Unknown" : a.ISSN, AuthorName = a.AuthorName, AuthorEmail = string.IsNullOrWhiteSpace(a.AuthorEmail) ? "Unknown" : a.AuthorEmail + " (invalid)" }); foreach (var notInvitedViewModel in notInvited) { Logger.Info($"Skipped sending validation request to {notInvitedViewModel.AuthorEmail}."); } return(View("BulkInviteSuccessful", new AuthorsInvitedViewModel { AmountInvited = invited, AuthorsNotInvited = notInvited, AuthorsInvitedWithError = errorWhenInvited })); } catch (ArgumentException invalidFileException) { ModelState.AddModelError("generalError", invalidFileException.Message); } catch (DbEntityValidationException) { //foreach (var eve in e.EntityValidationErrors) //{ // Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",eve.Entry.Entity.GetType().Name, eve.Entry.State); // foreach (var ve in eve.ValidationErrors) // { // Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage); // } //} //throw; } catch (FormatException fe) { ModelState.AddModelError("generalError", $"An error has ocurred: {fe.Message}"); } catch (Exception exception) { ModelState.AddModelError("generalError", $"An error has ocurred: {exception.InnermostMessage()}"); } return(View(model)); }
public ActionResult ImportSubmissionLinks(ImportSubmissionLinksViewModel model) { if (!ModelState.IsValid) { return(View(model)); } try { int imported = 0, rejected = 0; var rejectedUrls = new List <SubmissionPageLink>(); var data = _bulkImporter.Execute(model.File.InputStream); foreach (var submissionPageLink in data) { var journal = journalRepository.FindByIssn(submissionPageLink.ISSN); if (journal == null || !DomainMatches(journal.Link, submissionPageLink.Url)) { rejected++; rejectedUrls.Add(submissionPageLink); continue; } journal.SubmissionPageLink = submissionPageLink.Url; imported++; } journalRepository.Save(); return(View("SubmissionLinksImportSuccessful", new SubmissionLinksImportedViewModel { AmountImported = imported, AmountRejected = rejected, RejectedUrls = rejectedUrls })); } catch (ArgumentException invalidFileException) { ModelState.AddModelError("generalError", invalidFileException.Message); } catch (DbEntityValidationException) { //foreach (var eve in e.EntityValidationErrors) //{ // Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",eve.Entry.Entity.GetType().Name, eve.Entry.State); // foreach (var ve in eve.ValidationErrors) // { // Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage); // } //} //throw; } catch (Exception exception) { while (exception.InnerException != null) { exception = exception.InnerException; } ModelState.AddModelError("generalError", $"An error has ocurred: {exception.Message}"); } return(View(model)); }
public ActionResult BulkImportInstitutionalPrices(InstitutionalPricesViewModel model) { if (!ModelState.IsValid) { return(View(model)); } try { int imported = 0, deleted = 0, updated = 0; var data = _bulkImporter.Execute(model.File.InputStream); var institutionJournals = (from u in data let institution = institutionRepository.Find(u.Domain) where institution != null from info in u.Licenses let journal = journalRepository.FindByIssn(info.ISSN) where journal != null select new InstitutionJournal { DateAdded = DateTime.Now, Link = info.Text, JournalId = journal.Id, UserProfileId = Authentication.CurrentUserId, InstitutionId = institution.Id }).ToList(); // This is gonna be quite an expensive operation... Rethink! foreach (var institutionJournal in institutionJournals.Distinct()) { var existing = institutionJournalRepository.Find(institutionJournal.JournalId, institutionJournal.InstitutionId); if (existing != null) { if (string.IsNullOrWhiteSpace(institutionJournal.Link)) { institutionJournalRepository.Delete(existing); deleted++; } else { existing.DateAdded = DateTime.Now; existing.Link = institutionJournal.Link; existing.UserProfileId = institutionJournal.UserProfileId; institutionJournalRepository.InsertOrUpdate(existing); updated++; } } else if (!string.IsNullOrWhiteSpace(institutionJournal.Link)) { institutionJournalRepository.InsertOrUpdate(institutionJournal); imported++; } } institutionJournalRepository.Save(); return(RedirectToAction("BulkImportSuccessful", new { amountImported = imported, amountDeleted = deleted, amountUpdated = updated })); } catch (ArgumentException invalidFileException) { ModelState.AddModelError("generalError", invalidFileException.Message); } catch (DbEntityValidationException) { //foreach (var eve in e.EntityValidationErrors) //{ // Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",eve.Entry.Entity.GetType().Name, eve.Entry.State); // foreach (var ve in eve.ValidationErrors) // { // Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage); // } //} //throw; } catch (Exception exception) { while (exception.InnerException != null) { exception = exception.InnerException; } ModelState.AddModelError("generalError", $"An error has ocurred: {exception.Message}"); } return(View(model)); }