/ ProjectPlugins / CodexClient / MarketplaceAccess.cs
MarketplaceAccess.cs
  1  using CodexClient.Hooks;
  2  using Logging;
  3  using Utils;
  4  
  5  namespace CodexClient
  6  {
  7      public interface IMarketplaceAccess
  8      {
  9          string MakeStorageAvailable(CreateStorageAvailability availability);
 10          StorageAvailability[] GetAvailabilities();
 11          IStoragePurchaseContract RequestStorage(StoragePurchaseRequest purchase);
 12      }
 13  
 14      public class MarketplaceAccess : IMarketplaceAccess
 15      {
 16          private readonly ILog log;
 17          private readonly CodexAccess codexAccess;
 18          private readonly ICodexNodeHooks hooks;
 19  
 20          public MarketplaceAccess(ILog log, CodexAccess codexAccess, ICodexNodeHooks hooks)
 21          {
 22              this.log = log;
 23              this.codexAccess = codexAccess;
 24              this.hooks = hooks;
 25          }
 26  
 27          public IStoragePurchaseContract RequestStorage(StoragePurchaseRequest purchase)
 28          {
 29              purchase.Log(log);
 30              var swResult = Stopwatch.Measure(log, nameof(RequestStorage), () =>
 31              {
 32                  return codexAccess.RequestStorage(purchase);
 33              });
 34  
 35              var response = swResult.Value;
 36  
 37              if (string.IsNullOrEmpty(response) ||
 38                  response == "Unable to encode manifest" ||
 39                  response == "Purchasing not available" ||
 40                  response == "Expiry required" ||
 41                  response == "Expiry needs to be in future" ||
 42                  response == "Expiry has to be before the request's end (now + duration)")
 43              {
 44                  throw new InvalidOperationException(response);
 45              }
 46  
 47              Log($"Storage requested successfully. PurchaseId: '{response}'.");
 48  
 49              var logName = $"<Purchase-{response.Substring(0, 3)}>";
 50              log.AddStringReplace(response, logName);
 51              log.AddStringReplace(response.ToLowerInvariant(), logName);
 52              return new StoragePurchaseContract(log, codexAccess, response, purchase, hooks);
 53          }
 54  
 55          public string MakeStorageAvailable(CreateStorageAvailability availability)
 56          {
 57              availability.Log(log);
 58  
 59              var response = codexAccess.SalesAvailability(availability);
 60  
 61              Log($"Storage successfully made available. Id: {response.Id}");
 62              hooks.OnStorageAvailabilityCreated(response);
 63  
 64              return response.Id;
 65          }
 66  
 67          public StorageAvailability[] GetAvailabilities()
 68          {
 69              var result = codexAccess.GetAvailabilities();
 70              Log($"Got {result.Length} availabilities:");
 71              foreach (var a in result) a.Log(log);
 72              return result;
 73          }
 74  
 75          private void Log(string msg)
 76          {
 77              log.Log($"{codexAccess.GetName()} {msg}");
 78          }
 79      }
 80  
 81      public class MarketplaceUnavailable : IMarketplaceAccess
 82      {
 83          public string MakeStorageAvailable(CreateStorageAvailability availability)
 84          {
 85              Unavailable();
 86              throw new NotImplementedException();
 87          }
 88  
 89          public IStoragePurchaseContract RequestStorage(StoragePurchaseRequest purchase)
 90          {
 91              Unavailable();
 92              throw new NotImplementedException();
 93          }
 94  
 95          public StorageAvailability[] GetAvailabilities()
 96          {
 97              Unavailable();
 98              throw new NotImplementedException();
 99          }
100  
101          private void Unavailable()
102          {
103              FrameworkAssert.Fail("Incorrect test setup: Marketplace was not enabled for this group of Codex nodes. Add 'EnableMarketplace(...)' after 'SetupCodexNodes()' to enable it.");
104              throw new InvalidOperationException();
105          }
106      }
107  }