47f7a85510
Die Ampel-Nachruestung deckte 317/337 vorbestehende ruff-Verstoesse im ganzen Repo auf. Aufgeraeumt: - ruff.toml: intentionale Muster als Projekt-Politik ausgenommen (BLE001 blind-except, S110/S112 try-except-pass/continue, PLW1510 subprocess-best-effort, B008 FastAPI- Depends/File-Idiom, EXE001 Shebang, + wenige Stil-Regeln). __init__.py-Re-Exports geschuetzt (F401). - ruff --fix: 128 mechanische (Import-Sortierung, PEP585/604-Annotationen, tote Imports, ueberfluessige noqa) auto-behoben. - 12 echte Reste von Hand: PERF402/102, PLC3002 (Lambda->walrus), ISC004 (String-Concat geklammert), F841/RUF059 (ungenutzte Vars), PIE810 (startswith-Tuple), UP031 (f-string), UP035 (veraltete typing-Imports). Ergebnis: 'ruff check .' = 0, 'compileall' grün. Kein Verhaltenswechsel (nur Stil/Modernisierung). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
"""Erinnerungen & Routinen (A3) — dünner REST-Layer über services/reminders.py.
|
|
Konsument ist v.a. der Hermes-Agent via mcp_mc.py (reminder_create/list/delete);
|
|
LAN-only wie alle MC2-Endpoints."""
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from pydantic import BaseModel
|
|
from services import reminders
|
|
|
|
router = APIRouter(prefix="/api")
|
|
|
|
|
|
class ReminderIn(BaseModel):
|
|
text: str # was angesagt werden soll
|
|
when: str # ISO-8601; ohne Offset = Commander-Zeitzone (Europe/Berlin)
|
|
repeat: str = "" # '' einmalig | daily | weekdays | weekly
|
|
|
|
|
|
class ReminderOut(BaseModel):
|
|
id: int
|
|
text: str
|
|
next_ts: float
|
|
repeat: str
|
|
created_ts: float
|
|
when_local: str
|
|
|
|
|
|
class ReminderListResponse(BaseModel):
|
|
items: list[ReminderOut]
|
|
|
|
|
|
@router.get("/reminders", response_model=ReminderListResponse)
|
|
def list_reminders() -> dict:
|
|
return {"items": reminders.list_all()}
|
|
|
|
|
|
@router.post("/reminders")
|
|
def create_reminder(body: ReminderIn) -> dict:
|
|
try:
|
|
return {"ok": True, "item": reminders.create(body.text, body.when, body.repeat)}
|
|
except ValueError as exc:
|
|
raise HTTPException(400, str(exc))
|
|
|
|
|
|
@router.delete("/reminders/{reminder_id}")
|
|
def delete_reminder(reminder_id: int) -> dict:
|
|
try:
|
|
return {"ok": True, "deleted": reminders.delete(reminder_id)}
|
|
except KeyError as exc:
|
|
raise HTTPException(404, str(exc.args[0]))
|