From 3fd8ceb53945a75a4d698854151394fa02b6f834 Mon Sep 17 00:00:00 2001 From: Ivan Tustanivskyi Date: Thu, 28 Aug 2025 12:00:44 +0300 Subject: [PATCH 1/3] Change chekout endpoint to flask --- Source/SentryTower/SentryTowerGameInstance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/SentryTower/SentryTowerGameInstance.cpp b/Source/SentryTower/SentryTowerGameInstance.cpp index eaba754..4bd14d7 100644 --- a/Source/SentryTower/SentryTowerGameInstance.cpp +++ b/Source/SentryTower/SentryTowerGameInstance.cpp @@ -85,7 +85,7 @@ void USentryTowerGameInstance::BuyUpgrade(const FOnBuyComplete& OnBuyComplete) ProcessSpan->Finish(); USentrySpan* CheckoutSpan = CheckoutTransaction->StartChildSpan(TEXT("task"), TEXT("checkout_request")); - FString Domain = TEXT("https://aspnetcore.empower-plant.com"); + FString Domain = TEXT("https://flask.empower-plant.com"); FString Endpoint = TEXT("/checkout"); FString CheckoutURL = Domain + Endpoint; From eee081eaab22ad5bba73f4d898ff04b91009635f Mon Sep 17 00:00:00 2001 From: Ivan Tustanivskyi Date: Thu, 28 Aug 2025 12:01:05 +0300 Subject: [PATCH 2/3] Build dummy request payload --- .../SentryTower/SentryTowerGameInstance.cpp | 59 ++++++++++++++++++- Source/SentryTower/SentryTowerGameInstance.h | 3 + 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/Source/SentryTower/SentryTowerGameInstance.cpp b/Source/SentryTower/SentryTowerGameInstance.cpp index 4bd14d7..55d78ee 100644 --- a/Source/SentryTower/SentryTowerGameInstance.cpp +++ b/Source/SentryTower/SentryTowerGameInstance.cpp @@ -69,9 +69,7 @@ void USentryTowerGameInstance::BuyUpgrade(const FOnBuyComplete& OnBuyComplete) USentrySpan* ProcessSpan = CheckoutTransaction->StartChildSpan(TEXT("task"), TEXT("process_upgrade_data")); - TSharedPtr UpgradeDataJsonObject = MakeShareable(new FJsonObject()); - UpgradeDataJsonObject->SetStringField(TEXT("UpgradeName"), TEXT("NewTower")); - UpgradeDataJsonObject->SetStringField(TEXT("PlayerEmail"), TEXT("player@sentry-tower.com")); + TSharedPtr UpgradeDataJsonObject = BuildCheckoutRequestJson(); FString JsonString; TSharedRef> Writer = TJsonWriterFactory<>::Create(&JsonString); @@ -96,6 +94,14 @@ void USentryTowerGameInstance::BuyUpgrade(const FOnBuyComplete& OnBuyComplete) HttpRequest->SetVerb("POST"); HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); + FString TraceKey; + FString TraceValue; + CheckoutSpan->GetTrace(TraceKey, TraceValue); + + UE_LOG(LogTemp, Log, TEXT("TraceValue - %s"), *TraceValue); + + HttpRequest->SetHeader(TraceKey, TraceValue); + HttpRequest->SetContentAsString(JsonString); HttpRequest->OnProcessRequestComplete().BindLambda([=](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) @@ -122,3 +128,50 @@ void USentryTowerGameInstance::BuyUpgrade(const FOnBuyComplete& OnBuyComplete) HttpRequest->ProcessRequest(); } + +TSharedPtr USentryTowerGameInstance::BuildCheckoutRequestJson() +{ + TSharedPtr JsonObject = MakeShareable(new FJsonObject()); + + // Build cart object + TSharedPtr CartObject = MakeShareable(new FJsonObject()); + + // Build items array + TArray> ItemsArray; + TSharedPtr ItemObject = MakeShareable(new FJsonObject()); + ItemObject->SetStringField(TEXT("description"), TEXT("The mood ring for plants.")); + ItemObject->SetStringField(TEXT("descriptionfull"), TEXT("This is an example of what you can do with just a few things, a little imagination and a happy dream in your heart. I'm a water fanatic. I love water. There's not a thing in the world wrong with washing your brush. Everybody needs a friend. Here we're limited by the time we have.")); + ItemObject->SetNumberField(TEXT("id"), 3); + ItemObject->SetStringField(TEXT("img"), TEXT("https://storage.googleapis.com/application-monitoring/mood-planter.jpg")); + ItemObject->SetStringField(TEXT("imgcropped"), TEXT("https://storage.googleapis.com/application-monitoring/mood-planter-cropped.jpg")); + ItemObject->SetNumberField(TEXT("price"), 155); + ItemObject->SetArrayField(TEXT("reviews"), TArray>()); + ItemObject->SetStringField(TEXT("title"), TEXT("Plant Mood")); + ItemsArray.Add(MakeShareable(new FJsonValueObject(ItemObject))); + CartObject->SetArrayField(TEXT("items"), ItemsArray); + + // Build quantities object + TSharedPtr QuantitiesObject = MakeShareable(new FJsonObject()); + QuantitiesObject->SetNumberField(TEXT("3"), 3); + CartObject->SetObjectField(TEXT("quantities"), QuantitiesObject); + CartObject->SetNumberField(TEXT("total"), 465); + + // Build form object + TSharedPtr FormObject = MakeShareable(new FJsonObject()); + FormObject->SetStringField(TEXT("address"), TEXT("")); + FormObject->SetStringField(TEXT("city"), TEXT("")); + FormObject->SetStringField(TEXT("country"), TEXT("")); + FormObject->SetStringField(TEXT("email"), TEXT("sampleEmail@email.com")); + FormObject->SetStringField(TEXT("firstName"), TEXT("")); + FormObject->SetStringField(TEXT("lastName"), TEXT("")); + FormObject->SetStringField(TEXT("state"), TEXT("")); + FormObject->SetStringField(TEXT("subscribe"), TEXT("")); + FormObject->SetStringField(TEXT("zipCode"), TEXT("")); + + // Set all objects to main JSON + JsonObject->SetObjectField(TEXT("cart"), CartObject); + JsonObject->SetObjectField(TEXT("form"), FormObject); + JsonObject->SetStringField(TEXT("validate_inventory"), TEXT("true")); + + return JsonObject; +} diff --git a/Source/SentryTower/SentryTowerGameInstance.h b/Source/SentryTower/SentryTowerGameInstance.h index 99e3823..efd31b8 100644 --- a/Source/SentryTower/SentryTowerGameInstance.h +++ b/Source/SentryTower/SentryTowerGameInstance.h @@ -18,4 +18,7 @@ class SENTRYTOWER_API USentryTowerGameInstance : public UGameInstance UFUNCTION(BlueprintCallable, Meta = (AutoCreateRefTerm = "OnBuyComplete")) void BuyUpgrade(const FOnBuyComplete& OnBuyComplete); + +private: + TSharedPtr BuildCheckoutRequestJson(); }; From 8bb487e2f06a102b4cdffa9bf80e20d5319c1960 Mon Sep 17 00:00:00 2001 From: Ivan Tustanivskyi Date: Thu, 28 Aug 2025 12:02:58 +0300 Subject: [PATCH 3/3] Temp hack to bind spans/transactions to current scope --- .../Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp | 3 +++ .../GenericPlatform/GenericPlatformSentryTransaction.cpp | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Plugins/Sentry/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp b/Plugins/Sentry/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp index a4cf4d7..0795226 100644 --- a/Plugins/Sentry/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp +++ b/Plugins/Sentry/Source/Sentry/Private/GenericPlatform/GenericPlatformSentrySubsystem.cpp @@ -611,6 +611,9 @@ TSharedPtr FGenericPlatformSentrySubsystem::StartTransaction { if (sentry_transaction_t* nativeTransaction = sentry_transaction_start(platformTransactionContext->GetNativeObject(), sentry_value_new_null())) { + // TODO: Replace this hack with a proper transaction binding to the current scope + sentry_set_transaction_object(nativeTransaction); + return MakeShareable(new FGenericPlatformSentryTransaction(nativeTransaction)); } } diff --git a/Plugins/Sentry/Source/Sentry/Private/GenericPlatform/GenericPlatformSentryTransaction.cpp b/Plugins/Sentry/Source/Sentry/Private/GenericPlatform/GenericPlatformSentryTransaction.cpp index 917c377..8646207 100644 --- a/Plugins/Sentry/Source/Sentry/Private/GenericPlatform/GenericPlatformSentryTransaction.cpp +++ b/Plugins/Sentry/Source/Sentry/Private/GenericPlatform/GenericPlatformSentryTransaction.cpp @@ -28,6 +28,8 @@ TSharedPtr FGenericPlatformSentryTransaction::StartChildSpan(const { if (sentry_span_t* nativeSpan = sentry_transaction_start_child(Transaction, TCHAR_TO_ANSI(*operation), TCHAR_TO_ANSI(*description))) { + // TODO: Replace this hack with a proper span binding to the current scope + sentry_set_span(nativeSpan); return MakeShareable(new FGenericPlatformSentrySpan(nativeSpan)); } else