Files
AdPlatform-Server/GoogleApi
2026-03-14 13:50:09 -07:00
..
2026-02-03 15:04:37 -08:00
2026-02-03 15:04:37 -08:00
2026-03-14 13:50:09 -07:00
2026-02-03 15:04:37 -08:00
2026-02-03 15:04:37 -08:00
2026-03-14 13:50:09 -07:00
2026-02-03 15:04:37 -08:00
2026-03-14 13:50:09 -07:00
2026-02-03 15:04:37 -08:00
2026-03-14 13:50:09 -07:00
2026-02-03 15:04:37 -08:00

GoogleApi Provider

Internal microservice that handles Google Ads API operations. Called by the Gateway via HTTP.

Architecture

┌──────────────┐         ┌──────────────┐         ┌──────────────────┐
│   Client     │ ──────► │   Gateway    │ ──────► │    GoogleApi     │
│              │         │  (external)  │         │   (internal)     │
└──────────────┘         └──────────────┘         └──────────────────┘
                               │                         │
                               │ X-Internal-Key          │
                               │ header auth             │
                               ▼                         ▼
                         POST /api/execute         POST /internal/execute

Local Development

# Run locally
cd GoogleApi
dotnet run

# Test health
curl http://localhost:5180/internal/health

# Test execute (with auth header)
curl -X POST http://localhost:5180/internal/execute \
  -H "Content-Type: application/json" \
  -H "X-Internal-Key: dev-test-key-12345" \
  -d '{"operation": "Ping", "requestId": "test-123"}'

# Test create campaign
curl -X POST http://localhost:5180/internal/execute \
  -H "Content-Type: application/json" \
  -H "X-Internal-Key: dev-test-key-12345" \
  -d '{
    "operation": "CreateCampaign",
    "tenantId": "1234567890",
    "requestId": "test-456",
    "payload": {
      "name": "Test Campaign",
      "budgetMicros": 10000000,
      "type": "Search"
    }
  }'

Supported Operations

Operation Description Payload
Ping Health check none
CreateCampaign Create a campaign name, budgetMicros, type, biddingStrategy
GetCampaign Get campaign details campaignId
UpdateCampaign Update campaign campaignId, name?, budgetMicros?, status?
ListCampaigns List all campaigns statusFilter?, pageSize?, pageToken?
GetCampaignStats Get campaign metrics campaignId, startDate?, endDate?
GetAccountStats Get account metrics startDate?, endDate?

Azure Deployment

First-time setup

# Create the container app (internal ingress)
az containerapp create \
  --name usim-adp-googleapi \
  --resource-group RG-GraeJones \
  --environment AdPlatform-env-20260114160411 \
  --image mcr.microsoft.com/dotnet/samples:aspnetapp \
  --target-port 8080 \
  --ingress internal \
  --min-replicas 1 \
  --max-replicas 3

# Set up managed identity for ACR (do this once)
az role assignment create \
  --assignee $(az containerapp show -n usim-adp-googleapi -g RG-GraeJones --query identity.principalId -o tsv) \
  --role AcrPull \
  --scope /subscriptions/ad4c8963-6467-4ccf-bdf6-208a73b0a2af/resourceGroups/RG-GraeJones/providers/Microsoft.ContainerRegistry/registries/adplatform20260114160834

# Configure registry with managed identity
az containerapp registry set \
  --name usim-adp-googleapi \
  --resource-group RG-GraeJones \
  --server adplatform20260114160834.azurecr.io \
  --identity system

# Set the internal key secret
az containerapp secret set \
  --name usim-adp-googleapi \
  --resource-group RG-GraeJones \
  --secrets google-internal-key="your-secret-key-here"

# Set environment variables
az containerapp update \
  --name usim-adp-googleapi \
  --resource-group RG-GraeJones \
  --set-env-vars "GOOGLE_INTERNAL_KEY=secretref:google-internal-key"

Publish from Visual Studio

  1. Right-click project → Publish
  2. Select the usim-adp-googleapi profile
  3. Click Publish

Publish from CLI

# Build and push to ACR
dotnet publish -c Release

# Or manually
az acr build --registry adplatform20260114160834 --image googleapi:$(date +%Y%m%d%H%M%S) .

# Update container app
az containerapp update \
  --name usim-adp-googleapi \
  --resource-group RG-GraeJones \
  --image adplatform20260114160834.azurecr.io/googleapi:<tag>

Verify deployment

# Check revision status
az containerapp revision list -n usim-adp-googleapi -g RG-GraeJones -o table

# Check logs
az containerapp logs show -n usim-adp-googleapi -g RG-GraeJones --type console
az containerapp logs show -n usim-adp-googleapi -g RG-GraeJones --type system

# Check env vars
az containerapp show -n usim-adp-googleapi -g RG-GraeJones --query "properties.template.containers[0].env"

Gateway Configuration

Update Gateway's environment variables to point to GoogleApi:

az containerapp update \
  --name usim-adp-gateway \
  --resource-group RG-GraeJones \
  --set-env-vars "GOOGLE_PROVIDER_URL=https://usim-adp-googleapi.internal.lemonbeach-1e8e273b.westus.azurecontainerapps.io"

Environment Variables

Variable Description Required
PORT HTTP listen port No (default: 8080)
GOOGLE_INTERNAL_KEY Shared secret for Gateway auth Yes
ASPNETCORE_ENVIRONMENT Runtime environment No

Troubleshooting

Container stuck in "Activating"

  1. Check system logs for image pull errors
  2. Verify ACR credentials/managed identity
  3. Verify image exists: az acr repository show-tags --name adplatform20260114160834 --repository googleapi

No console output

Check that Program.cs has explicit port binding:

var port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
builder.WebHost.UseUrls($"http://0.0.0.0:{port}");

Auth failures

  1. Verify GOOGLE_INTERNAL_KEY is set in both Gateway and GoogleApi
  2. Check the secret reference is correct: secretref:google-internal-key
  3. Test with curl using the -H "X-Internal-Key: ..." header