public PostAdvertResponseMessage PostAdvert(PostAdvertRequestMessage request) { const string method = "PostAdvert"; EventSource.Raise(Event.Information, method, Event.Arg("request", request)); IntegratorUser integratorUser; IEmployer jobPoster; CheckUser(request.UserCredentials, out integratorUser, out jobPoster); var errors = new List <string>(); var report = new PostAdvertReport(); foreach (var postAd in request.PostAdvert.Adverts.PostAdvert) { report.JobAds++; try { if (_jobAdIntegrationQuery.GetOpenJobAdIds(integratorUser.Id, postAd.JobReference).Count != 0) { // Already exists as a JobG8 ad var message = string.Format("Job ad to be posted, '{0}', already exists.", postAd.JobReference); EventSource.Raise(Event.Error, method, message, Event.Arg("postAd", postAd)); errors.Add(message); report.Duplicates++; } else { var jobAd = MapJobAd(postAd); jobAd.PosterId = jobPoster.Id; jobAd.Features = _jobAdIntegrationQuery.GetDefaultFeatures(); jobAd.FeatureBoost = _jobAdIntegrationQuery.GetDefaultFeatureBoost(); jobAd.Integration.IntegratorUserId = integratorUser.Id; if (_externalJobAdsCommand.CanCreateJobAd(jobAd)) { _jobAdsCommand.CreateJobAd(jobAd); // The application form, for now, needs to be directly saved into the database. _jobAdsCommand.CreateApplicationRequirements(jobAd.Id, postAd.ApplicationFormXML); _jobAdsCommand.OpenJobAd(jobAd); report.Posted++; } else { var message = string.Format("Job ad to be posted, '{0}' ([{1}] '{2}')," + " was already posted by another integrator.", postAd.JobReference, postAd.ClientReference, postAd.Position); EventSource.Raise(Event.Error, method, message, Event.Arg("postAd", postAd)); errors.Add(message); } } } catch (ServiceEndUserException e) { EventSource.Raise(Event.Error, method, e, null, Event.Arg("postAd", postAd)); errors.Add(string.Format("JobReference='{0}': {1}", postAd.JobReference, e.Message)); report.Failed++; } catch (Exception e) { EventSource.Raise(Event.Error, method, e, null, Event.Arg("postAd", postAd)); errors.Add(string.Format("JobReference='{0}': Unexpected error.", postAd.JobReference)); report.Failed++; } } // Record it. _jobAdIntegrationReportsCommand.CreateJobAdIntegrationEvent(new JobAdImportPostEvent { Success = true, IntegratorUserId = integratorUser.Id, PosterId = jobPoster.Id, JobAds = report.JobAds, Failed = report.Failed, Posted = report.Posted, Duplicates = report.Duplicates }); var response = new PostAdvertResponseMessage { PostAdvertResponse = new Response { Success = string.Join("\r\n", errors.ToArray()) } }; EventSource.Raise(Event.Information, method, string.Format("{0} ads processed; {1} new ads, {2} duplicate ads, {3} errors.", report.JobAds, report.Posted, report.Duplicates, report.Failed), Event.Arg("response", response)); return(response); }