from contextlib import asynccontextmanager from fastapi import FastAPI from src.components.poo_recorder import PooRecorder from src.config import Config from src.util.homeassistant import HomeAssistant from src.util.mqtt import MQTT from src.util.notion import NotionAsync from src.util.ticktick import TickTick Config.init() ticktick = TickTick() notion = NotionAsync(token=Config.get_env(key="NOTION_TOKEN")) mqtt = MQTT() homeassistant = HomeAssistant(ticktick=ticktick) poo_recorder = PooRecorder(mqtt=mqtt, notion=notion, homeassistant=homeassistant) @asynccontextmanager async def _lifespan(_app: FastAPI): # noqa: ANN202 await mqtt.start() yield await mqtt.stop() app = FastAPI(lifespan=_lifespan) @app.get("/homeassistant/status") async def get_status() -> dict: return {"Status": "Ok"} @app.post("/homeassistant/publish") async def homeassistant_publish(payload: HomeAssistant.Message) -> dict: return await homeassistant.process_message(message=payload) # Poo recorder @app.post("/poo/record") async def record(record_detail: PooRecorder.RecordField) -> PooRecorder.RecordField: await poo_recorder.record(record_detail) return record_detail # ticktick @app.get("/ticktick/auth/code") async def ticktick_auth(code: str, state: str) -> dict: if await ticktick.retrieve_access_token(code, state): return {"State": "Token Retrieved"} return {"State": "Token Retrieval Failed"}