Skip to content
Snippets Groups Projects
Commit 4b8e5411 authored by ewrh1g20's avatar ewrh1g20
Browse files

Adding azure functions

parent d1f6285c
No related branches found
No related tags found
No related merge requests found
Showing
with 435 additions and 0 deletions
File added
File added
settings = {
'local_URI': 'http://localhost:7071/api/' ,
'cloud_URI' : 'The URI of your deployment' ,
'db_URI' : 'https://coursework1-ewrh1g20.documents.azure.com:443/',
'db_key' : 'ojNseGrNAcCgyXAHIFIf2gQeSYZpvJ45hgaOVkNVS4C0NFKAmon0WpyIBB3R0aEhIs9B21SCqCo6lU2KgpYS5w==',
'db_id' : 'Quiplash',
'players_container' : 'players',
'prompt_container' : 'prompts',
'prompts_container' : "prompts"
}
import logging, json, random
import azure.functions as func
import azure.cosmos as cosmos
import config
def main(req: func.HttpRequest) -> func.HttpResponse:
client = cosmos.cosmos_client.CosmosClient(config.settings['db_URI'], config.settings['db_key'] )
db_client = client.get_database_client(config.settings['db_id'])
players_container = db_client.get_container_client(config.settings['players_container'])
prompt_container = db_client.get_container_client(config.settings['prompt_container'])
prompt = req.get_json()
promptText = prompt['text']
promptUsername = prompt['username']
promptPassword = prompt['password']
prompt.pop('password')
#First check if the prompt fits the requirements
if len(promptText) > 100 or len(promptText) < 20:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "prompt length is <20 or > 100 characters" }))
#Second check if user login is correct
try:
query_results = players_container.query_items(
query="SELECT c.password FROM c WHERE c.username = @user",
parameters=[{"name" : "@user", "value" : promptUsername}],
enable_cross_partition_query=True
)
userPwd = list(query_results)[0]['password']
if userPwd != promptPassword:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "bad username or password" }))
except Exception as exp:
logging.error(exp)
return func.HttpResponse(body=json.dumps({"result": False, "msg": "bad username or password" }))
#check if an exisiting prompt exists by this user
try:
query_results = prompt_container.query_items(
query="SELECT * FROM c WHERE c.username = @user AND c.text = @text",
parameters=[{"name" : "@user", "value" : promptUsername}, {"name" : "@text", "value" : promptText}],
enable_cross_partition_query = True
)
if len(list(query_results)) != 0:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "This user already has a prompt with the same text" }))
except Exception as exp:
logging.error(exp)
#check current ID number and add 1 (auto-increment)
try:
query_results = prompt_container.query_items(
query="SELECT c.id FROM c ORDER BY c.id DESC",
enable_cross_partition_query=True
)
queryList = list(query_results)
queryList = sorted(queryList, key=lambda d: int(d['id']), reverse=True)
if len(queryList) == 0:
queryID = 100
else:
queryID = int(queryList[0]['id']) + 1
prompt['id'] = str(queryID)
except Exception as exp:
logging.error(exp)
try:
query_results = prompt_container.create_item(prompt)
except Exception as exp:
logging.error(exp)
return func.HttpResponse(body=json.dumps({"result" : True, "msg": "OK" }))
File added
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route" : "prompt/create",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
import logging
import json
import uuid
import azure.cosmos as cosmos
import azure.cosmos.exceptions as exceptions
import azure.functions as func
import config
def main(req: func.HttpRequest) -> func.HttpResponse:
username = req.get_json()['username']
password = req.get_json()['password']
promptID = req.get_json()['id']
client = cosmos.cosmos_client.CosmosClient(config.settings['db_URI'], config.settings['db_key'] )
db_client = client.get_database_client(config.settings['db_id'])
players_container = db_client.get_container_client(config.settings['players_container'])
prompt_container = db_client.get_container_client(config.settings['prompt_container'])
#First check if login works
try:
query_results = players_container.query_items(
query="SELECT c.password FROM c WHERE c.username = @user",
parameters=[{"name" : "@user", "value" : username}],
enable_cross_partition_query=True
)
userPwd = list(query_results)[0]['password']
if userPwd != password:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "bad username or password" }))
except Exception as exp:
logging.error(exp)
return func.HttpResponse(body=json.dumps({"result": False, "msg": "bad username or password" }))
#now get the prompt info to check if the user created it
try:
query_results = list(prompt_container.query_items(
"SELECT c.username FROM c WHERE c.id = @ID",
parameters = [{"name" : "@ID", "value" : str(promptID)}],
enable_cross_partition_query = True
))
logging.error(promptID)
if len(query_results) == 0:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "prompt id does not exist" } ))
if query_results['username'] != username:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "access denied" } ))
except Exception as exp:
logging.error(exp)
#Delete the prompt
try:
prompt_container.delete_item(item=str(promptID), partition_key=str(promptID))
return func.HttpResponse(body=json.dumps({"result": True, "msg": "OK" } ))
except Exception as exp:
logging.error(exp)
File added
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "Anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route" : "prompt/delete",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
import logging
import json
import uuid
import azure.cosmos as cosmos
import azure.cosmos.exceptions as exceptions
import azure.functions as func
import config
def main(req: func.HttpRequest) -> func.HttpResponse:
promptEdit = req.get_json()
username = promptEdit['username']
password = promptEdit['password']
promptID = promptEdit['id']
promptText = promptEdit['text']
client = cosmos.cosmos_client.CosmosClient(config.settings['db_URI'], config.settings['db_key'] )
db_client = client.get_database_client(config.settings['db_id'])
players_container = db_client.get_container_client(config.settings['players_container'])
prompt_container = db_client.get_container_client(config.settings['prompt_container'])
if len(promptText) > 100 or len(promptText) < 20:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "prompt length is <20 or > 100 characters" }))
#First check if login works
try:
query_results = players_container.query_items(
query="SELECT c.password FROM c WHERE c.username = @user",
parameters=[{"name" : "@user", "value" : username}],
enable_cross_partition_query=True
)
userPwd = list(query_results)[0]['password']
if userPwd != password:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "bad username or password" }))
except Exception as exp:
logging.error(exp)
return func.HttpResponse(body=json.dumps({"result": False, "msg": "bad username or password" }))
#now get the prompt info to check if the user created it
try:
query_results = list(prompt_container.query_items(
"SELECT * FROM c WHERE c.id = @ID",
parameters = [{"name" : "@ID", "value" : str(promptID)}],
enable_cross_partition_query = True
))
if len(query_results) == 0:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "prompt id does not exist" } ))
promptFromDB = query_results[0]
if promptFromDB['username'] != username:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "access denied" } ))
except Exception as exp:
logging.error(exp)
#Check existing prompt by that user doesn't already exist
try:
query_results = prompt_container.query_items(
query="SELECT * FROM c WHERE c.username = @user AND c.text = @text",
parameters=[{"name" : "@user", "value" : username}, {"name" : "@text", "value" : promptText}],
enable_cross_partition_query = True
)
if len(list(query_results)) != 0:
return func.HttpResponse(body=json.dumps({"result": False, "msg": "This user already has a prompt with the same text" }))
except Exception as exp:
logging.error(exp)
#update the DB
try:
promptFromDB['text'] = promptText
prompt_container.upsert_item(promptFromDB)
return func.HttpResponse(body=json.dumps({"result" : True, "msg": "OK" }))
except Exception as exp:
logging.error(exp)
File added
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route" : "prompt/edit",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
import logging, json, random
import azure.functions as func
import azure.cosmos as cosmos
import config
def main(req: func.HttpRequest) -> func.HttpResponse:
client = cosmos.cosmos_client.CosmosClient(config.settings['db_URI'], config.settings['db_key'] )
db_client = client.get_database_client(config.settings['db_id'])
players_container = db_client.get_container_client(config.settings['players_container'])
prompt_container = db_client.get_container_client(config.settings['prompt_container'])
request = req.get_json()
num = False
try:
numPrompts = request['prompts']
num = True
except:
playerPrompts = request['players']
if num:
#getAllPrompts
try:
get_all_prompts = list(prompt_container.query_items(
query="SELECT c.id, c.text, c.username FROM c",
enable_cross_partition_query = True
))
if len(get_all_prompts) <= numPrompts:
return func.HttpResponse(body=json.dumps(get_all_prompts))
else:
randomSample = random.sample(get_all_prompts, numPrompts)
return func.HttpResponse(body=json.dumps(randomSample))
except Exception as exp:
logging.error(exp)
else:
query_string = "SELECT c.id, c.text, c.username FROM c WHERE"
for player in playerPrompts:
query_string += " c.username = \"" + player + "\" OR"
query_string = query_string[:-3]
response = list(prompt_container.query_items(
query=query_string, enable_cross_partition_query=True
))
return func.HttpResponse(body=json.dumps(response))
File added
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route" : "prompts/get",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
import logging, json, random
import azure.functions as func
import azure.cosmos as cosmos
import config
def main(req: func.HttpRequest) -> func.HttpResponse:
client = cosmos.cosmos_client.CosmosClient(config.settings['db_URI'], config.settings['db_key'] )
db_client = client.get_database_client(config.settings['db_id'])
prompt_container = db_client.get_container_client(config.settings['prompt_container'])
request = req.get_json()
promptWord = request['word']
exact = request['exact']
wordQuery = list(prompt_container.query_items(
query="SELECT c.id, c.text, c.username FROM c WHERE CONTAINS(c.text, @string, true)",
parameters=[{"name" : "@string", "value" : promptWord}],
enable_cross_partition_query = True
))
if not exact:
return func.HttpResponse(body=json.dumps(wordQuery))
else:
exactPrompts = []
for prompt in wordQuery:
text = prompt['text']
splitText = text.split(" ")
if promptWord in splitText:
exactPrompts.append(prompt)
return func.HttpResponse(body=json.dumps(exactPrompts))
File added
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route" : "prompts/getText",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[3.*, 4.0.0)"
}
}
\ No newline at end of file
import logging, json
import azure.cosmos as cosmos
import azure.cosmos.exceptions as exceptions
import azure.functions as func
import config
def main(req: func.HttpRequest) -> func.HttpResponse:
client = cosmos.cosmos_client.CosmosClient(config.settings['db_URI'], config.settings['db_key'] )
db_client = client.get_database_client(config.settings['db_id'])
players_container = db_client.get_container_client(config.settings['players_container'])
topNumber = req.get_json()['top']
try:
query_results = list(players_container.query_items(
query="""SELECT c.username, c.total_score, c.games_played FROM c
ORDER BY c.total_score DESC, c.username ASC""",
enable_cross_partition_query=True
))
toReturn = query_results[:topNumber]
except Exception as exp:
logging.error(exp)
return func.HttpResponse(body=json.dumps(toReturn))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment