in source/lambda/apiprocessor/lambda_function.py [0:0]
def lambda_handler(event, context):
eventCopy = event
print("Redacted Event: {}".format(redactHeadersFromLambdaEvent(event)))
result = {}
status_code = 200
documentBucket = os.environ['CONTENT_BUCKET']
sampleBucket = os.environ['SAMPLE_BUCKET']
if('resource' in event):
request = {}
request["elasticsearchDomain"] = os.environ['ES_DOMAIN']
request["outputTable"] = os.environ['OUTPUT_TABLE']
request["documentsTable"] = os.environ['DOCUMENTS_TABLE']
# search Elasticsearch handler
if(event['resource'] == '/search'):
if('queryStringParameters' in event and 'k' in event['queryStringParameters']):
request["keyword"] = event['queryStringParameters']['k']
if('documentId' in event['queryStringParameters']):
request["documentId"] = event['queryStringParameters']['documentId']
result = search(request)
# search Kendra if available
elif(event['resource'] == '/searchkendra' and event['httpMethod'] == 'POST'):
if 'KENDRA_INDEX_ID' in os.environ:
kendraClient = KendraHelper()
result = kendraClient.search(os.environ['KENDRA_INDEX_ID'],
event['body'])
# Kendra search result feedback for relevance boosting
elif(event['resource'] == '/feedbackkendra' and event['httpMethod'] == 'POST'):
if 'KENDRA_INDEX_ID' in os.environ:
kendraClient = KendraHelper()
result = kendraClient.submitFeedback(os.environ['KENDRA_INDEX_ID'],
event['body'])
elif(event['resource'] == '/documents'):
if('queryStringParameters' in event and event['queryStringParameters'] and 'nexttoken' in event['queryStringParameters']):
request["nextToken"] = event['queryStringParameters']['nexttoken']
if validate_get_documents_request(request):
result = getDocuments(request)
else:
status_code = 400
result.append(
"Bad request, nexttoken is not valid")
elif(event['resource'] == '/document'):
if(event['httpMethod'] == 'GET'):
if('queryStringParameters' in event and event['queryStringParameters']):
if('documentid' in event['queryStringParameters']):
request["documentId"] = event['queryStringParameters']['documentid']
if validate_get_document_request(request):
result = getDocument(request)
else:
status_code = 400
result.append(
"Bad request, documentId is not valid")
elif('bucketname' in event['queryStringParameters'] and 'objectname' in event['queryStringParameters']):
request["bucketName"] = event['queryStringParameters']['bucketname']
request["objectName"] = event['queryStringParameters']['objectname']
if validate_create_document_request(request):
result = createDocument(request)
else:
status_code = 400
result.append(
"Bad request, object key does not exist in bucket")
elif(event['httpMethod'] == 'POST'):
body = json.loads(event['body'])
if('objects' in body):
results = []
for obj in body['objects']:
request["bucketName"] = sampleBucket if obj['sample'] else documentBucket
request["objectName"] = obj['key']
successes = failures = 0
if validate_create_document_request(request):
results.append(createDocument(request))
successes += 1
else:
result.append(
f"Object key {request['objectName']} does not exist in bucket")
failures += 1
status_code = 207 if successes > 0 and failures > 0 else status_code
status_code = 400 if successes == 0 and failures > 0 else status_code
result = results
else:
request["bucketName"] = sampleBucket if body['sample'] else documentBucket
request["objectName"] = body['key']
if validate_create_document_request(request):
result = createDocument(request)
else:
status_code = 400
result.append(
"Bad request, object key does not exist in bucket")
elif(event['httpMethod'] == 'DELETE'):
if('documentid' in event['queryStringParameters']):
request["documentId"] = event['queryStringParameters']['documentid']
result = deleteDocument(request)
deleteESItem(
request["elasticsearchDomain"], request["documentId"])
# remove it from Kendra's index too if present
if 'KENDRA_INDEX_ID' in os.environ:
kendraClient = KendraHelper()
kendraClient.deindexDocument(os.environ['KENDRA_INDEX_ID'],
request["documentId"])
elif(event['resource'] == '/redact'):
params = event['queryStringParameters'] if 'queryStringParameters' in event else {
}
request["params"] = params
result = redact(request)
return {
"isBase64Encoded": False,
"statusCode": 200,
'body': json.dumps(result),
"headers": {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*',
'Access-Control-Allow-Methods': 'GET,POST,OPTIONS'
}
}