Connection.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Threading.Tasks;
  6. using BO.AppServer.Metadata.Dto;
  7. using BO.AppServer.Metadata.Enums;
  8. using BO.Connector;
  9. using Quadarax.Foundation.Core.Data.Interface.Entity.Dto;
  10. using Quadarax.Foundation.Core.Logging;
  11. namespace Connector.PS
  12. {
  13. public class Connection : AbstractConnection
  14. {
  15. #region *** Private fields ***
  16. protected override string ApiName => "PS";
  17. private string _psIdentifier;
  18. private IPAddress _ip;
  19. private int _poolSize;
  20. private long? _registrationId;
  21. #endregion
  22. #region *** Constructor ***
  23. public Connection(Uri uriApiBase, TimeSpan timeout,string psIdentifier,IPAddress ipAddress, int poolSize, ILogHandler log = null, bool isDumpContentEnabled = false) : base(uriApiBase, timeout, log, isDumpContentEnabled)
  24. {
  25. if (string.IsNullOrEmpty(psIdentifier))
  26. throw new ArgumentNullException(nameof(psIdentifier));
  27. _psIdentifier = psIdentifier;
  28. _ip = ipAddress ?? throw new ArgumentNullException(nameof(ipAddress));
  29. _poolSize = poolSize;
  30. }
  31. #endregion
  32. #region *** Public operations ***
  33. public async Task<IEnumerable<DocumentRDto>> GetDocumentsAsync(DocumentsScopeEnums scope)
  34. {
  35. if (!(scope == DocumentsScopeEnums.Pending || scope == DocumentsScopeEnums.Working))
  36. throw new ArgumentOutOfRangeException(
  37. $"Document list scope value must be '{DocumentsScopeEnums.Working}' or '{DocumentsScopeEnums.Pending}' int this context.");
  38. //{ticket}/ps/{registrationId}/new
  39. var result = scope == DocumentsScopeEnums.Pending
  40. ? await CallRequestAsync<ResultsValueDto<DocumentRDto>>($"{Ticket}/queue/{_registrationId}/pending",
  41. RestCallTypeEnum.Get)
  42. : await CallRequestAsync<ResultsValueDto<DocumentRDto>>($"{Ticket}/queue/{_registrationId}/working",
  43. RestCallTypeEnum.Get);
  44. return result.Values;
  45. }
  46. public async Task<DocumentStatusEnum> GetDocumentStateAsync(long documentId)
  47. {
  48. //{ticket}/queue/{registrationId}/document/{documentId}/status
  49. var result = await CallRequestAsync<ResultValueDto<PingDto>>($"{Ticket}/queue/{_registrationId}/document/{documentId}/status", RestCallTypeEnum.Get);
  50. return Enum.Parse<DocumentStatusEnum>(result.Value.Status);
  51. }
  52. public async Task<DocumentStatusEnum> SetDocumentStateAsync(long documentId, DocumentStatusEnum status)
  53. {
  54. if (!(status == DocumentStatusEnum.New || status == DocumentStatusEnum.Processing || status == DocumentStatusEnum.DoneOk || status == DocumentStatusEnum.DoneFail))
  55. throw new ArgumentOutOfRangeException(
  56. $"Document status value must be '{DocumentStatusEnum.New}' or '{DocumentStatusEnum.Processing}' or '{DocumentStatusEnum.DoneOk}' or '{DocumentStatusEnum.DoneFail}' in this context.");
  57. var result = await CallRequestAsync<ResultValueDto<PingDto>>($"{Ticket}/queue/{_registrationId}/document/{documentId}/status/{status}", RestCallTypeEnum.Put);
  58. return Enum.Parse<DocumentStatusEnum>(result.Value.Status);
  59. }
  60. public async Task<Stream> GetDocumentContentAsync(long documentId, long artifactId)
  61. {
  62. var result = await CallGetStreamAsync($"{Ticket}/queue/{_registrationId}/document/{documentId}/artifact/{artifactId}");
  63. return result;
  64. }
  65. public async Task<ArtifactRDto> SetDocumentContentAsync(long documentId, string fileName, string mimeType, bool overwriteIfExists, Stream contentStream)
  66. {
  67. CheckIsOpen();
  68. var result = await CallPostStreamMultipartAsync<ResultValueDto<ArtifactRDto>>($"{Ticket}/queue/{_registrationId}/document/{documentId}",fileName,contentStream,mimeType);
  69. return result.Value;
  70. }
  71. #endregion
  72. #region *** Private operations and overrides ***
  73. protected override void OnOpening()
  74. {
  75. base.OnOpening();
  76. var result = Task.Run(() => CallRequestAsync<ResultValueDto<RegistrationRDto>>($"{Ticket}/register", RestCallTypeEnum.Get, GetRegistration()));
  77. if (!result.Result.IsSuccess)
  78. throw result.Result.ToAggregateException();
  79. Log(LogSeverityEnum.Info,$"Process server '{_psIdentifier}' [{result.Result.Value.Id}] is registered.");
  80. }
  81. private RegistrationCDto GetRegistration()
  82. {
  83. return new RegistrationCDto()
  84. {
  85. LocationIp = _ip.ToString(),
  86. Psinstance = _psIdentifier,
  87. PoolSize = _poolSize,
  88. Id = _registrationId.GetValueOrDefault(0)
  89. };
  90. }
  91. #endregion
  92. }
  93. }