Exposed app sdk functions for files
This commit is contained in:
+129
-128
@@ -51,6 +51,130 @@ class AppBase:
|
|||||||
self.logger.info("Result: %d" % ret.status_code)
|
self.logger.info("Result: %d" % ret.status_code)
|
||||||
if ret.status_code != 200:
|
if ret.status_code != 200:
|
||||||
self.logger.info(ret.text)
|
self.logger.info(ret.text)
|
||||||
|
|
||||||
|
# Things to consider for files:
|
||||||
|
# - How can you download / stream a file?
|
||||||
|
# - Can you decide if you want a stream or the files directly?
|
||||||
|
def get_files(self, full_execution, value):
|
||||||
|
org_id = full_execution["workflow"]["execution_org"]["id"]
|
||||||
|
print("SHOULD GET FILES BASED ON ORG %s, workflow %s and value(s) %s" % (org_id, full_execution["workflow"]["id"], value))
|
||||||
|
|
||||||
|
get_path = "/api/v1/files/%s?execution_id=%s" % (value, full_execution["execution_id"])
|
||||||
|
headers = {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Authorization": "Bearer %s" % self.authorization
|
||||||
|
}
|
||||||
|
|
||||||
|
ret1 = requests.get("%s%s" % (self.url, get_path), headers=headers)
|
||||||
|
print("RET1: %s" % ret1.text)
|
||||||
|
if ret1.status_code != 200:
|
||||||
|
return {
|
||||||
|
"filename": "",
|
||||||
|
"data": "",
|
||||||
|
"success": False,
|
||||||
|
}
|
||||||
|
|
||||||
|
content_path = "/api/v1/files/%s/content?execution_id=%s" % (value, full_execution["execution_id"])
|
||||||
|
ret2 = requests.get("%s%s" % (self.url, content_path), headers=headers)
|
||||||
|
print("Ret2: %s" % ret2.text)
|
||||||
|
if ret2.status_code == 200:
|
||||||
|
tmpdata = ret1.json()
|
||||||
|
returndata = {
|
||||||
|
"success": True,
|
||||||
|
"filename": tmpdata["filename"],
|
||||||
|
"data": ret2.content,
|
||||||
|
}
|
||||||
|
# open('facebook.ico', 'wb').write(r.content)
|
||||||
|
|
||||||
|
return returndata
|
||||||
|
|
||||||
|
return {
|
||||||
|
"success": False,
|
||||||
|
"filename": "",
|
||||||
|
"data": b"",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sets files in the backend
|
||||||
|
def set_files(self, full_execution, infiles):
|
||||||
|
workflow_id = full_execution["workflow"]["id"]
|
||||||
|
org_id = full_execution["workflow"]["execution_org"]["id"]
|
||||||
|
headers = {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Authorization": "Bearer %s" % self.authorization
|
||||||
|
}
|
||||||
|
|
||||||
|
create_path = "/api/v1/files/create?execution_id=%s" % full_execution["execution_id"]
|
||||||
|
file_ids = []
|
||||||
|
for curfile in infiles:
|
||||||
|
filename = "unspecified"
|
||||||
|
data = {
|
||||||
|
"filename": filename,
|
||||||
|
"workflow_id": workflow_id,
|
||||||
|
"org_id": org_id,
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
data["filename"] = curfile["filename"]
|
||||||
|
filename = curfile["filename"]
|
||||||
|
except KeyError as e:
|
||||||
|
print("KeyError in file setup: %s" % e)
|
||||||
|
pass
|
||||||
|
|
||||||
|
ret = requests.post("%s%s" % (self.url, create_path), headers=headers, json=data)
|
||||||
|
print("Ret CREATE: %s" % ret.text)
|
||||||
|
cur_id = ""
|
||||||
|
if ret.status_code == 200:
|
||||||
|
print("RET: %s" % ret.text)
|
||||||
|
ret_json = ret.json()
|
||||||
|
if not ret_json["success"]:
|
||||||
|
print("Not success in file upload creation.")
|
||||||
|
continue
|
||||||
|
|
||||||
|
print("Should handle ID %s" % ret_json["id"])
|
||||||
|
file_ids.append(ret_json["id"])
|
||||||
|
cur_id = ret_json["id"]
|
||||||
|
else:
|
||||||
|
print("Bad status code: %d" % ret.status_code)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if len(cur_id) == 0:
|
||||||
|
print("No file ID specified from backend")
|
||||||
|
continue
|
||||||
|
|
||||||
|
new_headers = {
|
||||||
|
"Authorization": "Bearer %s" % self.authorization,
|
||||||
|
}
|
||||||
|
|
||||||
|
upload_path = "/api/v1/files/%s/upload?execution_id=%s" % (cur_id, full_execution["execution_id"])
|
||||||
|
print("Create path: %s" % create_path)
|
||||||
|
|
||||||
|
# FIXME: Typical failure here if data is returned badly formatted
|
||||||
|
files={"shuffle_file": (filename, curfile["data"])}
|
||||||
|
#open(filename,'rb')}
|
||||||
|
|
||||||
|
ret = requests.post("%s%s" % (self.url, upload_path), files=files, headers=new_headers)
|
||||||
|
print("Ret UPLOAD: %s" % ret.text)
|
||||||
|
print("Ret2 UPLOAD: %d" % ret.status_code)
|
||||||
|
|
||||||
|
print("IDS TO RETURN: %s" % file_ids)
|
||||||
|
return file_ids
|
||||||
|
|
||||||
|
# Checks whether conditions are met, otherwise set
|
||||||
|
branchcheck, tmpresult = check_branch_conditions(action, fullexecution)
|
||||||
|
if not branchcheck:
|
||||||
|
self.logger.info("Failed one or more branch conditions.")
|
||||||
|
action_result["result"] = tmpresult
|
||||||
|
action_result["status"] = "FAILURE"
|
||||||
|
try:
|
||||||
|
ret = requests.post("%s%s" % (self.url, stream_path), headers=headers, json=action_result)
|
||||||
|
self.logger.info("Result: %d" % ret.status_code)
|
||||||
|
if ret.status_code != 200:
|
||||||
|
self.logger.info(ret.text)
|
||||||
|
except requests.exceptions.ConnectionError as e:
|
||||||
|
self.logger.exception(e)
|
||||||
|
|
||||||
|
print("\n\nRETURNING BECAUSE A BRANCH FAILED\n\n")
|
||||||
|
return
|
||||||
|
|
||||||
async def execute_action(self, action):
|
async def execute_action(self, action):
|
||||||
# FIXME - add request for the function STARTING here. Use "results stream" or something
|
# FIXME - add request for the function STARTING here. Use "results stream" or something
|
||||||
@@ -834,129 +958,6 @@ class AppBase:
|
|||||||
|
|
||||||
return True, ""
|
return True, ""
|
||||||
|
|
||||||
# Things to consider for files:
|
|
||||||
# - How can you download / stream a file?
|
|
||||||
# - Can you decide if you want a stream or the files directly?
|
|
||||||
def get_files(full_execution, value):
|
|
||||||
org_id = full_execution["workflow"]["execution_org"]["id"]
|
|
||||||
print("SHOULD GET FILES BASED ON ORG %s, workflow %s and value(s) %s" % (org_id, full_execution["workflow"]["id"], value))
|
|
||||||
|
|
||||||
get_path = "/api/v1/files/%s?execution_id=%s" % (value, full_execution["execution_id"])
|
|
||||||
headers = {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
"Authorization": "Bearer %s" % self.authorization
|
|
||||||
}
|
|
||||||
|
|
||||||
ret1 = requests.get("%s%s" % (self.url, get_path), headers=headers)
|
|
||||||
print("RET1: %s" % ret1.text)
|
|
||||||
if ret1.status_code != 200:
|
|
||||||
return {
|
|
||||||
"filename": "",
|
|
||||||
"data": "",
|
|
||||||
"success": False,
|
|
||||||
}
|
|
||||||
|
|
||||||
content_path = "/api/v1/files/%s/content?execution_id=%s" % (value, full_execution["execution_id"])
|
|
||||||
ret2 = requests.get("%s%s" % (self.url, content_path), headers=headers)
|
|
||||||
print("Ret2: %s" % ret2.text)
|
|
||||||
if ret2.status_code == 200:
|
|
||||||
tmpdata = ret1.json()
|
|
||||||
returndata = {
|
|
||||||
"success": True,
|
|
||||||
"filename": tmpdata["filename"],
|
|
||||||
"data": ret2.content,
|
|
||||||
}
|
|
||||||
# open('facebook.ico', 'wb').write(r.content)
|
|
||||||
|
|
||||||
return returndata
|
|
||||||
|
|
||||||
return {
|
|
||||||
"success": False,
|
|
||||||
"filename": "",
|
|
||||||
"data": "",
|
|
||||||
}
|
|
||||||
|
|
||||||
# Sets files in the backend
|
|
||||||
def set_files(full_execution, infiles):
|
|
||||||
workflow_id = full_execution["workflow"]["id"]
|
|
||||||
org_id = full_execution["workflow"]["execution_org"]["id"]
|
|
||||||
headers = {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
"Authorization": "Bearer %s" % self.authorization
|
|
||||||
}
|
|
||||||
|
|
||||||
create_path = "/api/v1/files/create?execution_id=%s" % full_execution["execution_id"]
|
|
||||||
file_ids = []
|
|
||||||
for curfile in infiles:
|
|
||||||
filename = "unspecified"
|
|
||||||
data = {
|
|
||||||
"filename": filename,
|
|
||||||
"workflow_id": workflow_id,
|
|
||||||
"org_id": org_id,
|
|
||||||
}
|
|
||||||
|
|
||||||
try:
|
|
||||||
data["filename"] = curfile["filename"]
|
|
||||||
filename = curfile["filename"]
|
|
||||||
except KeyError as e:
|
|
||||||
print("KeyError in file setup: %s" % e)
|
|
||||||
pass
|
|
||||||
|
|
||||||
ret = requests.post("%s%s" % (self.url, create_path), headers=headers, json=data)
|
|
||||||
print("Ret CREATE: %s" % ret.text)
|
|
||||||
cur_id = ""
|
|
||||||
if ret.status_code == 200:
|
|
||||||
print("RET: %s" % ret.text)
|
|
||||||
ret_json = ret.json()
|
|
||||||
if not ret_json["success"]:
|
|
||||||
print("Not success in file upload creation.")
|
|
||||||
continue
|
|
||||||
|
|
||||||
print("Should handle ID %s" % ret_json["id"])
|
|
||||||
file_ids.append(ret_json["id"])
|
|
||||||
cur_id = ret_json["id"]
|
|
||||||
else:
|
|
||||||
print("Bad status code: %d" % ret.status_code)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if len(cur_id) == 0:
|
|
||||||
print("No file ID specified from backend")
|
|
||||||
continue
|
|
||||||
|
|
||||||
new_headers = {
|
|
||||||
"Authorization": "Bearer %s" % self.authorization,
|
|
||||||
}
|
|
||||||
|
|
||||||
upload_path = "/api/v1/files/%s/upload?execution_id=%s" % (cur_id, full_execution["execution_id"])
|
|
||||||
print("Create path: %s" % create_path)
|
|
||||||
#files={"shuffle_file": open(filename,'rb')}
|
|
||||||
files={"shuffle_file": (filename, curfile["data"])}
|
|
||||||
#open(filename,'rb')}
|
|
||||||
|
|
||||||
ret = requests.post("%s%s" % (self.url, upload_path), files=files, headers=new_headers)
|
|
||||||
print("Ret UPLOAD: %s" % ret.text)
|
|
||||||
print("Ret2 UPLOAD: %d" % ret.status_code)
|
|
||||||
|
|
||||||
print("IDS TO RETURN: %s" % file_ids)
|
|
||||||
return file_ids
|
|
||||||
|
|
||||||
# Checks whether conditions are met, otherwise set
|
|
||||||
branchcheck, tmpresult = check_branch_conditions(action, fullexecution)
|
|
||||||
if not branchcheck:
|
|
||||||
self.logger.info("Failed one or more branch conditions.")
|
|
||||||
action_result["result"] = tmpresult
|
|
||||||
action_result["status"] = "FAILURE"
|
|
||||||
try:
|
|
||||||
ret = requests.post("%s%s" % (self.url, stream_path), headers=headers, json=action_result)
|
|
||||||
self.logger.info("Result: %d" % ret.status_code)
|
|
||||||
if ret.status_code != 200:
|
|
||||||
self.logger.info(ret.text)
|
|
||||||
except requests.exceptions.ConnectionError as e:
|
|
||||||
self.logger.exception(e)
|
|
||||||
|
|
||||||
print("\n\nRETURNING BECAUSE A BRANCH FAILED\n\n")
|
|
||||||
return
|
|
||||||
|
|
||||||
# Replace name cus there might be issues
|
# Replace name cus there might be issues
|
||||||
# Not doing lower() as there might be user-made functions
|
# Not doing lower() as there might be user-made functions
|
||||||
actionname = action["name"]
|
actionname = action["name"]
|
||||||
@@ -1110,7 +1111,7 @@ class AppBase:
|
|||||||
try:
|
try:
|
||||||
if parameter["schema"]["type"] == "file" and len(value) > 0:
|
if parameter["schema"]["type"] == "file" and len(value) > 0:
|
||||||
print("SHOULD HANDLE FILE IN MULTI. Get based on value %s" % parameter["value"])
|
print("SHOULD HANDLE FILE IN MULTI. Get based on value %s" % parameter["value"])
|
||||||
file_value = get_files(fullexecution, tmpitem)
|
file_value = self.get_files(fullexecution, tmpitem)
|
||||||
print("FILE VALUE FOR VAL %s: %s" % (tmpitem, file_value))
|
print("FILE VALUE FOR VAL %s: %s" % (tmpitem, file_value))
|
||||||
resultarray.append(file_value)
|
resultarray.append(file_value)
|
||||||
|
|
||||||
@@ -1140,7 +1141,7 @@ class AppBase:
|
|||||||
try:
|
try:
|
||||||
if parameter["schema"]["type"] == "file" and len(value) > 0:
|
if parameter["schema"]["type"] == "file" and len(value) > 0:
|
||||||
print("\n SHOULD HANDLE FILE. Get based on value %s. <--- is this a valid ID?" % parameter["value"])
|
print("\n SHOULD HANDLE FILE. Get based on value %s. <--- is this a valid ID?" % parameter["value"])
|
||||||
file_value = get_files(fullexecution, value)
|
file_value = self.get_files(fullexecution, value)
|
||||||
print("FILE VALUE: %s \n" % file_value)
|
print("FILE VALUE: %s \n" % file_value)
|
||||||
|
|
||||||
params[parameter["name"]] = file_value
|
params[parameter["name"]] = file_value
|
||||||
@@ -1184,13 +1185,13 @@ class AppBase:
|
|||||||
print("TUPLE: %s" % newres[1])
|
print("TUPLE: %s" % newres[1])
|
||||||
if isinstance(newres[1], list):
|
if isinstance(newres[1], list):
|
||||||
print("HANDLING LIST FROM RET")
|
print("HANDLING LIST FROM RET")
|
||||||
file_ids = set_files(fullexecution, newres[1])
|
file_ids = self.set_files(fullexecution, newres[1])
|
||||||
elif isinstance(newres[1], object):
|
elif isinstance(newres[1], object):
|
||||||
print("Handling JSON from ret")
|
print("Handling JSON from ret")
|
||||||
file_ids = set_files(fullexecution, [newres[1]])
|
file_ids = self.set_files(fullexecution, [newres[1]])
|
||||||
elif isinstance(newres[1], str):
|
elif isinstance(newres[1], str):
|
||||||
print("Handling STRING from ret")
|
print("Handling STRING from ret")
|
||||||
file_ids = set_files(fullexecution, [newres[1]])
|
file_ids = self.set_files(fullexecution, [newres[1]])
|
||||||
else:
|
else:
|
||||||
print("NO FILES TO HANDLE")
|
print("NO FILES TO HANDLE")
|
||||||
|
|
||||||
|
|||||||
@@ -2422,7 +2422,7 @@ func checkAdminLogin(resp http.ResponseWriter, request *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
log.Printf("No users - redirecting for management user")
|
log.Printf("[WARNING] No users - redirecting for management user")
|
||||||
resp.WriteHeader(200)
|
resp.WriteHeader(200)
|
||||||
resp.Write([]byte(fmt.Sprintf(`{"success": true, "reason": "stay"}`)))
|
resp.Write([]byte(fmt.Sprintf(`{"success": true, "reason": "stay"}`)))
|
||||||
return
|
return
|
||||||
@@ -2555,12 +2555,12 @@ func getApikey(ctx context.Context, apikey string) (User, error) {
|
|||||||
var users []User
|
var users []User
|
||||||
_, err := dbclient.GetAll(ctx, q, &users)
|
_, err := dbclient.GetAll(ctx, q, &users)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error getting users apikey (getapikey): %s", err)
|
log.Printf("[ERROR] Error getting users apikey (getapikey): %s", err)
|
||||||
return User{}, err
|
return User{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(users) == 0 {
|
if len(users) == 0 {
|
||||||
log.Printf("No users found for apikey %s", apikey)
|
log.Printf("[WARNING] No users found for apikey %s", apikey)
|
||||||
return User{}, err
|
return User{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user