Configure the Advanced I/O Function

Let’s begin coding the Alien City application by configuring the function component.

The Python function directory (functions/alien_city_function) contains the following files:

  • The main.py main function file

  • The catalyst-config.json configuration file

  • The requirements.txt file to mention any external libraries that you might add.

You will be adding code in the main.py main function file.

The two APIs in the Advanced I/O function that handle the routing between the server and the Data Store are:

  • GET /alien: To check whether aliens are present in a city

  • POST /alien: To report an alien presence in a city

Let’s now add the code in the function file.

Copy the code given below and paste it in the main.py in the functions/alien_city_function directory of your project, and save the file. You can use any IDE of your choice to work with the application’s files.

Note: Please go through the code in this section to make sure you fully understand it.
    
main.py
copy
import json
import zcatalyst_sdk
import logging
from flask import Request, make_response, jsonify
tableName = 'AlienCity' # The table created in the Data Store
columnName = 'CityName' # The column created in the table
def handler(request: Request):
try:
app = zcatalyst_sdk.initialize() # Initializing Catalyst SDK
logger = logging.getLogger()
if request.path == "/alien" and request.method == 'POST': # The POST API that reports the alien encounter for a particular city
req_data = request.get_json()
name = req_data.get('city_name')
rowid = getAlienCountFromCatalystDataStore(name) # Queries the Catalyst Data Store table and checks whether a row is present for the given city
if len(rowid) == 0: # If the row is not present, then a new row is inserted
logger.info("Alien alert!") # Written to the logs. You can view this log from Logs under the Monitor section in the console
datastore_service = app.datastore()
table_service = datastore_service.table(tableName)
row_data = {
columnName:name
}
table_service.insert_row(row_data) # Inserts the city name as a row in the Catalyst Data Store table
response = make_response(jsonify({
"message": "Thanks for reporting!"
}), 200)
else: # If the row is present, then a message is sent indicating duplication
response = make_response(jsonify({
"message": "Looks like you are not the first person to encounter aliens in this city! Someone has already reported an alien encounter here!"
}), 200)
return response
elif request.path == "/alien" and request.method == 'GET': # The GET API that checks the table for an alien encounter in that city
name = request.args.get('city_name')
rowid = getAlienCountFromCatalystDataStore(name) # Queries the Catalyst Data Store table and checks whether a row is present for the given city
if len(rowid) == 0:
response = make_response({
"message": "Hurray! No alien encounters in this city yet!",
"signal": "negative"
}, 200)
else:
response = make_response(jsonify({
"message": "Uh oh! Looks like there are aliens in this city!",
"signal": "positive"
}), 200)
return response
else:
response = make_response("Error. Invalid Request")
response.status_code = 404
return response
except Exception as err: # Sends an error response
logger.error(f"Exception in AlienCityAIO :{err}")
response = make_response(jsonify({
"error": "Internal server error occurred. Please try again in some time."
}), 500)
return response
def getAlienCountFromCatalystDataStore(cityname): # Checks whether an alien encounter is already reported for the given city by querying the Data Store table
app = zcatalyst_sdk.initialize()
zcql_service = app.zcql()
query = f"SELECT * FROM {tableName} WHERE {columnName} = '{cityname}'"
output = zcql_service.execute_query(query)
return output
View more

The Advanced I/O function is now configured. We will discuss the architecture of the function and the client in the next section.


Last Updated 2024-10-22 16:44:11 +0530 +0530

ON THIS PAGE
ACCESS THIS PAGE