Add ability to see history of http functions invocations
This commit is contained in:
12
app.py
12
app.py
@@ -139,6 +139,18 @@ def delete_http_function():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"status": 'error', "message": str(e)}), 500
|
return jsonify({"status": 'error', "message": str(e)}), 500
|
||||||
|
|
||||||
|
@ app.route("/dashboard/http_functions/logs", methods=["GET"])
|
||||||
|
def get_http_function_logs():
|
||||||
|
name = request.args.get('name')
|
||||||
|
http_function = db.get_http_function(name)
|
||||||
|
if not http_function:
|
||||||
|
return jsonify({'error': 'Function not found'}), 404
|
||||||
|
|
||||||
|
http_function_id = http_function['id']
|
||||||
|
http_function_invocations = db.get_http_function_invocations(http_function_id)
|
||||||
|
return render_template("dashboard/http_functions/logs.html", name=name, http_function_invocations=http_function_invocations)
|
||||||
|
|
||||||
|
|
||||||
@ app.route("/dashboard/timer_functions", methods=["GET"])
|
@ app.route("/dashboard/timer_functions", methods=["GET"])
|
||||||
def dashboard_timer_functions():
|
def dashboard_timer_functions():
|
||||||
return render_template("dashboard/timer_functions.html")
|
return render_template("dashboard/timer_functions.html")
|
||||||
|
|||||||
8
db.py
8
db.py
@@ -76,3 +76,11 @@ class DataBase():
|
|||||||
def add_http_function_invocation(self, http_function_id, status, request_data, response_data, logs):
|
def add_http_function_invocation(self, http_function_id, status, request_data, response_data, logs):
|
||||||
self.execute(
|
self.execute(
|
||||||
'INSERT INTO http_function_invocations (http_function_id, status, request_data, response_data, logs) VALUES (%s, %s, %s, %s, %s)', [http_function_id, status, json.dumps(request_data), json.dumps(response_data), json.dumps(logs)], commit=True)
|
'INSERT INTO http_function_invocations (http_function_id, status, request_data, response_data, logs) VALUES (%s, %s, %s, %s, %s)', [http_function_id, status, json.dumps(request_data), json.dumps(response_data), json.dumps(logs)], commit=True)
|
||||||
|
|
||||||
|
def get_http_function_invocations(self, http_function_id):
|
||||||
|
http_function_invocations = self.execute(
|
||||||
|
"""SELECT id, http_function_id, STATUS, invocation_time, request_data, response_data, LOGS
|
||||||
|
FROM http_function_invocations
|
||||||
|
WHERE http_function_id=9
|
||||||
|
ORDER BY invocation_time DESC""", [http_function_id])
|
||||||
|
return http_function_invocations
|
||||||
@@ -47,9 +47,9 @@
|
|||||||
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0 hidden md:table-cell" data-id="68">
|
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0 hidden md:table-cell" data-id="68">
|
||||||
<button
|
<button
|
||||||
class="inline-flex items-center justify-center 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 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3"
|
class="inline-flex items-center justify-center 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 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3"
|
||||||
data-id="69" hx-get="{{ url_for('client', function=function.name) }}" hx-target="#container"
|
data-id="69" hx-get="{{ url_for('get_http_function_logs', name=function.name) }}"
|
||||||
hx-swap="innerHTML">
|
hx-target="#container" hx-swap="innerHTML">
|
||||||
Try
|
Logs
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="inline-flex items-center justify-center 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 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3"
|
class="inline-flex items-center justify-center 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 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3"
|
||||||
@@ -57,6 +57,12 @@
|
|||||||
hx-target="#container" hx-swap="innerHTML">
|
hx-target="#container" hx-swap="innerHTML">
|
||||||
Edit
|
Edit
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
class="inline-flex items-center justify-center 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 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 rounded-md px-3"
|
||||||
|
data-id="69" hx-get="{{ url_for('client', function=function.name) }}" hx-target="#container"
|
||||||
|
hx-swap="innerHTML">
|
||||||
|
Try
|
||||||
|
</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
48
templates/dashboard/http_functions/logs.html
Normal file
48
templates/dashboard/http_functions/logs.html
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<div class="flex items-center" data-id="51">
|
||||||
|
<h1 class="font-semibold text-lg md:text-2xl" data-id="52">Logs: <span class="font-mono">{{ name }}</span></h1>
|
||||||
|
<button
|
||||||
|
class="inline-flex items-center justify-center 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 bg-primary text-primary-foreground hover:bg-primary/90 h-9 rounded-md px-3 ml-auto"
|
||||||
|
hx-get="{{ url_for('dashboard_http_functions') }}" hx-target="#container" hx-swap="innerHTML">
|
||||||
|
Cancel
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-4 gap-4 p-4">
|
||||||
|
<!-- Headers -->
|
||||||
|
<div class="font-medium text-muted-foreground">Timestamp</div>
|
||||||
|
<div class="font-medium text-muted-foreground">Request</div>
|
||||||
|
<div class="font-medium text-muted-foreground">Response</div>
|
||||||
|
<div class="font-medium text-muted-foreground">Logs</div>
|
||||||
|
|
||||||
|
<!-- Data Rows -->
|
||||||
|
{% for invocation in http_function_invocations %}
|
||||||
|
<!-- Timestamp and Status -->
|
||||||
|
<div class="flex items-center space-x-2">
|
||||||
|
<span>{{ invocation.invocation_time.strftime('%Y-%m-%d %H:%M:%S') }}</span>
|
||||||
|
<button
|
||||||
|
class="{{ 'bg-green-400' if invocation.status == 'SUCCESS' else 'bg-red-400' }} hover:bg-opacity-75 text-white font-bold rounded-full h-fit p-2">
|
||||||
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||||
|
d="{{ 'M5 13l4 4L19 7' if invocation.status == 'SUCCESS' else 'M6 18L18 6M6 6l12 12' }}"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Request Data -->
|
||||||
|
<div class="font-mono text-gray-400 overflow-auto">
|
||||||
|
{{ invocation.request_data }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Response Data -->
|
||||||
|
<div class="font-mono text-gray-400 overflow-auto">
|
||||||
|
{{ invocation.response_data }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Logs -->
|
||||||
|
<div class="space-y-1">
|
||||||
|
{% for log in invocation.logs %}
|
||||||
|
<div class="font-mono text-gray-400">{{ log }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user