private void UploadMessageFiles(int vendorID) { var pluginLocation = GetPluginLocation(); var typesXsdPath = Path.Combine(pluginLocation, "XSD", "wdpTypes.xsd"); // first move all files to the outgoing directory var directories = MessageHelper.GetMessageFolders("To", vendorID); foreach (var directory in directories) { foreach (var file in Directory.EnumerateFiles(directory)) { var filename = Path.GetFileName(file); if (filename == null) { continue; } var wkm = MessageHelper.GetMessageByFilename(filename); if (wkm != null && (wkm.MessageType == MessageHelper.WehkampMessageType.ProductAttribute || wkm.MessageType == MessageHelper.WehkampMessageType.ShipmentNotification) && wkm.LastModified.HasValue && wkm.LastModified.Value.AddMinutes(20) > DateTime.Now.ToUniversalTime()) { continue; } //Only export files with the status Success if (wkm == null || wkm.Status != WehkampMessageStatus.Success) { continue; } File.Move(Path.Combine(directory, filename), Path.Combine(ConfigurationHelper.OutgoingFilesRootFolder, vendorID.ToString(CultureInfo.InvariantCulture), filename)); } } var ftpClient = SftpHelper.CreateClient(VendorSettingsHelper.GetSFTPSetting(vendorID), CommunicatorHelper.GetWehkampPrivateKeyFilename(vendorID), "D1r@ct379"); if (ftpClient == null) { log.AuditCritical("SFTP failed to connect"); return; } // then we upload all of them var remoteFileList = new ArrayList(); if (ConfigurationHelper.ListFTPFilesCheck) { ftpClient.ListDirectory("TO_WK", remoteFileList); } var remoteFiles = (TElSftpFileInfo[])remoteFileList.ToArray(typeof(TElSftpFileInfo)); foreach (var file in Directory.EnumerateFiles(Path.Combine(ConfigurationHelper.OutgoingFilesRootFolder, vendorID.ToString(CultureInfo.InvariantCulture)))) { var filename = Path.GetFileName(file); var message = MessageHelper.GetMessageByFilename(filename); if (message == null || (message.Status != WehkampMessageStatus.ErrorUpload && message.Status != WehkampMessageStatus.Success)) { continue; } if (message.Status == WehkampMessageStatus.Success) { MessageHelper.ResetMessageAttempt(message.MessageID); } var error = false; MessageHelper.UpdateMessageAttempt(message.MessageID); if (!ConfigurationHelper.ListFTPFilesCheck || remoteFiles.All(c => c.Name != file)) { try { var path = Path.Combine(ConfigurationHelper.OutgoingFilesRootFolder, message.VendorID.ToString(CultureInfo.InvariantCulture), filename); var doc = XDocument.Load(path); if (doc.Root == null) { continue; } if (_downloadedFiles.ContainsKey(filename)) { _downloadedFiles[filename] = message.MessageID; } else { _downloadedFiles.Add(filename, message.MessageID); } MessageHelper.UpdateMessageRecieved(message.MessageID, DateTime.Now.ToUniversalTime()); var xsdPath = Path.Combine(pluginLocation, "XSD", string.Format("{0}.xsd", doc.Root.Name.LocalName)); if (!File.Exists(xsdPath) || !File.Exists(typesXsdPath)) { throw new FileNotFoundException(String.Format("Cannot find Xsd validation files\n{0}\n{1}", xsdPath, typesXsdPath)); } var schemas = new XmlSchemaSet(); schemas.Add(null, XElement.Load(xsdPath).CreateReader()); schemas.Add(null, XElement.Load(typesXsdPath).CreateReader()); schemas.Compile(); doc.Validate(schemas, null); ftpClient.UploadFile(path, Path.Combine("TO_WK", filename).ToUnixPath(), TSBFileTransferMode.ftmOverwrite); File.Move(Path.Combine(ConfigurationHelper.OutgoingFilesRootFolder, message.VendorID.ToString(CultureInfo.InvariantCulture), filename), Path.Combine(ConfigurationHelper.ArchivedRootFolder, message.VendorID.ToString(CultureInfo.InvariantCulture), filename)); MessageHelper.UpdateMessageStatus(message.MessageID, WehkampMessageStatus.Archived); MessageHelper.UpdateMessagePath(message.MessageID, ConfigurationHelper.ArchivedRootFolder); MessageHelper.UpdateMessageSent(message.MessageID, DateTime.Now.ToUniversalTime()); } catch (Exception e) { if (e is XmlSchemaValidationException) { MessageHelper.UpdateMessageStatus(_downloadedFiles[filename], WehkampMessageStatus.ValidationFailed); log.AuditError(string.Format("XML validation failed for file {0} : {1}\n{2}", filename, e.Message, e.StackTrace)); } else { MessageHelper.UpdateMessageStatus(message.MessageID, WehkampMessageStatus.ErrorUpload); log.AuditError(string.Format("Cannot upload file {0}", filename), e); } MessageHelper.UpdateMessagePath(message.MessageID, ConfigurationHelper.OutgoingFilesRootFolder); error = true; } } else { MessageHelper.UpdateMessageStatus(message.MessageID, WehkampMessageStatus.ErrorUpload); MessageHelper.UpdateMessagePath(message.MessageID, ConfigurationHelper.OutgoingFilesRootFolder); log.AuditError(string.Format("Cannot upload file {0}, File already exists on remote server.", filename)); error = true; } if (error && message.Attempts + 1 > 10) { MessageHelper.UpdateMessageStatus(message.MessageID, WehkampMessageStatus.MaxRetryExceeded); File.Move(Path.Combine(ConfigurationHelper.OutgoingFilesRootFolder, filename), Path.Combine(ConfigurationHelper.FailedFilesRootFolder, filename)); MessageHelper.UpdateMessagePath(message.MessageID, ConfigurationHelper.FailedFilesRootFolder); } } ftpClient.Dispose(); }
private void DownloadMessageFiles(int vendorID) { var remoteFileList = new ArrayList(); _downloadedFiles = new Dictionary <string, decimal>(); var ftpClient = SftpHelper.CreateClient(VendorSettingsHelper.GetSFTPSetting(vendorID), CommunicatorHelper.GetWehkampPrivateKeyFilename(vendorID), "D1r@ct379"); if (ftpClient == null) { log.AuditCritical("SFTP failed to connect"); return; } remoteFileList.Clear(); var allianceDirectoryName = string.Format("TO_{0}", VendorSettingsHelper.GetAlliantieName(vendorID).ToUpperInvariant()); try { ftpClient.ListDirectory(allianceDirectoryName, remoteFileList); foreach (TElSftpFileInfo fileinfo in remoteFileList) { //log.Info(string.Format("Checking remote item '{0}'", fileinfo.Name)); if (fileinfo.Attributes.FileType != TSBSftpFileType.ftFile && (fileinfo.Attributes.FileType != TSBSftpFileType.ftUnknown && !fileinfo.Name.Contains(".xml"))) { //log.Info(string.Format("Not a file. Skip item '{0}'", fileinfo.Name)); continue; } var message = MessageHelper.GetMessageByFilename(fileinfo.Name); // if this is a second attempt, only try again if the validation has failed or there was an error downloading if (message != null && message.Status != WehkampMessageStatus.ErrorDownload && message.Status != WehkampMessageStatus.ValidationFailed) { //log.Info(string.Format("Skip downloading file '{0}'", fileinfo.Name)); continue; } try { //log.Info(string.Format("Start downloading file '{0}'", fileinfo.Name)); ftpClient.DownloadFile(Path.Combine(allianceDirectoryName, fileinfo.Name).ToUnixPath(), Path.Combine(ConfigurationHelper.IncomingFilesRootFolder, vendorID.ToString(CultureInfo.InvariantCulture), fileinfo.Name)); ftpClient.RemoveFile(Path.Combine(allianceDirectoryName, fileinfo.Name).ToUnixPath()); } catch (Exception e) { log.AuditError(string.Format("Cannot access {0} over SFTP: {1}\n{2}", allianceDirectoryName, e.Message, e.StackTrace)); if (message != null) { MessageHelper.UpdateMessageStatus(message.MessageID, WehkampMessageStatus.ErrorDownload); } } finally { if (message != null) { MessageHelper.UpdateMessageAttempt(message.MessageID); if (message.Attempts + 1 >= 10) { MessageHelper.UpdateMessageStatus(message.MessageID, WehkampMessageStatus.MaxRetryExceeded); } } } if (message == null || message.Attempts + 1 < 10) { _downloadedFiles.Add(fileinfo.Name, message != null ? message.MessageID : -1); } } } catch (Exception e) { log.AuditError(string.Format("Cannot access {0} over SFTP: {1}\n{2}", allianceDirectoryName, e.Message, e.StackTrace)); } CreateMessagesFromDownloadedFiles(vendorID); ftpClient.Dispose(); }
private bool ProcessProductImages(Database db, List <ProductMedia> productMedias, int vendorID) { if (!productMedias.Any()) { return(true); } var attributeid = db.FirstOrDefault <int>("SELECT AttributeID FROM ProductAttributeMetaData WHERE AttributeCode = @0", "WehkampProductNumber"); if (attributeid == 0) { throw new ConfigurationErrorsException("Attribute \"WehkampProductNumber\" is missing from the ProductAttributeMetadata table"); } var wehkampPids = new Dictionary <int, string>(); if (productMedias.Count <= 500) { var productMediaArray = string.Join(",", productMedias.Select(c => c.ProductID).ToArray()); wehkampPids = db.Dictionary <int, string>(string.Format("SELECT ProductID, Value FROM ProductAttributeValue WHERE AttributeID = {1} AND ProductID IN ({0})", productMediaArray, attributeid)); } else { for (var i = 0; i < productMedias.Count; i += 500) { var productMediaArray = string.Join(",", productMedias.Skip(i).Take(Math.Min(500, productMedias.Count - i)).Select(c => c.ProductID).ToArray()); var temp = db.Dictionary <int, string>(string.Format("SELECT ProductID, Value FROM ProductAttributeValue WHERE AttributeID = {1} AND ProductID IN ({0})", productMediaArray, attributeid)); foreach (var pm in temp) { if (!wehkampPids.ContainsKey(pm.Key)) { wehkampPids.Add(pm.Key, pm.Value); } } } } var ftpClient = SftpHelper.CreateClient(VendorSettingsHelper.GetSFTPSetting(vendorID), CommunicatorHelper.GetWehkampPrivateKeyFilename(vendorID), "D1r@ct379"); if (ftpClient == null) { log.AuditCritical("SFTP failed to connect"); return(false); } string manid, path, newFilename; int index; foreach (var media in productMedias) { if (!wehkampPids.ContainsKey(media.ProductID)) { continue; } manid = media.ManufacturerID.Split(' ')[0]; if (string.IsNullOrEmpty(manid)) { continue; } index = media.ImagePath.LastIndexOf(manid, StringComparison.InvariantCultureIgnoreCase); if (index < 0) { continue; } path = Path.Combine(ConfigurationHelper.FTPMediaDirectory, media.ImagePath); if (!File.Exists(path)) { log.Error(string.Format("Could not find image file {0}", path)); continue; } newFilename = string.Format("{0}_{1}", wehkampPids[media.ProductID], media.ImagePath.Substring(index)); try { //Only upload files ending on: //1. _b.png - Back //2. _f.png - Front //3. _h.png - Hoover //if (newFilename.ToLowerInvariant().EndsWith("_b.png") || newFilename.ToLowerInvariant().EndsWith("_f.png") || newFilename.ToLowerInvariant().EndsWith("_h.png")) if (newFilename.ToLowerInvariant().EndsWith("_b.png") || newFilename.ToLowerInvariant().EndsWith("_f.png") || newFilename.ToLowerInvariant().EndsWith("_h.png")) { ftpClient.UploadFile(path, Path.Combine("TO_WK", "Pictures", newFilename).ToUnixPath(), TSBFileTransferMode.ftmOverwrite); } } catch (Exception e) { log.Error(string.Format("Cannot upload file : {0}", media.ImagePath), e); return(false); } } return(true); }