def lambda_handler()

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'
        }
    }