- Add startup wizard module for first-run configuration - Add white-label branding system with .product file support - Add bot manager for lifecycle, MinIO buckets, and templates - Add version tracking registry for component updates - Create comparison doc: BASIC vs n8n/Zapier/Make/Copilot - Add WhatsApp-style sample dialogs to template documentation - Add data traceability SVG diagram ```
301 lines
9.6 KiB
QBasic
301 lines
9.6 KiB
QBasic
' API Integration Bot - Demonstrates HTTP & API operations keywords
|
|
' This template shows how to use POST, PUT, PATCH, DELETE HTTP, GRAPHQL, SOAP, and SET HEADER
|
|
|
|
' ============================================================================
|
|
' WEBHOOK: External systems can trigger API operations via HTTP POST
|
|
' Endpoint: /api/office/webhook/api-gateway
|
|
' ============================================================================
|
|
WEBHOOK "api-gateway"
|
|
|
|
TALK "API Integration Bot initialized..."
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 1: Basic REST API calls with authentication
|
|
' ============================================================================
|
|
|
|
' Set up authentication headers (reused for subsequent requests)
|
|
api_key = GET BOT MEMORY("external_api_key")
|
|
SET HEADER "Authorization", "Bearer " + api_key
|
|
SET HEADER "Content-Type", "application/json"
|
|
SET HEADER "X-Client-ID", "office-bot"
|
|
|
|
' GET request (using existing GET keyword)
|
|
users = GET "https://api.example.com/users"
|
|
TALK "Retrieved " + UBOUND(users) + " users from API"
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 2: POST - Create new resources
|
|
' ============================================================================
|
|
|
|
' Create a new customer
|
|
new_customer = #{
|
|
"name": "John Doe",
|
|
"email": "john.doe@example.com",
|
|
"phone": "+1-555-0123",
|
|
"company": "Acme Corp",
|
|
"tier": "enterprise"
|
|
}
|
|
|
|
create_response = POST "https://api.example.com/customers", new_customer
|
|
|
|
IF create_response.status = 201 THEN
|
|
TALK "Customer created successfully with ID: " + create_response.data.id
|
|
SET BOT MEMORY "last_customer_id", create_response.data.id
|
|
ELSE
|
|
TALK "Failed to create customer: " + create_response.data.error
|
|
END IF
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 3: PUT - Full resource update
|
|
' ============================================================================
|
|
|
|
' Update entire customer record
|
|
customer_id = GET BOT MEMORY("last_customer_id")
|
|
|
|
updated_customer = #{
|
|
"name": "John Doe",
|
|
"email": "john.doe@newdomain.com",
|
|
"phone": "+1-555-9999",
|
|
"company": "Acme Corp International",
|
|
"tier": "enterprise",
|
|
"status": "active",
|
|
"updated_at": NOW()
|
|
}
|
|
|
|
put_response = PUT "https://api.example.com/customers/" + customer_id, updated_customer
|
|
|
|
IF put_response.status = 200 THEN
|
|
TALK "Customer fully updated"
|
|
END IF
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 4: PATCH - Partial resource update
|
|
' ============================================================================
|
|
|
|
' Update only specific fields
|
|
partial_update = #{
|
|
"tier": "premium",
|
|
"notes": "Upgraded from enterprise plan"
|
|
}
|
|
|
|
patch_response = PATCH "https://api.example.com/customers/" + customer_id, partial_update
|
|
|
|
IF patch_response.status = 200 THEN
|
|
TALK "Customer tier upgraded to premium"
|
|
END IF
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 5: DELETE_HTTP - Remove resources
|
|
' ============================================================================
|
|
|
|
' Delete a temporary resource
|
|
temp_resource_id = "temp-12345"
|
|
delete_response = DELETE HTTP "https://api.example.com/temp-files/" + temp_resource_id
|
|
|
|
IF delete_response.status = 204 OR delete_response.status = 200 THEN
|
|
TALK "Temporary resource deleted"
|
|
END IF
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 6: Working with multiple APIs
|
|
' ============================================================================
|
|
|
|
' Clear headers and set new ones for different API
|
|
CLEAR HEADERS
|
|
|
|
' Stripe-style API authentication
|
|
SET HEADER "Authorization", "Basic " + GET BOT MEMORY("stripe_api_key")
|
|
SET HEADER "Content-Type", "application/x-www-form-urlencoded"
|
|
|
|
' Create a payment intent
|
|
payment_data = #{
|
|
"amount": 2999,
|
|
"currency": "usd",
|
|
"customer": "cus_abc123",
|
|
"description": "Order #12345"
|
|
}
|
|
|
|
payment_response = POST "https://api.stripe.com/v1/payment_intents", payment_data
|
|
|
|
IF payment_response.status = 200 THEN
|
|
payment_intent_id = payment_response.data.id
|
|
client_secret = payment_response.data.client_secret
|
|
TALK "Payment intent created: " + payment_intent_id
|
|
END IF
|
|
|
|
CLEAR HEADERS
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 7: GraphQL API calls
|
|
' ============================================================================
|
|
|
|
' Query users with GraphQL
|
|
graphql_query = "query GetUsers($limit: Int!, $status: String) { users(first: $limit, status: $status) { id name email role createdAt } }"
|
|
|
|
graphql_vars = #{
|
|
"limit": 10,
|
|
"status": "active"
|
|
}
|
|
|
|
graphql_response = GRAPHQL "https://api.example.com/graphql", graphql_query, graphql_vars
|
|
|
|
IF graphql_response.status = 200 THEN
|
|
users = graphql_response.data.data.users
|
|
FOR EACH user IN users
|
|
TALK "User: " + user.name + " (" + user.email + ")"
|
|
NEXT user
|
|
END IF
|
|
|
|
' GraphQL mutation example
|
|
mutation_query = "mutation CreateTask($input: TaskInput!) { createTask(input: $input) { id title status assignee { name } } }"
|
|
|
|
mutation_vars = #{
|
|
"input": #{
|
|
"title": "Review quarterly report",
|
|
"description": "Review and approve Q4 financial report",
|
|
"assigneeId": "user-456",
|
|
"dueDate": FORMAT(DATEADD(TODAY(), "day", 7), "yyyy-MM-dd"),
|
|
"priority": "high"
|
|
}
|
|
}
|
|
|
|
mutation_response = GRAPHQL "https://api.example.com/graphql", mutation_query, mutation_vars
|
|
|
|
IF mutation_response.status = 200 THEN
|
|
task = mutation_response.data.data.createTask
|
|
TALK "Task created: " + task.title + " (assigned to " + task.assignee.name + ")"
|
|
END IF
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 8: SOAP API calls (Legacy system integration)
|
|
' ============================================================================
|
|
|
|
' Call a SOAP web service for legacy ERP integration
|
|
soap_params = #{
|
|
"customerNumber": "CUST-001",
|
|
"orderDate": FORMAT(TODAY(), "yyyy-MM-dd"),
|
|
"productCode": "PRD-12345",
|
|
"quantity": 5
|
|
}
|
|
|
|
soap_response = SOAP "https://erp.legacy.example.com/OrderService.wsdl", "CreateOrder", soap_params
|
|
|
|
IF soap_response.status = 200 THEN
|
|
order_number = soap_response.data.raw
|
|
TALK "Legacy order created: " + order_number
|
|
END IF
|
|
|
|
' Another SOAP call - Get inventory status
|
|
inventory_params = #{
|
|
"warehouseCode": "WH-01",
|
|
"productCode": "PRD-12345"
|
|
}
|
|
|
|
inventory_response = SOAP "https://erp.legacy.example.com/InventoryService.wsdl", "GetStock", inventory_params
|
|
TALK "Current stock level retrieved from legacy system"
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 9: Chained API calls (workflow)
|
|
' ============================================================================
|
|
|
|
TALK "Starting order fulfillment workflow..."
|
|
|
|
' Step 1: Create order in main system
|
|
SET HEADER "Authorization", "Bearer " + api_key
|
|
|
|
order_data = #{
|
|
"customer_id": customer_id,
|
|
"items": [
|
|
#{ "sku": "WIDGET-001", "quantity": 2, "price": 29.99 },
|
|
#{ "sku": "GADGET-002", "quantity": 1, "price": 49.99 }
|
|
],
|
|
"shipping_address": #{
|
|
"street": "123 Main St",
|
|
"city": "Anytown",
|
|
"state": "CA",
|
|
"zip": "90210"
|
|
}
|
|
}
|
|
|
|
order_response = POST "https://api.example.com/orders", order_data
|
|
order_id = order_response.data.id
|
|
|
|
' Step 2: Request shipping quote
|
|
shipping_request = #{
|
|
"origin_zip": "10001",
|
|
"destination_zip": "90210",
|
|
"weight_lbs": 5,
|
|
"dimensions": #{ "length": 12, "width": 8, "height": 6 }
|
|
}
|
|
|
|
shipping_response = POST "https://api.shipping.com/quotes", shipping_request
|
|
shipping_cost = shipping_response.data.rate
|
|
|
|
' Step 3: Update order with shipping info
|
|
shipping_update = #{
|
|
"shipping_method": shipping_response.data.service,
|
|
"shipping_cost": shipping_cost,
|
|
"estimated_delivery": shipping_response.data.estimated_delivery
|
|
}
|
|
|
|
PATCH "https://api.example.com/orders/" + order_id, shipping_update
|
|
|
|
' Step 4: Notify warehouse
|
|
warehouse_notification = #{
|
|
"order_id": order_id,
|
|
"priority": "standard",
|
|
"ship_by": FORMAT(DATEADD(TODAY(), "day", 2), "yyyy-MM-dd")
|
|
}
|
|
|
|
POST "https://api.warehouse.example.com/pick-requests", warehouse_notification
|
|
|
|
TALK "Order fulfillment workflow complete for order: " + order_id
|
|
|
|
CLEAR HEADERS
|
|
|
|
' ============================================================================
|
|
' EXAMPLE 10: Error handling and retries
|
|
' ============================================================================
|
|
|
|
' Attempt API call with error handling
|
|
max_retries = 3
|
|
retry_count = 0
|
|
success = false
|
|
|
|
WHILE retry_count < max_retries AND success = false
|
|
SET HEADER "Authorization", "Bearer " + api_key
|
|
|
|
health_check = GET "https://api.example.com/health"
|
|
|
|
IF health_check.status = 200 THEN
|
|
success = true
|
|
TALK "API health check passed"
|
|
ELSE
|
|
retry_count = retry_count + 1
|
|
TALK "API check failed, attempt " + retry_count + " of " + max_retries
|
|
WAIT 2
|
|
END IF
|
|
|
|
CLEAR HEADERS
|
|
WEND
|
|
|
|
IF success = false THEN
|
|
TALK "API is currently unavailable after " + max_retries + " attempts"
|
|
END IF
|
|
|
|
' ============================================================================
|
|
' Return webhook response with summary
|
|
' ============================================================================
|
|
|
|
result = #{
|
|
"status": "success",
|
|
"timestamp": NOW(),
|
|
"operations_completed": #{
|
|
"customers_created": 1,
|
|
"orders_processed": 1,
|
|
"api_calls_made": 12
|
|
},
|
|
"integrations_tested": ["REST", "GraphQL", "SOAP"]
|
|
}
|
|
|
|
TALK "API Integration examples completed!"
|