def update(event, context): """Update item in the collection.""" try: # Determine if required env var for region is present. val.check_region() # Determine if required env var for DynamoDB table is present. val.check_dynamodb() # Check for the url {id}. note_id = val.check_id(event) # Determine if required property body is present. val.check_body(event) # Attempt to parse JSON. data = val.check_json(event) # Determine if required properties are present. val.check_props(data) # Set up resource and environment. This is where we keep # *aaS provider resources away from biz logic. region = os.environ["AWS_DEFAULT_REGION"] table = os.environ["DYNAMODB_TABLE"] # Determine which DynamoDB host we need (local/remote)? host = val.check_dynamodb_host() conn = boto3.resource("dynamodb", region, endpoint_url=host) conn_table = conn.Table(table) # Build our model and update. note = NoteModel(conn_table) item = note.update(note_id, data) logger.info("Note updated: {}".format(item)) return respond(200, item) except ex.AwsRegionNotSetException as exc: return respond(500, {"error": str(exc)}) except ex.DynamoDbTableNotSetException as exc: return respond(500, {"error": str(exc)}) except ex.RequestUrlIdNotSetException as exc: return respond(400, {"error": str(exc)}) except ex.RequestBodyNotSetException as exc: return respond(400, {"error": str(exc)}) except ex.RequestBodyNotJsonException as exc: return respond(400, {"error": str(exc)}) except ex.RequiredPropertiesNotSetException as exc: return respond(400, {"error": str(exc)}) except Exception as exc: return respond(500, {"error": str(exc)})
def test_raises_exception_when_env_var_dynamodb_not_found(monkeypatch, config): with pytest.raises(ex.DynamoDbTableNotSetException) as exc: monkeypatch.delenv("DYNAMODB_TABLE", raising=False) monkeypatch.setenv("AWS_DEFAULT_REGION", config["aws"]["region"]) val.check_dynamodb() assert "'DYNAMODB_TABLE'" in str(exc.value)
def search_by_notebook(event, context): """Return the collection of items based on query.""" try: # Determine if required env var for region is present. val.check_region() # Determine if required env var for DynamoDB table is present. val.check_dynamodb() # Check for the url {id}. notebook = val.check_id(event) # Set up resource and environment. This is where we keep # *aaS provider resources away from biz logic. region = os.environ["AWS_DEFAULT_REGION"] table = os.environ["DYNAMODB_TABLE"] # Determine which DynamoDB host we need (local/remote)? host = val.check_dynamodb_host() conn = boto3.resource("dynamodb", region, endpoint_url=host) conn_table = conn.Table(table) # Build our model and read. note = NoteModel(conn_table) items = note.search_by_notebook(notebook) logger.info("Notes for notebook found: {} [{}]".format( notebook, len(items))) return respond(200, items) except ex.AwsRegionNotSetException as exc: return respond(500, {"error": str(exc)}) except ex.DynamoDbTableNotSetException as exc: return respond(500, {"error": str(exc)}) except ex.RequestUrlIdNotSetException as exc: return respond(400, {"error": str(exc)}) except Exception as exc: return respond(500, {"error": str(exc)})