50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
# Изменено: 2026-03-14
|
|
# Функция event-writer: принимает HTTP POST, пишет одну строку в таблицу events.
|
|
# Таблица создаётся автоматически при первом запуске.
|
|
# Env: POSTGRES_DSN — строка подключения к PostgreSQL.
|
|
|
|
import os
|
|
import json
|
|
import psycopg2
|
|
from datetime import datetime, timezone
|
|
|
|
def handle(request):
|
|
"""Записывает одно событие в таблицу events."""
|
|
dsn = os.environ["POSTGRES_DSN"]
|
|
|
|
body = {}
|
|
if request.get_data():
|
|
try:
|
|
body = json.loads(request.get_data())
|
|
except Exception:
|
|
pass
|
|
|
|
source = body.get("source", "node-red")
|
|
message = body.get("message", "ping")
|
|
|
|
conn = psycopg2.connect(dsn)
|
|
try:
|
|
with conn.cursor() as cur:
|
|
# Создаём таблицу если нет — безопасно вызывать при каждом запросе
|
|
cur.execute("""
|
|
CREATE TABLE IF NOT EXISTS events (
|
|
id SERIAL PRIMARY KEY,
|
|
source VARCHAR(100) NOT NULL DEFAULT 'unknown',
|
|
message TEXT NOT NULL DEFAULT '',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
)
|
|
""")
|
|
cur.execute(
|
|
"INSERT INTO events (source, message) VALUES (%s, %s) RETURNING id, created_at",
|
|
(source, message)
|
|
)
|
|
row = cur.fetchone()
|
|
conn.commit()
|
|
return json.dumps({
|
|
"ok": True,
|
|
"id": row[0],
|
|
"created_at": row[1].isoformat()
|
|
}), 200, {"Content-Type": "application/json"}
|
|
finally:
|
|
conn.close()
|