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 }