This commit is contained in:
timka123 committed 2026-10-18 18:02:05 +03:00
commit 17a0a3c4c9
121 files changed
+17641

No files matched your search

+58
View File
@@ -0,0 +1,58 @@
"""Blocker endpoints.
`GET /api/blocker/policy` is the one the desktop app polls every few seconds;
everything else is for the UI.
"""
from __future__ import annotations
from datetime import date
from fastapi import APIRouter, Query
from app.api.deps import DbSession, Settings
from app.api.schemas import BlockEventRequest
from app.services import blocker_service
from app.services.notify import notify
router = APIRouter(prefix="/api/blocker", tags=["blocker"])
@router.get("/policy")
def policy(session: DbSession, settings: Settings) -> dict:
return blocker_service.policy(session, settings)
@router.get("/events")
def events(
session: DbSession,
settings: Settings,
day: date | None = Query(default=None),
) -> dict:
return blocker_service.events_for_day(session, settings, day)
@router.post("/events")
def record(body: BlockEventRequest, session: DbSession, settings: Settings) -> dict:
"""The desktop app reports every attempt it turned away.
These are what make the daily report fun ("you reached for youtube 12
times"), so they are recorded even when the blocker only warned.
"""
event = blocker_service.record_event(
session,
settings,
kind=body.kind,
target=body.target,
action=body.action,
details=body.details,
)
if settings.blocker.notify_on_block and body.action == "killed":
notify(settings, f"🛑 Closed <b>{body.target}</b> — you are in a work interval.")
return {"id": event.id, "recorded": True}
@router.get("/defaults")
def defaults() -> dict:
"""Starter lists, so the blocker page is not an empty text box."""
return {"domains": blocker_service.DEFAULT_DOMAINS, "apps": blocker_service.DEFAULT_APPS}