JsonElement instead of Request body Attachment Class Bump Ready to test GetLastGroupIdWithValue Changed to v4
162 lines
7.7 KiB
C#
162 lines
7.7 KiB
C#
using System.Globalization;
|
|
|
|
namespace OI.Metrology.Server.Services;
|
|
|
|
using OI.Metrology.Server.Models;
|
|
using OI.Metrology.Shared.DataModels;
|
|
using OI.Metrology.Shared.Models;
|
|
using OI.Metrology.Shared.Models.Stateless;
|
|
using OI.Metrology.Shared.Services;
|
|
using System.Text.Json;
|
|
|
|
public class AttachmentsService : IAttachmentsService
|
|
{
|
|
|
|
private readonly AppSettings _AppSettings;
|
|
private readonly IHttpClientFactory _HttpClientFactory;
|
|
private readonly IFileShareRepository _FileShareRepository;
|
|
private readonly IMetrologyRepository _MetrologyRepository;
|
|
|
|
public AttachmentsService(AppSettings appSettings, IHttpClientFactory httpClientFactory, IFileShareRepository fileShareRepository, IMetrologyRepository metrologyRepository)
|
|
{
|
|
_AppSettings = appSettings;
|
|
_HttpClientFactory = httpClientFactory;
|
|
_FileShareRepository = fileShareRepository;
|
|
_MetrologyRepository = metrologyRepository;
|
|
}
|
|
|
|
protected Stream GetAttachmentStream(string? tableName, Guid attachmentId, string filename)
|
|
{
|
|
if (attachmentId.Equals(Guid.Empty))
|
|
throw new Exception("No attachments found");
|
|
|
|
if (tableName is null)
|
|
throw new NullReferenceException(nameof(tableName));
|
|
|
|
DateTime insertDate = Convert.ToDateTime(_MetrologyRepository.GetAttachmentInsertDateByGUID(tableName, attachmentId));
|
|
|
|
string year = insertDate.Year.ToString();
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient();
|
|
Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi);
|
|
int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
|
|
Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, "MetrologyAttachments", $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename);
|
|
HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri);
|
|
if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
|
|
throw new Exception("File not found!");
|
|
return httpResponseMessage.Content.ReadAsStream();
|
|
}
|
|
|
|
Stream IAttachmentsService.GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename)
|
|
{
|
|
if (toolType is null)
|
|
throw new Exception("Invalid tool type");
|
|
Guid attachmentId;
|
|
string? tableName;
|
|
if (header)
|
|
{
|
|
tableName = toolType.HeaderTableName;
|
|
attachmentId = _MetrologyRepository.GetHeaderAttachmentIDByTitle(toolType.ID, title);
|
|
}
|
|
else
|
|
{
|
|
tableName = toolType.DataTableName;
|
|
attachmentId = _MetrologyRepository.GetDataAttachmentIDByTitle(toolType.ID, title);
|
|
}
|
|
return GetAttachmentStream(tableName, attachmentId, filename);
|
|
}
|
|
|
|
Stream IAttachmentsService.GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename)
|
|
{
|
|
if (toolType is null)
|
|
throw new Exception("Invalid tool type");
|
|
string? tableName;
|
|
if (header)
|
|
tableName = toolType.HeaderTableName;
|
|
else
|
|
tableName = toolType.DataTableName;
|
|
return GetAttachmentStream(tableName, attachmentId, filename);
|
|
}
|
|
|
|
void IAttachmentsService.SaveAttachment(ToolType toolType, Attachment attachment)
|
|
{
|
|
if (toolType is null)
|
|
throw new Exception("Invalid tool type");
|
|
if (attachment.HeaderId is null)
|
|
throw new NullReferenceException($"{nameof(attachment.HeaderId)}");
|
|
if (attachment.AttachmentId is null)
|
|
throw new NullReferenceException($"{nameof(attachment.AttachmentId)}");
|
|
if (attachment.SourceFileName is null)
|
|
throw new NullReferenceException($"{nameof(attachment.SourceFileName)}");
|
|
if (attachment.DestinationFileName is null)
|
|
throw new NullReferenceException($"{nameof(attachment.DestinationFileName)}");
|
|
string? tableName;
|
|
DateTime insertDate;
|
|
using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction();
|
|
if (string.IsNullOrWhiteSpace(attachment.UniqueId))
|
|
{
|
|
_MetrologyRepository.SetHeaderAttachmentID(toolType.ID, attachment.HeaderId.Value, attachment.AttachmentId);
|
|
insertDate = Convert.ToDateTime(_MetrologyRepository.GetHeaderInsertDate(toolType.ID, attachment.HeaderId.Value));
|
|
tableName = toolType.HeaderTableName;
|
|
}
|
|
else
|
|
{
|
|
_MetrologyRepository.SetDataAttachmentID(toolType.ID, attachment.HeaderId.Value, attachment.UniqueId, attachment.AttachmentId);
|
|
insertDate = Convert.ToDateTime(_MetrologyRepository.GetDataInsertDate(toolType.ID, attachment.HeaderId.Value, attachment.UniqueId));
|
|
tableName = toolType.DataTableName;
|
|
}
|
|
if (Equals(attachment.AttachmentId, Guid.Empty))
|
|
{
|
|
trans.Dispose();
|
|
throw new Exception("Invalid attachment ID!");
|
|
}
|
|
const string asdf = "\\asdf\asdf";
|
|
int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
|
|
string checkPath = Path.Combine(asdf, $"{tableName}_", insertDate.Year.ToString(), $"WW{weekNum:00}", attachment.AttachmentId.ToString(), attachment.DestinationFileName);
|
|
if (!attachment.SourceFileName.EndsWith(checkPath[asdf.Length..]))
|
|
{
|
|
trans.Dispose();
|
|
throw new Exception("Invalid attachment path!");
|
|
}
|
|
trans.Complete();
|
|
}
|
|
|
|
string? IAttachmentsService.GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId)
|
|
{
|
|
string? result;
|
|
int weekNum;
|
|
string year;
|
|
Task<string> json;
|
|
Uri weekDirectory;
|
|
Uri checkDirectory;
|
|
List<string> files = new();
|
|
NginxFileSystem[]? nginxFileSystemCollection;
|
|
Task<HttpResponseMessage> httpResponseMessage;
|
|
HttpClient httpClient = _HttpClientFactory.CreateClient();
|
|
Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi);
|
|
DateTime[] dateTimes = new DateTime[] { DateTime.Now, DateTime.Now.AddDays(-6.66) };
|
|
ToolType toolType = metrologyRepository.GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
|
|
foreach (DateTime dateTime in dateTimes)
|
|
{
|
|
year = dateTime.Year.ToString();
|
|
weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
|
|
weekDirectory = _FileShareRepository.Append(mesaFileShareMetrologySi, "MetrologyAttachments", $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}");
|
|
checkDirectory = _FileShareRepository.Append(weekDirectory, $"-{headerId}");
|
|
httpResponseMessage = httpClient.GetAsync(checkDirectory);
|
|
httpResponseMessage.Wait();
|
|
if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
|
|
continue;
|
|
json = httpResponseMessage.Result.Content.ReadAsStringAsync();
|
|
json.Wait();
|
|
nginxFileSystemCollection = JsonSerializer.Deserialize(json.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray);
|
|
if (nginxFileSystemCollection is null)
|
|
continue;
|
|
foreach (NginxFileSystem nginxFileSystem in nginxFileSystemCollection)
|
|
files.Add(_FileShareRepository.Append(checkDirectory, nginxFileSystem.Name).AbsoluteUri);
|
|
if (files.Count != 0)
|
|
break;
|
|
}
|
|
result = files.Count == 0 ? null : files.First();
|
|
return result;
|
|
}
|
|
|
|
} |