/// <inheritdoc /> public ReserveProfileResult ReserveProfile(ProfileReserveRequest reserveRequest) { var result = new ReserveProfileResult(); var t2Node = this.xServerPeerList.GetPeers().Where(n => n.Tier == (int)TierLevel.Two).OrderBy(n => n.ResponseTime).FirstOrDefault(); if (t2Node != null) { string xServerURL = Utils.GetServerUrl(t2Node.NetworkProtocol, t2Node.NetworkAddress, t2Node.NetworkPort); var client = new RestClient(xServerURL); client.UseNewtonsoftJson(); var reserveProfileRequest = new RestRequest("/reserveprofile", Method.POST); var request = JsonConvert.SerializeObject(reserveRequest); reserveProfileRequest.AddParameter("application/json; charset=utf-8", request, ParameterType.RequestBody); reserveProfileRequest.RequestFormat = DataFormat.Json; var reserveProfileResult = client.Execute <ReserveProfileResult>(reserveProfileRequest); if (reserveProfileResult.StatusCode == HttpStatusCode.OK) { if (reserveProfileResult.Data == null) { result.Success = false; } else { result = reserveProfileResult.Data; result.Success = true; } } else { var errorResponse = JsonConvert.DeserializeObject <ErrorResponse>(reserveProfileResult.Content); if (errorResponse != null) { result.ResultMessage = errorResponse.errors[0].message; } else { result.ResultMessage = "Failed to access xServer"; } result.Success = false; } } else { result.ResultMessage = "Not connected to any tier 2 servers"; } return(result); }
/// <summary> /// Register a new profile. /// </summary> public async Task <ReserveProfileResult> ReserveProfile(ProfileReserveRequest profileRegisterRequest) { ReserveProfileResult result = new ReserveProfileResult(); if (!networkFeatures.ProfileExists(profileRegisterRequest.Name, profileRegisterRequest.KeyAddress)) { bool isProfileKeyValid = await networkFeatures.IsProfileKeyValid(profileRegisterRequest.Name, profileRegisterRequest.KeyAddress, profileRegisterRequest.ReturnAddress, profileRegisterRequest.Signature); if (!isProfileKeyValid) { result.Success = false; result.ResultMessage = "Profile validation failed."; return(result); } // Price Lock ID does not exist, this is a new request, so let's create a price lock ID for it, and reserve the name. var profilePriceLockRequest = new CreatePriceLockRequest() { DestinationAddress = networkFeatures.GetMyFeeAddress(), RequestAmount = 5, // $5 RequestAmountPair = 1, // USD ExpireBlock = 15 }; var newPriceLock = await networkFeatures.CreateNewPriceLock(profilePriceLockRequest); if (newPriceLock == null || string.IsNullOrEmpty(newPriceLock?.PriceLockId) || newPriceLock?.ExpireBlock <= 0) { result.Success = false; result.ResultMessage = "Failed to acquire a price lock"; return(result); } int status = (int)Status.Reserved; var newProfile = new ProfileReservationData() { Name = profileRegisterRequest.Name, KeyAddress = profileRegisterRequest.KeyAddress, ReturnAddress = profileRegisterRequest.ReturnAddress, PriceLockId = newPriceLock.PriceLockId, Signature = profileRegisterRequest.Signature, Status = status, ReservationExpirationBlock = newPriceLock.ExpireBlock, Relayed = false }; using (X42DbContext dbContext = new X42DbContext(databaseSettings.ConnectionString)) { var newRecord = dbContext.ProfileReservations.Add(newProfile); if (newRecord.State == EntityState.Added) { dbContext.SaveChanges(); result.PriceLockId = newPriceLock.PriceLockId; result.Status = status; result.Success = true; } else { result.Status = (int)Status.Rejected; result.ResultMessage = "Failed to add profile."; result.Success = false; } } } else { result.Status = (int)Status.Rejected; result.Success = false; result.ResultMessage = "Profile already exists."; } return(result); }