KbankGetUser Lambda Function
Quick Reference
- Function Name:
payment3-kbank-get-user-${BRANCH} - Handler:
queryuser.lambda_handler - Runtime: Python 3.12 (Docker Image)
- Trigger: API Gateway (GET /kbank/user)
- Template.yaml: Lines 581-607
Function Overview
The KbankGetUser function queries KBank user mappings from KBankUserMappingTable. It retrieves the KBank user ID for a given Villa user ID. This function is exposed via API Gateway for external queries.
Entry Point
File: functions/kbankuser/queryuser.py
Handler: lambda_handler(event, context)
def lambda_handler(event, context):
try:
# Extract request body
params = event.get("queryStringParameters", {})
print(f"Request params: {json.dumps(params, indent=2)}")
# Required fields
required_fields = ["user_id"]
for field in required_fields:
if field not in params:
return {
"statusCode": 400,
"body": json.dumps({"error": f"Missing required field: {field}"}),
}
user_id = params["user_id"]
print(f"User ID: {user_id}")
# Check if user already exists in DynamoDB
existing_user = get_user_from_dynamodb(user_id)
print(f"Existing user: {existing_user}")
if not existing_user:
return {
"statusCode": 404,
"body": json.dumps(
{
"message": "User doesnt exist",
}
),
}
return {
"statusCode": 200,
"body": json.dumps(
{
"user_id": user_id,
"kbank_id": existing_user.kbank_id,
}
),
}
except Exception as e:
print(f"Error in lambda_handler: {str(e)}")
sentry_sdk.capture_exception(e)
return {
"statusCode": 500,
"body": json.dumps({"error": "Internal server error", "details": str(e)}),
}
Event Structure
API Gateway Event
Path: GET /kbank/user?user_id={user_id}
Auth: NONE (public endpoint)
Query Parameters:
user_id- Villa user ID (required)
Response (Success):
{
"statusCode": 200,
"body": "{\"user_id\": \"...\", \"kbank_id\": \"...\"}"
}
Response (Not Found):
{
"statusCode": 404,
"body": "{\"message\": \"User doesnt exist\"}"
}
DynamoDB Tables
KBankUserMappingTable
Table Name: payment3-kbank-user-mapping-{BRANCH}
Region: ap-southeast-1
Query Pattern:
from src.kbankUserMappingTable import KBankUserMappingTable
# Get most recent user record
users = list(
KBankUserMappingTable.query(
user_id,
scan_index_forward=False, # Most recent first
limit=1
)
)
if users:
kbank_id = users[0].kbank_id
Processing Flow
- Parse Query Parameters: Extract user_id from queryStringParameters
- Validate Input: Check user_id is present
- Query DynamoDB: Query KBankUserMappingTable by user_id
- Return Response: Return kbank_id or 404 if not found
Error Handling
Missing user_id: Returns 400 error
User Not Found: Returns 404 error
Other Errors: Returns 500 error, logged to Sentry
IAM Policies
From template.yaml (lines 588-592):
LambdaInvokePolicyforget-apikey-masterDynamoDBReadPolicyforKBankUserMappingTable
Dependencies
- KBankUserMappingTable - User mappings (read)
Related Functions
- KBankCreateUser - Creates KBank user mappings
References
- Template.yaml: Lines 581-607
- Related Functions: KBankCreateUser