public OperationResultDto IsEventValid(CompanyQuizEventMappingSaveDTO eventQuizMapping) { var defaultAcDomain = CompanyAcServerModel.GetOneById(eventQuizMapping.companyAcDomainId).Value; if (defaultAcDomain == null) { return(OperationResultDto.Error("Company was not found")); } var acUri = new Uri(defaultAcDomain.AcServer); var acProvider = new AdobeConnectProvider(new ConnectionDetails(acUri)); var acProxy = new AdobeConnectProxy(acProvider, Logger, acUri); var loginResult = acProxy.Login(new UserCredentials(defaultAcDomain.Username, defaultAcDomain.Password)); if (!loginResult.Success) { return(null); } var eventRegistrationDetails = acProxy.GetEventRegistrationDetails(eventQuizMapping.acEventScoId); string[] requiredFieldNames = new string[3] { "School", "State", "Trainee number or ID" }; StringBuilder errorMessage = new StringBuilder(); foreach (var fieldName in requiredFieldNames) { if (!eventRegistrationDetails.EventFields.Any(ef => string.Equals(ef.Description, fieldName, StringComparison.OrdinalIgnoreCase))) { errorMessage.Append($"{fieldName} field is missed.{Environment.NewLine}"); } } var eventInfo = acProxy.GetEventInfo(eventQuizMapping.acEventScoId); if (string.IsNullOrEmpty(eventInfo.EventInfo.Info)) { errorMessage.Append( $"Event info should be set for the event with sco-id {eventQuizMapping.acEventScoId}.{Environment.NewLine}"); } if (string.IsNullOrEmpty(eventInfo.EventInfo.SpeakerName)) { errorMessage.Append( $"Speaker name should be set for the event with sco-id {eventQuizMapping.acEventScoId}.{Environment.NewLine}"); } if (!string.IsNullOrEmpty(errorMessage.ToString())) { errorMessage.Append( $"Please fix the event details in Adobe Connect and try again.{Environment.NewLine}"); } return(string.IsNullOrEmpty(errorMessage.ToString()) ? OperationResultDto.Success() : OperationResultDto.Error(errorMessage.ToString())); }
public OperationResultDto PublishQuiz(int lmsUserParametersId, string courseId, int quizId) { var lmsUserParameters = LmsUserParametersModel.GetOneById(lmsUserParametersId).Value; if (lmsUserParameters != null) { var lmsApi = LmsFactory.GetEGCEnabledLmsAPI((LmsProviderEnum)lmsUserParameters.CompanyLms.LmsProviderId); lmsApi.PublishQuiz(lmsUserParameters.CompanyLms.GetLMSSettings(Settings, lmsUserParameters, true), courseId, quizId); return(OperationResultDto.Success()); } var error = new Error(Errors.CODE_ERRORTYPE_INVALID_PARAMETER, "Wrong id", "No lms user parameters found"); this.LogError("AppletResult.PublishQuiz", error); throw new FaultException <Error>(error, error.errorMessage); }
public OperationResultDto SendRegistrationEmail(EventRegistrationDTO registrationInfo) { var mapping = CompanyEventQuizMappingModel.GetOneById(registrationInfo.eventQuizMappingId).Value; if (mapping == null) { return(OperationResultDto.Error("There is no event for this info.")); } var acDomain = CompanyAcServerModel.GetOneById(mapping.CompanyAcDomain.Id).Value; var apiUrl = new Uri(acDomain.AcServer); var proxy = new AdobeConnectProxy(new AdobeConnectProvider(new ConnectionDetails(apiUrl)), Logger, apiUrl); var loginResult = proxy.Login(new UserCredentials(acDomain.Username, acDomain.Password)); if (!loginResult.Success) { throw new InvalidOperationException($"Can't login to AC url {acDomain.AcServer} user {acDomain.Username}"); } var eventInfo = proxy.GetScoInfo(mapping.AcEventScoId); if (!eventInfo.Success) { throw new InvalidOperationException(eventInfo.Status.GetErrorInfo()); } List <string> emailsNotSend = new List <string>(); try { //todo: create model based on success/fail var model = new EventQuizRegistrationModel(Settings) { FirstName = registrationInfo.FirstName, LastName = registrationInfo.LastName, EventName = eventInfo.ScoInfo.Name, EventDesc = eventInfo.ScoInfo.Description, EventScoId = eventInfo.ScoInfo.ScoId, EventStartDate = DateTimeHelper.ConvertToEST(eventInfo.ScoInfo.BeginDate).Value, EventEndDate = DateTimeHelper.ConvertToEST(eventInfo.ScoInfo.EndDate).Value, MailSubject = Emails.RegistrationSubject, MeetingUrl = acDomain.AcServer.TrimEnd('/') + "/" + eventInfo.ScoInfo.SourceSco.UrlPath.TrimStart('/'), Email = registrationInfo.Email }; var attachments = new List <System.Net.Mail.Attachment>(); var e = new Event { //DtStart = new CalDateTime(DateTimeHelper.ConvertToEST(model.EventStartDate).Value), //DtEnd = new CalDateTime(DateTimeHelper.ConvertToEST(model.EventEndDate).Value), DtStart = new CalDateTime(eventInfo.ScoInfo.BeginDate), DtEnd = new CalDateTime(eventInfo.ScoInfo.EndDate), Summary = $"{model.EventName}", Description = model.MeetingUrl, Url = new Uri(model.MeetingUrl) }; var calendar = new Calendar(); calendar.Events.Add(e); var serializer = new CalendarSerializer(new SerializationContext()); var serializedCalendar = serializer.SerializeToString(calendar); Logger.Debug(serializedCalendar); //var ms = new MemoryStream(); //using (var writer = new StreamWriter(ms)) //{ // writer.Write(serializedCalendar); // writer.Flush(); //} //ms.Position = 0; byte[] bytes = new byte[serializedCalendar.Length * sizeof(char)]; Buffer.BlockCopy(serializedCalendar.ToCharArray(), 0, bytes, 0, bytes.Length); var contype = new System.Net.Mime.ContentType("text/calendar"); contype.Parameters.Add("method", "REQUEST"); contype.Parameters.Add("name", "EventInformation.ics"); var calendarItem = new System.Net.Mail.Attachment(new MemoryStream(bytes), contype); calendarItem.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; attachments.Add(calendarItem); var sentSuccessfully = MailModel.SendEmailSync($"{model.FirstName} {model.LastName}", model.Email, Emails.RegistrationSubject, model, Common.AppEmailName, Common.AppEmail, attachments: attachments); if (!sentSuccessfully) { emailsNotSend.Add(model.Email); } } catch (Exception e) { Logger.Error($"[SendRegistrationEmail] error.", e); emailsNotSend.Add(registrationInfo.Email); } return(emailsNotSend.Any() ? OperationResultDto.Error("Not all emails were sent correctly") : OperationResultDto.Success()); }
//public OperationResultDto SendCertificateToTeacher(string postQuizResultGuid) //{ // Guid guid; // var canParse = Guid.TryParse(postQuizResultGuid, out guid); // if (!canParse) // { // var error = new Error(Errors.CODE_ERRORTYPE_GENERIC_ERROR, ErrorsTexts.GetResultError_NotFound, "No item with such id found"); // this.LogError("EmailService.SendCertificateToTeacher", error); // throw new FaultException<Error>(error, error.errorMessage); // } // var postQuizResult = QuizResultModel.GetOneByGuid(guid).Value; // var emailsNotSend = new List<string>(); // if (string.IsNullOrEmpty(postQuizResult.ACEmail)) // { // Logger.Warn($"[SendCertificateToTeacher] Email is empty. quizResultId={postQuizResult.Id}"); // emailsNotSend.Add(postQuizResult.ParticipantName); // } // var eventMapping = CompanyEventQuizMappingModel.GetOneById(postQuizResult.EventQuizMapping.Id).Value; // var acUrl = eventMapping.CompanyAcDomain.AcServer; // var login = eventMapping.CompanyAcDomain.Username; // var password = eventMapping.CompanyAcDomain.Password; // var adobeConnectProxy = AdobeConnectAccountService.GetProvider(new AdobeConnectAccess(new Uri(acUrl), login, password), false); // var loginResult = adobeConnectProxy.Login(new UserCredentials(login, password)); // if (!loginResult.Success) // throw new InvalidOperationException("Can't login to AC"); // var dynamicQuestionAnswers = GetDynamicQuestionAnswers(acUrl, eventMapping.AcEventScoId, // loginResult.Status.SessionInfo, postQuizResult.ACEmail); // var schoolNumber = dynamicQuestionAnswers["school"]; // var school = SchoolModel.GetOneByName(schoolNumber); // var schoolEmail = school.SchoolEmail; // if (string.IsNullOrEmpty(schoolEmail)) // { // Logger.Warn($"[SendCertificateToTeacher] Teacher Email is empty. quizResultId={postQuizResult.Id}"); // emailsNotSend.Add(schoolEmail); // } // var schoolAccountName = school.AccountName; // var model = new TeacherCertificateEmailModel(Settings) // { // CertificateLink = // $"{Settings.CertificatesUrl}/quiz-certificate/{postQuizResult.Guid}/download", // ParticipantName = postQuizResult.ParticipantName, // TeacherName = schoolAccountName // }; // bool sentSuccessfully = MailModel.SendEmailSync(schoolAccountName, schoolEmail, // Emails.CertificateSubject, // model, Common.AppEmailName, Common.AppEmail); // if (!sentSuccessfully) // { // emailsNotSend.Add(schoolEmail); // } // return emailsNotSend.Any() ? OperationResultDto.Error("Not all emails were sent correctly") : OperationResultDto.Success(); //} //private static Dictionary<string, string> GetDynamicQuestionAnswers(string acUrl, string scoId, string breezeSession, string userEmail) //{ // var userStateSchoolAnswersUrl = // $"{acUrl}/api/xml?action=report-event-participants-complete-information&sco-id={scoId}&session={breezeSession}"; // var reply = string.Empty; // using (var client = new HttpClient()) // { // client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml")); // var request = new HttpRequestMessage(HttpMethod.Get, userStateSchoolAnswersUrl); // reply = client.SendAsync(request).Result.Content.ReadAsStringAsync().Result; // } // var doc = XDocument.Parse(reply); // var questions = doc.Root?.Descendants("registration_questions").Descendants("question").ToList(); // var stateNode = // questions?.FirstOrDefault( // x => // x.Attribute("description") // .Value.ToString() // .ToLower() // .Equals("state", StringComparison.OrdinalIgnoreCase)); // var schoolNode = // questions?.FirstOrDefault( // x => // x.Attribute("description") // .Value.ToString() // .ToLower() // .Equals("school", StringComparison.OrdinalIgnoreCase)); // var stateQuestionId = stateNode?.Attribute("id")?.Value.ToString() ?? string.Empty; // var schoolQuestionId = schoolNode?.Attribute("id")?.Value.ToString() ?? string.Empty; // var userAnswers = doc.Root?.Descendants("user_list").Descendants("user").ToList(); // var userAnswer = // userAnswers?.FirstOrDefault( // x => // x.Attribute("login") // .Value.ToString() // .ToLower() // .Equals(userEmail, StringComparison.OrdinalIgnoreCase)); // var stateAnswer = userAnswer?.Attribute("registration_question_" + stateQuestionId)?.Value ?? String.Empty; // var schoolAnswer = userAnswer?.Attribute("registration_question_" + schoolQuestionId)?.Value ?? String.Empty; // var result = new Dictionary<string, string>() { { "state", stateAnswer }, { "school", schoolAnswer } }; // return result; //} public OperationResultDto SendEventQuizResultEmail(int[] quizResultIds) { var quizResults = QuizResultModel.GetAllByIds(quizResultIds.ToList()); var mapping = quizResults.FirstOrDefault()?.EventQuizMapping; if (mapping == null) { return(OperationResultDto.Error("There is no event for this result.")); } // var mapping = CompanyEventQuizMappingModel.GetOneById(quizResults.First().EventQuizMappingId).Value; var acDomain = CompanyAcServerModel.GetOneById(mapping.CompanyAcDomain.Id).Value; var acUrl = acDomain.AcServer; var apiUrl = new Uri(acUrl); var scoId = mapping.AcEventScoId; var proxy = new AdobeConnectProxy(new AdobeConnectProvider(new ConnectionDetails(apiUrl)), Logger, apiUrl); var eventInfo = proxy.GetEventInfo(scoId); if (!eventInfo.Success) { throw new InvalidOperationException(); } var emailsNotSend = new List <string>(); foreach (var quizResult in quizResults) { if (quizResult.Quiz.Id != mapping.PreQuiz.Id) { throw new InvalidOperationException("Wrong quiz mapping"); } if (string.IsNullOrEmpty(quizResult.ACEmail) && string.IsNullOrEmpty(quizResult.Email)) { Logger.Warn($"[SendEventQuizResultEmail] Email is empty. quizResultId={quizResult.Id}"); emailsNotSend.Add(quizResult.ParticipantName); continue; } string email = null; try { //todo: create model based on success/fail var model = new EventQuizResultSuccessModel(Settings) { Name = quizResult.ParticipantName, EventName = eventInfo.EventInfo?.Name ?? scoId, MailSubject = "AC Event Post quiz result", PostQuizUrl = Settings.CertificatesUrl + "/UI/#/?quizResultGuid=" + quizResult.Guid, Date = quizResult.EndTime //PostQuizUrl = "https://app.edugamecloud.com" }; email = !string.IsNullOrEmpty(quizResult.ACEmail) ? quizResult.ACEmail : quizResult.Email; bool sentSuccessfully = MailModel.SendEmailSync(quizResult.ParticipantName, email, Emails.GoddardPostQuizSubject, model, Common.AppEmailName, Common.AppEmail); if (!sentSuccessfully) { emailsNotSend.Add(email); } } catch (Exception e) { Logger.Error($"[SendEventQuizResultEmail] error.", e); emailsNotSend.Add(email); } } return(emailsNotSend.Any() ? OperationResultDto.Error("Not all emails were sent correctly") : OperationResultDto.Success()); }
// TRICK: used by OfflineQuizService.SendAnswers public OperationResultDto SendCertificate(string postQuizResultGuid) { Guid guid; var canParse = Guid.TryParse(postQuizResultGuid, out guid); if (!canParse) { var error = new Error(Errors.CODE_ERRORTYPE_GENERIC_ERROR, ErrorsTexts.GetResultError_NotFound, "No item with such id found"); this.LogError("EmailService.SendCertificate", error); throw new FaultException <Error>(error, error.errorMessage); } var postQuizResult = QuizResultModel.GetOneByGuid(guid).Value; var acDomain = CompanyAcServerModel.GetOneById(postQuizResult.EventQuizMapping.CompanyAcDomain.Id).Value; var acUrl = acDomain.AcServer; var apiUrl = new Uri(acUrl); var scoId = postQuizResult.EventQuizMapping.AcEventScoId; var proxy = new AdobeConnectProxy(new AdobeConnectProvider(new ConnectionDetails(apiUrl)), Logger, apiUrl); var eventInfo = proxy.GetEventInfo(scoId); if (!eventInfo.Success) { throw new InvalidOperationException(); } var emailsNotSend = new List <string>(); if (string.IsNullOrEmpty(postQuizResult.ACEmail)) { Logger.Warn($"[SendCertificate] Email is empty. quizResultId={postQuizResult.Id}"); emailsNotSend.Add(postQuizResult.ParticipantName); } var model = new CertificateEmailModel(Settings) { CertificateLink = postQuizResult.BuildDownloadUrl(Settings.CertificatesUrl), ParticipantName = postQuizResult.ParticipantName, EventName = eventInfo.EventInfo.Name }; bool sentSuccessfully = MailModel.SendEmailSync(postQuizResult.ParticipantName, postQuizResult.ACEmail, Emails.CertificateSubject, model, Common.AppEmailName, Common.AppEmail); if (!sentSuccessfully) { emailsNotSend.Add(postQuizResult.ACEmail); } return(emailsNotSend.Any() ? OperationResultDto.Error("Not all emails were sent correctly") : OperationResultDto.Success()); }
public OperationResultDto DeletePrincipals(int lmsCompanyId, string login, string password, string[] principalIds) { //http://dev.connectextensions.com/api/xml?action=principal-list&filter-principal-id=313091&filter-principal-id=256215&filter-principal-id=257331 try { if (principalIds == null) { throw new ArgumentNullException("principalIds"); } LmsCompany currentLicense = this.LmsCompanyModel.GetOneById(lmsCompanyId).Value; IAdobeConnectProxy currentLicenseProvider = null; try { currentLicenseProvider = AdobeConnectAccountService.GetProvider(currentLicense.AcServer, new UserCredentials(login, password), true); } catch (InvalidOperationException) { return(OperationResultDto.Error("Login to Adobe Connect failed.")); } PrincipalCollectionResult principalsToDelete = currentLicenseProvider.GetAllByPrincipalIds(principalIds); IEnumerable <LmsCompany> companyLicenses = this.LmsCompanyModel.GetAllByCompanyId(currentLicense.CompanyId); var lmsLicensePrincipals = new List <string>(); foreach (LmsCompany lms in companyLicenses) { if (lms.AcServer.TrimEnd(new char[] { '/' }) == currentLicense.AcServer.TrimEnd(new char[] { '/' })) { bool tryToDeleteAcUserFromLicense = principalsToDelete.Values.Select(x => x.Login).Contains(lms.AcUsername); if (tryToDeleteAcUserFromLicense) { lmsLicensePrincipals.Add(string.Format("Adobe Connect account '{0}' is used within your LMS license '{1}'. ", lms.AcUsername, lms.Title)); } } } if (lmsLicensePrincipals.Count > 0) { string msg = (lmsLicensePrincipals.Count == 1) ? "You should not delete account. " : "You should not delete some accounts. "; return(OperationResultDto.Error(msg + string.Join("", lmsLicensePrincipals))); } bool allOK = true; var failedPrincipals = new List <string>(); foreach (string principalId in principalIds) { PrincipalResult deleteResult = currentLicenseProvider.PrincipalDelete(new PrincipalDelete { PrincipalId = principalId }); if (deleteResult.Status.Code != StatusCodes.ok) { Logger.ErrorFormat("AC.PrincipalDelete error. {0} PrincipalId: {1}.", deleteResult.Status.GetErrorInfo(), principalId); allOK = false; failedPrincipals.Add(principalId); } } if (allOK) { return(OperationResultDto.Success()); } else { return(OperationResultDto.Error(string.Format("Failed to delete {0} principal(s) from Adobe Connect", failedPrincipals.Count.ToString()))); } } catch (Exception ex) { Logger.Error("LmsService.DeletePrincipals", ex); return(OperationResultDto.Error(ErrorsTexts.UnexpectedError)); } }
public async Task <OperationResultDto> SaveAll(QuizSummaryResultDTO quizResult) { if (quizResult == null) { Logger.Fatal("QuizResultService.SaveAll: ArgumentNullException for quizResult"); throw new ArgumentNullException(nameof(quizResult)); } if (quizResult.quizResults == null) { quizResult.quizResults = new QuizResultDTO[0]; } Logger.Info($"QuizResultService.SaveAll Start: AcSessionId {quizResult.acSessionId}, quizId : {quizResult.quizId}, companyId : {quizResult.companyId}, Count : {quizResult.quizResults.Length}"); IList <string> errorMessages = new List <string>(); try { //TRICK to get eventQuizMappingId var eventQuizMappingId = GetEventQuizMappingId(quizResult); // Quiz quiz = QuizModel.GetOneById(quizResult.quizId).Value; ACSession acSession = ACSessionModel.GetOneById(quizResult.acSessionId).Value; if (acSession == null) { throw new ArgumentException($"There are not session with acSessionId : {quizResult.acSessionId}"); } int acSessionId = acSession.Id; CompanyEventQuizMapping companyEventQuizMapping = null; if (eventQuizMappingId.HasValue && eventQuizMappingId.Value != 0) { companyEventQuizMapping = EventQuizMappingModel.GetOneById(eventQuizMappingId.Value).Value; } if (!IsValid(quizResult, out ValidationResult validationSummaryDtoResult)) { errorMessages = UpdateResultToShortString(validationSummaryDtoResult); return(OperationResultDto.Error(string.Join(";", errorMessages))); } foreach (var appletResultDTO in quizResult.quizResults) { appletResultDTO.acSessionId = quizResult.acSessionId; if (IsValid(appletResultDTO, out ValidationResult validationResult)) { var appletResult = ConvertDto(appletResultDTO, quiz, acSessionId, companyEventQuizMapping); QuizResultModel.RegisterSave(appletResult); if (appletResultDTO.results != null) { await SaveAllAsync(appletResult, appletResultDTO.results); } } else { errorMessages.AddRange(UpdateResultToShortString(validationResult)); } } } catch (ArgumentException ex) { Logger.Error("QuizResultService.SaveAll:", ex); throw; } catch (Exception ex) { Logger.Error($"QuizResultService.SaveAll json={JsonConvert.SerializeObject(quizResult)}", ex); throw; } return(errorMessages.Any() ? OperationResultDto.Error(string.Join(";", errorMessages)) : OperationResultDto.Success()); }