using Microsoft.Extensions.Configuration; using System; using System.Globalization; using System.IO; namespace OI.Metrology.Archive.Services; using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.Repositories; using OI.Metrology.Shared.Services; using System.Data.SqlClient; public class AttachmentsService : IAttachmentsService { private IConfiguration Config { get; } protected IMetrologyRepo _Repo; public AttachmentsService(IConfiguration config, IMetrologyRepo repo) { Config = config; _Repo = repo; } protected Stream GetAttachmentStream(String tableName, Guid attachmentId, string filename) { string attachmentsRootPath = Config[Constants.AttachmentPathKey]; if (attachmentId.Equals(Guid.Empty)) throw new Exception("No attachments found"); DateTime insertDate = Convert.ToDateTime(_Repo.GetAttachmentInsertDateByGUID(tableName, attachmentId)); int year = insertDate.Year; DateTime d = insertDate; CultureInfo cul = CultureInfo.CurrentCulture; int weekNum = cul.Calendar.GetWeekOfYear(d, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); string workWeek = "WW" + weekNum.ToString("00"); string dateDir = year + @"\" + workWeek; string fullPath = Path.Combine(attachmentsRootPath, tableName + "_", dateDir, attachmentId.ToString(), filename); //Check to see if file exists in the "New" directory structure, if not change the path back to the old. and check there if (!File.Exists(fullPath)) { fullPath = Path.Combine(attachmentsRootPath, tableName, attachmentId.ToString(), filename); } if (!File.Exists(fullPath)) throw new Exception("File not found"); return new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } //protected System.IO.Stream GetAttachmentStream(String tableName, Guid attachmentId, string filename) //{ // //This part seems to be key // var attachmentsRootPath = _config[Constants.AttachmentPathKey]; // //if (attachmentId.Equals(Guid.Empty)) // //throw new Exception("No attachments found"); // //string list = Directory.GetDirectories(attachmentsRootPath).Where(s => s.Contains(attachmentId.ToString())).SingleOrDefault(); // //var fullPath = list; // var fullPath = System.IO.Path.Combine(attachmentsRootPath, tableName, attachmentId.ToString(), filename); // if (!System.IO.File.Exists(fullPath)) // throw new Exception("File not found " + fullPath); // return new System.IO.FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); //} protected Stream GetAttachmentStreamArchive(String tableName, Guid attachmentId, string filename) { //This part seems to be key string attachmentsRootPath = Config[Constants.AttachmentPathKey]; if (attachmentId.Equals(Guid.Empty)) throw new Exception("No attachments found"); string fullPath = Path.Combine(attachmentsRootPath, tableName, "2019\\09", attachmentId.ToString(), filename); if (!File.Exists(fullPath)) throw new Exception("File not found"); return new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } public Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename) { if (toolType == null) throw new Exception("Invalid tool type"); string queryString = "SELECT * FROM " + toolType.DataTableName + " WHERE AttachmentId = @attachmentId"; if (header) { queryString = "SELECT * FROM " + toolType.HeaderTableName + " WHERE AttachmentId = '" + title + "'"; } DateTime SearchDate = new(); string connectionString = @"Server=messv01ec.ec.local\PROD1,53959;Database=Metrology_Archive;Integrated Security=True"; using (SqlConnection connection = new(connectionString)) { SqlCommand command = new(queryString, connection); //command.Parameters.AddWithValue("@attachmentId", attachmentId); connection.Open(); SqlDataReader reader = command.ExecuteReader(); try { while (reader.Read()) { Console.WriteLine(string.Format("{0}", reader["InsertDate"]));// etc string test = string.Format("{0}", reader["InsertDate"]); SearchDate = Convert.ToDateTime(string.Format("{0}", reader["InsertDate"])); } } finally { // Always call Close when done reading. reader.Close(); } } string SearchMonth = SearchDate.Month.ToString(); if (SearchDate.Month < 10) { _ = "0" + SearchMonth; } _ = SearchDate.Year.ToString(); _ = Config[Constants.AttachmentPathKey]; string tableName; //var attachmentsRootPath = "\\\\messv02ecc1.ec.local\\EC_Metrology_Si\\MetrologyAttachments\\TencorRunData\\2019\\09"; Guid attachmentId; if (header) { tableName = toolType.HeaderTableName; attachmentId = _Repo.GetHeaderAttachmentIDByTitle(toolType.ID, title); } else { tableName = toolType.DataTableName; attachmentId = _Repo.GetDataAttachmentIDByTitle(toolType.ID, title); } return GetAttachmentStream(tableName, attachmentId, filename); } public Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename) { if (toolType == null) throw new Exception("Invalid tool type"); /*string queryString = "SELECT * FROM " + toolType.DataTableName + " WHERE AttachmentId = @attachmentId"; if (header) { queryString = "SELECT * FROM " + toolType.HeaderTableName + " WHERE AttachmentId = '" + attachmentId + "'"; } DateTime SearchDate = new DateTime(); string connectionString = @"Server=messv01ec.ec.local\PROD1,53959;Database=Metrology_Archive;Integrated Security=True"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(queryString, connection); command.Parameters.AddWithValue("@attachmentId", attachmentId); connection.Open(); SqlDataReader reader = command.ExecuteReader(); try { while (reader.Read()) { Console.WriteLine(string.Format("{0}", reader["InsertDate"]));// etc //string test = string.Format("{0}", reader["InsertDate"]); SearchDate = Convert.ToDateTime(string.Format("{0}", reader["Date"])); } } finally { // Always call Close when done reading. reader.Close(); } } string SearchMonth = SearchDate.Month.ToString(); if (SearchDate.Month < 10) { SearchMonth = "0" + SearchMonth; } string SearchYear = SearchDate.Year.ToString();*/ //string DateSearchTermin = +""+ _ = Config[Constants.AttachmentPathKey]; string tableName; if (header) tableName = toolType.HeaderTableName; else tableName = toolType.DataTableName; //System.IO.Stream test = GetAttachmentStream(tableName, attachmentId, filename, SearchYear); return GetAttachmentStream(tableName, attachmentId, filename); //return test; } public Stream GetAttachmentStreamByAttachmentIdArchive(ToolType toolType, bool header, Guid attachmentId, string filename) { if (toolType == null) throw new Exception("Invalid tool type"); _ = Config[Constants.AttachmentPathKey]; string tableName; if (header) tableName = toolType.HeaderTableName; else tableName = toolType.DataTableName; return GetAttachmentStreamArchive(tableName, attachmentId, filename); } public void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, Microsoft.AspNetCore.Http.IFormFile uploadedFile) { if (toolType == null) throw new Exception("Invalid tool type"); using System.Transactions.TransactionScope trans = _Repo.StartTransaction(); Guid attachmentId = Guid.Empty; string tableName = ""; if (string.IsNullOrWhiteSpace(dataUniqueId)) { attachmentId = _Repo.GetHeaderAttachmentID(toolType.ID, headerId); tableName = toolType.HeaderTableName; } else { attachmentId = _Repo.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); tableName = toolType.DataTableName; } if (Equals(attachmentId, Guid.Empty)) throw new Exception("Invalid attachment ID"); string attachmentsRootPath = Config[Constants.AttachmentPathKey]; string directoryPath = Path.Combine(attachmentsRootPath, tableName, attachmentId.ToString()); if (!Directory.Exists(directoryPath)) _ = Directory.CreateDirectory(directoryPath); string fullPath = Path.Combine(directoryPath, filename); using (FileStream s = new(fullPath, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { uploadedFile.CopyTo(s); } trans.Complete(); } public void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile) { Microsoft.AspNetCore.Http.IFormFile formFile = (Microsoft.AspNetCore.Http.IFormFile)uploadedFile; SaveAttachment(toolType, headerId, dataUniqueId, filename, formFile); } }