ConnectionProxy.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Abstractions;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using BO.AppServer.Metadata.Dto;
  8. using BO.AppServer.Metadata.Enums;
  9. using BO.ProcessServer.Options;
  10. using Connector.PS;
  11. using Quadarax.Foundation.Core.IO.MimeTypes;
  12. using Quadarax.Foundation.Core.Object;
  13. using Quadarax.Foundation.Core.Value.Extensions;
  14. namespace BO.ProcessServer.Business
  15. {
  16. internal class ConnectionProxy : DisposableObject, IConnectionPS
  17. {
  18. #region *** Private fields ***
  19. private Configuration _configuration;
  20. private Random _rand;
  21. private IList<DocumentRDto> _documentsCache;
  22. private IFileSystem _fileSystem;
  23. private long _currentDocId;
  24. private long _currentArtId;
  25. #endregion
  26. #region *** Properties ***
  27. public bool IsOpen { get; private set; }
  28. #endregion
  29. #region *** Constructor ***
  30. public ConnectionProxy(Configuration configuration, IFileSystem fileSystem)
  31. {
  32. _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
  33. _rand = new Random();
  34. _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
  35. _documentsCache = new List<DocumentRDto>();
  36. _currentDocId = _rand.Next(1, 1000);
  37. _currentArtId = _rand.Next(1, 10) * _currentDocId;
  38. }
  39. #endregion
  40. #region *** Public Operations ***
  41. public async Task<IEnumerable<DocumentRDto>> GetDocumentsAsync(DocumentsScopeEnums scope)
  42. {
  43. if (!(scope == DocumentsScopeEnums.Pending || scope == DocumentsScopeEnums.Working))
  44. throw new ArgumentOutOfRangeException(
  45. $"Document list scope value must be '{DocumentsScopeEnums.Working}' or '{DocumentsScopeEnums.Pending}' int this context.");
  46. if (_documentsCache.Count(x=>x.Status == DocumentStatusEnum.New) + _configuration.System.Proxy.App.DefaultDocumentsCount < _configuration.System.Proxy.App.MaxDocumentsCount)
  47. GenerateDocuments(DocumentStatusEnum.New);
  48. var documents = _documentsCache.Where(x => x.Status == DocumentStatusEnum.New)
  49. .Take(_configuration.System.PoolPullDocuments).ToArray();
  50. foreach (var document in documents)
  51. document.Status = DocumentStatusEnum.Pending;
  52. return documents;
  53. }
  54. public async Task<DocumentStatusEnum> GetDocumentStateAsync(long documentId)
  55. {
  56. return _documentsCache.Where(x => x.Id == documentId).Select(x=>x.Status).First();
  57. }
  58. public async Task<DocumentRDto> GetDocumentInfoAsync(long documentId)
  59. {
  60. return _documentsCache.First(x => x.Id == documentId);
  61. }
  62. public async Task<DocumentStatusEnum> SetDocumentStateAsync(long documentId, DocumentStatusEnum status)
  63. {
  64. if (!(status == DocumentStatusEnum.New || status == DocumentStatusEnum.Processing || status == DocumentStatusEnum.DoneOk || status == DocumentStatusEnum.DoneFail))
  65. throw new ArgumentOutOfRangeException(
  66. $"Document status value must be '{DocumentStatusEnum.New}' or '{DocumentStatusEnum.Processing}' or '{DocumentStatusEnum.DoneOk}' or '{DocumentStatusEnum.DoneFail}' in this context.");
  67. var document = _documentsCache.First(x => x.Id == documentId);
  68. document.Status = status;
  69. return status;
  70. }
  71. public async Task<Stream> GetDocumentContentAsync(long documentId, long artifactId)
  72. {
  73. var sw = new StreamWriter(new MemoryStream());
  74. await sw.WriteLineAsync("This is a mock data");
  75. await sw.FlushAsync();
  76. sw.BaseStream.Seek(0, SeekOrigin.Begin);
  77. return sw.BaseStream;
  78. }
  79. public async Task<ArtifactRDto> SetDocumentContentAsync(long documentId, string fileName, string mimeType, bool overwriteIfExists, Stream contentStream)
  80. {
  81. var document = _documentsCache.First(x => x.Id == documentId);
  82. var artifacts = new List<ArtifactRDto>(document.Artifacts);
  83. _currentArtId++;
  84. var artifact = new ArtifactRDto()
  85. {
  86. Length = contentStream.Length,
  87. Type = ArtifactTypeEnum.Output,
  88. MimeType = mimeType,
  89. Extension = _fileSystem.Path.GetExtension(fileName),
  90. Id = _currentArtId
  91. };
  92. artifacts.Add(artifact);
  93. document.Artifacts = artifacts;
  94. return artifact;
  95. }
  96. public void Open(string userName, string userPassword, string magicKey)
  97. {
  98. IsOpen = true;
  99. }
  100. public void Close()
  101. {
  102. IsOpen = false;
  103. }
  104. public bool Ping(out TimeSpan duration, out string status)
  105. {
  106. duration = TimeSpan.FromMilliseconds(_rand.Next(2000));
  107. status = "OK";
  108. return true;
  109. }
  110. #endregion
  111. #region *** Private Operations & Overrides ***
  112. protected override void OnDisposing()
  113. {
  114. _configuration = null;
  115. }
  116. protected void GenerateDocuments(DocumentStatusEnum state)
  117. {
  118. for (int a = 0; a < _configuration.System.Proxy.App.DefaultDocumentsCount; a++)
  119. {
  120. var artifacts = new List<ArtifactRDto>();
  121. for (int i = 0; i < _configuration.System.Proxy.App.DefaultArtifactCount; i++)
  122. {
  123. var ext = _configuration.System.Proxy.App.Extension.GetRandom();
  124. var artifact = new ArtifactRDto()
  125. {
  126. Id = _currentArtId++,
  127. Name = $"{_configuration.System.Proxy.App.NameProfix.GetRandom()}_{_currentArtId:D8}",
  128. Extension = ext,
  129. MimeType = MimeTypeUtil.GetMimeType(ext),
  130. Type = ArtifactTypeEnum.Input
  131. };
  132. artifacts.Add(artifact);
  133. }
  134. var document = new DocumentRDto()
  135. {
  136. Name = $"Doc{_currentDocId++:D8}",
  137. Id = _currentDocId,
  138. PresetCreditCost = _configuration.System.Proxy.App.PresetCreditCost.GetRandom(),
  139. PresetQuality = _configuration.System.Proxy.App.PresetQuality.GetRandom(),
  140. PresetProcessProfile = _configuration.System.Proxy.App.PresetProcessProfile.GetRandom(),
  141. PresetWatermark = _configuration.System.Proxy.App.PresetWatermark.GetRandom(),
  142. PresetTest = _configuration.System.Proxy.App.PresetTest.GetRandom(),
  143. Status = state,
  144. Artifacts = artifacts
  145. };
  146. _documentsCache.Add(document);
  147. }
  148. var toDelete = _documentsCache.Where(x =>
  149. x.Status == DocumentStatusEnum.DoneFail || x.Status == DocumentStatusEnum.DoneOk ||
  150. x.Status == DocumentStatusEnum.Downloaded || x.Status == DocumentStatusEnum.Expired).ToArray();
  151. foreach (var del in toDelete)
  152. _documentsCache.Remove(del);
  153. }
  154. #endregion
  155. }
  156. }