Add json object for environment info for each function, this is mutable from custom code

This commit is contained in:
Peter Stockings
2023-12-18 15:15:14 +11:00
parent 538d5083e4
commit 5cc29309d5
5 changed files with 79 additions and 24 deletions

24
app.py
View File

@@ -1,3 +1,4 @@
import json
import os import os
from flask import Flask, Response, jsonify, redirect, render_template, request, url_for from flask import Flask, Response, jsonify, redirect, render_template, request, url_for
import jinja_partials import jinja_partials
@@ -92,12 +93,15 @@ def create_http_function():
try: try:
name = request.json.get('name') name = request.json.get('name')
script_content = request.json.get('script_content') script_content = request.json.get('script_content')
db.create_new_http_function(name, script_content) environment_info = json.dumps(eval(request.json.get('environment_info')))
db.create_new_http_function(name, script_content, environment_info)
http_functions = db.get_http_functions() http_functions = db.get_http_functions()
http_functions = create_http_functions_view_model(http_functions) http_functions = create_http_functions_view_model(http_functions)
return render_template("dashboard/http_functions.html", http_functions=http_functions) return render_template("dashboard/http_functions.html", http_functions=http_functions)
except Exception as e: except Exception as e:
print(e)
return render_template("dashboard/http_functions/new.html", name=name, script=script_content) return render_template("dashboard/http_functions/new.html", name=name, script=script_content)
@ app.route("/dashboard/http_functions/edit_form", methods=["GET"]) @ app.route("/dashboard/http_functions/edit_form", methods=["GET"])
@@ -107,19 +111,20 @@ def get_http_function_edit_form():
if not http_function: if not http_function:
return jsonify({'error': 'Function not found'}), 404 return jsonify({'error': 'Function not found'}), 404
script = http_function['script_content'] script = http_function['script_content']
return render_template("dashboard/http_functions/edit.html", name=name, script=script) environment_info = json.dumps(http_function['environment_info'])
return render_template("dashboard/http_functions/edit.html", name=name, script=script, environment_info=environment_info)
@ app.route("/dashboard/http_functions/edit", methods=["POST"]) @ app.route("/dashboard/http_functions/edit", methods=["POST"])
def edit_http_function(): def edit_http_function():
try: try:
name = request.json.get('name') name = request.json.get('name')
script_content = request.json.get('script_content') script_content = request.json.get('script_content')
db.edit_http_function(name, script_content) environment_info = json.dumps(eval(request.json.get('environment_info')))
http_functions = db.get_http_functions() db.edit_http_function(name, script_content, environment_info)
http_functions = create_http_functions_view_model(http_functions) return render_template("dashboard/http_functions/edit.html", name=name, script=script_content, environment_info=environment_info)
return render_template("dashboard/http_functions.html", http_functions=http_functions)
except Exception as e: except Exception as e:
print(e)
return render_template("dashboard/http_functions/edit.html", name=name, script=script_content) return render_template("dashboard/http_functions/edit.html", name=name, script=script_content)
@ app.route("/dashboard/http_functions/delete", methods=["DELETE"]) @ app.route("/dashboard/http_functions/delete", methods=["DELETE"])
@@ -174,10 +179,9 @@ def execute_http_function(function):
http_function = db.get_http_function(function) http_function = db.get_http_function(function)
if not http_function: if not http_function:
return jsonify({'error': 'Function not found'}), 404 return jsonify({'error': 'Function not found'}), 404
# TODO: Get code from database based on function name
code = http_function['script_content'] code = http_function['script_content']
environment = http_function['environment_info']
print(code)
request_obj = { request_obj = {
'method': request.method, 'method': request.method,
@@ -203,7 +207,7 @@ def execute_http_function(function):
request_obj['text'] = request.data.decode('utf-8') request_obj['text'] = request.data.decode('utf-8')
# Call the Node.js API # Call the Node.js API
response = requests.post(API_URL, json={'code': code, 'request': request_obj}) response = requests.post(API_URL, json={'code': code, 'request': request_obj, 'environment': environment})
response_data = response.json() response_data = response.json()
# Map the Node.js response to Flask response # Map the Node.js response to Flask response

12
db.py
View File

@@ -48,21 +48,21 @@ class DataBase():
def get_http_functions(self): def get_http_functions(self):
http_functions = self.execute( http_functions = self.execute(
'SELECT id, NAME, script_content, invoked_count FROM http_functions', []) 'SELECT id, NAME, script_content, invoked_count, environment_info FROM http_functions ORDER by id DESC', [])
return http_functions return http_functions
def get_http_function(self, name): def get_http_function(self, name):
http_function = self.execute( http_function = self.execute(
'SELECT id, NAME, script_content, invoked_count FROM http_functions WHERE NAME=%s', [name], one=True) 'SELECT id, NAME, script_content, invoked_count, environment_info FROM http_functions WHERE NAME=%s', [name], one=True)
return http_function return http_function
def create_new_http_function(self, name, script_content): def create_new_http_function(self, name, script_content, environment_info):
self.execute( self.execute(
'INSERT INTO http_functions (NAME, script_content) VALUES (%s, %s)', [name, script_content], commit=True) 'INSERT INTO http_functions (NAME, script_content, environment_info) VALUES (%s, %s, %s)', [name, script_content, environment_info], commit=True)
def edit_http_function(self, name, script_content): def edit_http_function(self, name, script_content, environment_info):
self.execute( self.execute(
'UPDATE http_functions SET script_content=%s WHERE NAME=%s', [script_content, name], commit=True) 'UPDATE http_functions SET script_content=%s, environment_info=%s WHERE NAME=%s', [script_content, environment_info, name], commit=True)
def delete_http_function(self, name): def delete_http_function(self, name):
self.execute( self.execute(

View File

@@ -8,15 +8,13 @@ def create_http_function_view_model(http_function):
"name": name, "name": name,
"script_content": http_function['script_content'], "script_content": http_function['script_content'],
"url": f"{base_url}{name}", "url": f"{base_url}{name}",
"invoke_count": http_function['invoked_count'] "invoke_count": http_function['invoked_count'],
"environment_info": http_function['environment_info']
} }
return function_view_model return function_view_model
def create_http_functions_view_model(http_functions): def create_http_functions_view_model(http_functions):
# Base URL for the function invocation
base_url = "https://function.peterstockings.com/f/"
view_model = [] view_model = []
for function in http_functions: for function in http_functions:
function_view_model = create_http_function_view_model(function) function_view_model = create_http_function_view_model(function)

View File

@@ -9,9 +9,10 @@
<div> <div>
<div class="flex space-x-2 p-2 border-b border-gray-200 dark:border-gray-800"> <div class="flex space-x-2 p-2 border-b border-gray-200 dark:border-gray-800">
<h1 class="font-semibold text-lg text-gray-400 font-mono flex items-center" data-id="52">Code</h1>
<button <button
class="inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2 text-gray-600 dark:text-gray-400" class="inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2 text-gray-600 dark:text-gray-400 justify-between"
id="executeBtn"> id="executeBtn">
<span class="sr-only" data-id="4">Bold</span> <span class="sr-only" data-id="4">Bold</span>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
@@ -32,10 +33,36 @@
</svg> </svg>
</button> </button>
<!-- Spacer Div -->
<div class="flex-auto"></div>
</div> </div>
<div id="editor" class="relative rounded-lg shadow-lg p-4 mb-4">{{ script }}</div> <div id="editor" class="relative rounded-lg shadow-lg p-4 mb-4">{{ script }}</div>
<div class="flex space-x-2 p-2 border-b border-gray-200 dark:border-gray-800 justify-between">
<h1 class="font-semibold text-lg text-gray-400 font-mono flex items-center" data-id="52">Environment</h1>
<!-- Spacer Div -->
<div class="flex-auto"></div>
</div>
<div id="editor-environment" class="relative rounded-lg shadow-lg p-4 mb-2">{{ environment_info }}</div>
<script>
var editor_environment = ace.edit("editor-environment");
editor_environment.setOptions({
maxLines: 15, //editor_environment.session.getLength()
minLines: 5
});
editor_environment.setTheme("ace/theme/github_dark");
editor_environment.session.setMode("ace/mode/json");
//editor_environment.session.$worker.send("changeOptions", [{ asi: true }]);
</script>
<div class="flex"> <div class="flex">
<button <button
class="bg-transparent hover:bg-blue-500 text-blue-700 font-semibold hover:text-white py-2 px-4 border border-blue-500 hover:border-transparent rounded flex mr-2" class="bg-transparent hover:bg-blue-500 text-blue-700 font-semibold hover:text-white py-2 px-4 border border-blue-500 hover:border-transparent rounded flex mr-2"
@@ -60,9 +87,9 @@
<span>Delete</span> <span>Delete</span>
</button> </button>
</div> </div>
</div> </div>
<div id="output"> <div id="output">
@@ -154,13 +181,14 @@
document.querySelector('#add-http-function').addEventListener('click', () => { document.querySelector('#add-http-function').addEventListener('click', () => {
let name = '{{ name }}'; let name = '{{ name }}';
let script_content = editor.getValue().trim(); let script_content = editor.getValue().trim();
let environment_info = editor_environment.getValue().trim();
fetch("{{ url_for('edit_http_function') }}", { fetch("{{ url_for('edit_http_function') }}", {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({ name, script_content }), body: JSON.stringify({ name, script_content, environment_info }),
}) })
.then(response => response.text()) .then(response => response.text())
.then(text => { .then(text => {

View File

@@ -10,6 +10,8 @@
<div> <div>
<div class="flex space-x-2 p-2 border-b border-gray-200 dark:border-gray-800"> <div class="flex space-x-2 p-2 border-b border-gray-200 dark:border-gray-800">
<h1 class="font-semibold text-lg text-gray-400 font-mono flex items-center" data-id="52">Code</h1>
<input type="text" id="function-name" <input type="text" id="function-name"
class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 max-w-fit" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 max-w-fit"
placeholder="foo" required="" value="{{ name }}"> placeholder="foo" required="" value="{{ name }}">
@@ -39,6 +41,28 @@
<div id="editor" class="relative rounded-lg shadow-lg p-4 mb-4">{{ script }}</div> <div id="editor" class="relative rounded-lg shadow-lg p-4 mb-4">{{ script }}</div>
<div class="flex space-x-2 p-2 border-b border-gray-200 dark:border-gray-800 justify-between">
<h1 class="font-semibold text-lg text-gray-400 font-mono flex items-center" data-id="52">Environment</h1>
<!-- Spacer Div -->
<div class="flex-auto"></div>
</div>
<div id="editor-environment" class="relative rounded-lg shadow-lg p-4 mb-2">{}</div>
<script>
var editor_environment = ace.edit("editor-environment");
editor_environment.setOptions({
maxLines: 15, //editor_environment.session.getLength()
minLines: 5
});
editor_environment.setTheme("ace/theme/github_dark");
editor_environment.session.setMode("ace/mode/json");
//editor_environment.session.$worker.send("changeOptions", [{ asi: true }]);
</script>
<button <button
class="bg-transparent hover:bg-blue-500 text-blue-700 font-semibold hover:text-white py-2 px-4 border border-blue-500 hover:border-transparent rounded flex" class="bg-transparent hover:bg-blue-500 text-blue-700 font-semibold hover:text-white py-2 px-4 border border-blue-500 hover:border-transparent rounded flex"
id="add-http-function"> id="add-http-function">
@@ -141,13 +165,14 @@
document.querySelector('#add-http-function').addEventListener('click', () => { document.querySelector('#add-http-function').addEventListener('click', () => {
let name = document.querySelector('#function-name').value; let name = document.querySelector('#function-name').value;
let script_content = editor.getValue().trim(); let script_content = editor.getValue().trim();
let environment_info = editor_environment.getValue().trim();
fetch("{{ url_for('create_http_function') }}", { fetch("{{ url_for('create_http_function') }}", {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({ name, script_content }), body: JSON.stringify({ name, script_content, environment_info }),
}) })
.then(response => response.text()) .then(response => response.text())
.then(text => { .then(text => {