Skip to main content

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

  1. Parse Query Parameters: Extract user_id from queryStringParameters
  2. Validate Input: Check user_id is present
  3. Query DynamoDB: Query KBankUserMappingTable by user_id
  4. 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):

  • LambdaInvokePolicy for get-apikey-master
  • DynamoDBReadPolicy for KBankUserMappingTable

Dependencies

  • KBankUserMappingTable - User mappings (read)
  • KBankCreateUser - Creates KBank user mappings

References

  • Template.yaml: Lines 581-607
  • Related Functions: KBankCreateUser