Build reusable bot framework
Some checks failed
CI / test (push) Has been cancelled
CI / compose-smoke (push) Has been cancelled

This commit is contained in:
Chelsea Lee
2026-07-19 21:53:24 -05:00
parent 7ecc1107b2
commit fbdf33e894
66 changed files with 8428 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
"""Authenticated reminder API routes."""
from datetime import datetime
import flask
import uuid
from api.security import jsonObject, requireUser
from modules.reminders import service
def registerRoutes(app):
@app.route("/api/reminders", methods=["GET"])
@requireUser()
def api_listReminders():
includeFinished = flask.request.args.get("include_finished", "false").lower()
includeFinished = includeFinished in {"1", "true", "yes"}
reminders = service.listReminders(
flask.g.user_uuid,
includeFinished=includeFinished,
limit=flask.request.args.get("limit", 50),
)
return flask.jsonify(
{"reminders": [_serializeReminder(item) for item in reminders]}
), 200
@app.route("/api/reminders", methods=["POST"])
@requireUser()
def api_createReminder():
data = jsonObject()
if data is None:
return flask.jsonify({"error": "JSON object required"}), 400
try:
reminder = service.createReminder(
flask.g.user_uuid,
data.get("message"),
data.get("run_at"),
data.get("timezone") or _userTimezone(),
recurrence=data.get("recurrence"),
)
except ValueError as error:
return flask.jsonify({"error": str(error)}), 400
return flask.jsonify(_serializeReminder(reminder)), 201
@app.route("/api/reminders/<reminderID>", methods=["DELETE"])
@requireUser()
def api_cancelReminder(reminderID):
try:
reminder = service.cancelReminder(flask.g.user_uuid, reminderID)
except (TypeError, ValueError):
reminder = None
if not reminder:
return flask.jsonify({"error": "active reminder not found"}), 404
return flask.jsonify(_serializeReminder(reminder)), 200
def _userTimezone():
from core import users
return users.getUserTimezone(flask.g.user_uuid) or "UTC"
def _serializeReminder(reminder):
serialized = {}
for key, value in reminder.items():
if isinstance(value, datetime):
serialized[key] = value.isoformat()
elif isinstance(value, uuid.UUID):
serialized[key] = str(value)
else:
serialized[key] = value
return serialized