diff --git a/src/basic_memory/api/app.py b/src/basic_memory/api/app.py index e52c0b8c..4e7d7740 100644 --- a/src/basic_memory/api/app.py +++ b/src/basic_memory/api/app.py @@ -7,18 +7,40 @@ from fastapi.exception_handlers import http_exception_handler from loguru import logger from basic_memory import db -from .routers import knowledge, search, memory, resource +from basic_memory.api.routers import knowledge, search, memory, resource +from basic_memory.config import config +from basic_memory.services import DbVersionService @asynccontextmanager async def lifespan(app: FastAPI): """Lifecycle manager for the FastAPI app.""" logger.info("Starting Basic Memory API") + + # check the db state + await check_db(app) yield logger.info("Shutting down Basic Memory API") await db.shutdown_db() +async def check_db(app: FastAPI): + logger.info("Checking database state") + + # Initialize DB management service + db_service = DbVersionService( + config=config, + ) + + # Check and initialize DB if needed + if not await db_service.check_db(): + raise RuntimeError("Database initialization failed") + + # Clean up old backups on shutdown + await db_service.cleanup_backups() + + + # Initialize FastAPI app app = FastAPI( title="Basic Memory API", diff --git a/src/basic_memory/models/base.py b/src/basic_memory/models/base.py index 5b0d8c7d..40dfbdcc 100644 --- a/src/basic_memory/models/base.py +++ b/src/basic_memory/models/base.py @@ -1,5 +1,5 @@ """Base model class for SQLAlchemy models.""" -from sqlalchemy import String +from sqlalchemy import String, Integer from sqlalchemy.ext.asyncio import AsyncAttrs from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column