#!/bin/env python import base64 import json import logging import traceback import model def respond(code, err=None, res=None, cur=None): body = { "status": "ok", "result": res, "partial": True if cur else False, } if err: body['status'] = "error" body['msg'] = str(err) logging.getLogger().error(json.dumps(traceback.format_exception( type(err), err, err.__traceback__))) if cur: body['cursor'] = cur return { 'statusCode': code if code else '200', 'body': json.dumps(body, cls=model.DecimalEncoder), 'headers': { 'Content-Type': 'application/json', }, } def lambda_handler(event, context): logger = logging.getLogger() logger.setLevel(logging.INFO) logger.info("Received event: " + json.dumps(event)) activity = model.Activity('dynamodb', logger=logger) try: activity.auth_check(event['headers']) except model.ActivityAuthenticationError as e: return respond('403', e) except Exception as e: return respond('401', e) routeKey = event['routeKey'] _queryParams = None try: _queryParams = event['queryStringParameters'] except KeyError: pass try: activity.populate_query_params(_queryParams) except model.ActivityQueryError as e: return respond('400', e) except Exception as e: return respond('500', e) payload = None result = None try: if routeKey == 'POST /activity': _encoded = event['isBase64Encoded'] if _encoded: payload = json.loads(base64.b64decode(event['body'])) else: payload = json.loads(event['body']) activity_id = activity.write(payload) return respond('202', res={'activity_id': activity_id}) elif routeKey == 'GET /activity/{id}': msg_id = event['pathParameters']['id'] result = activity.get_message(msg_id) if not result: return respond('404') return respond('200', res=result) elif routeKey == 'GET /activities/{target}/since/{from_ts}' or \ routeKey == 'GET /activities/{target}/from/{from_ts}/to/{to_ts}': target_id = event['pathParameters']['target'] from_ts = event['pathParameters']['from_ts'] to_ts = None try: to_ts = event['pathParameters']['to_ts'] except KeyError: pass try: activity.parse_cursor(event['headers']) except KeyError: pass result, cursor = activity.list_activities( target_id, from_ts, to_ts) if not result: return respond('404') return respond('200', res=result, cur=cursor) elif routeKey == 'GET /activities/context/{id}': ctx_id = event['pathParameters']['id'] try: activity.parse_cursor(event['headers']) except KeyError: pass result, cursor = activity.list_by_context(ctx_id) if not result: return respond('404') return respond('200', res=result, cur=cursor) elif routeKey == 'GET /context/{target}/from/{from_ts}/to/{to_ts}': target_id = event['pathParameters']['target'] from_ts = event['pathParameters']['from_ts'] to_ts = event['pathParameters']['to_ts'] try: activity.parse_cursor(event['headers']) except KeyError: pass result, cursor = activity.list_activities( target_id, from_ts, to_ts, list_ctx=True) if not result: return respond('404') return respond('200', res=result, cur=cursor) elif routeKey == 'GET /search/{target}/from/{from_ts}/to/{to_ts}': target_id = event['pathParameters']['target'] from_ts = event['pathParameters']['from_ts'] to_ts = event['pathParameters']['to_ts'] try: activity.parse_cursor(event['headers']) except KeyError: pass result, cursor = activity.list_activities( target_id, from_ts, to_ts, search=True) if not result: return respond('404') return respond('200', res=result, cur=cursor) else: return respond('404', res="requested path not found") except (model.ActivityQueryError, model.ActivityValidationError) as e: return respond('400', e, result) except model.ActivityNotFoundError as e: return respond('404', e, result) except Exception as e: return respond('500', e, result) if __name__ == '__main__': print('test')