72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
"""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
|