Álvaro Valenzuela Valdes
feat: implement local database management system with admin stats and clear functions
9c9cca9 | import sys | |
| import os | |
| import json | |
| import shutil | |
| from datetime import datetime, timedelta | |
| # Ensure parent directory is in path | |
| sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
| from fastapi import FastAPI | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from app.routers import analysis, company, health, tenders, documents, oc, tender_details, admin | |
| from app.database import engine, Base, SessionLocal, SQLALCHEMY_DATABASE_URL | |
| from app.models.tender import TenderModel | |
| from app.models.analysis import AnalysisHistoryModel | |
| from app.models.company import CompanyProfileModel | |
| from app.models.oc import OCModel | |
| from app.config import settings | |
| # Copy database to /tmp if needed (Linux/HF Spaces) | |
| if SQLALCHEMY_DATABASE_URL.startswith("sqlite:////tmp/"): | |
| src_db = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "andesops.db") | |
| dest_db = "/tmp/andesops.db" | |
| if os.path.exists(src_db) and not os.path.exists(dest_db): | |
| print(f"!!! HF DETECTED: Copying initial database from {src_db} to {dest_db} !!!") | |
| shutil.copy2(src_db, dest_db) | |
| # Create tables | |
| try: | |
| Base.metadata.create_all(bind=engine) | |
| except Exception as e: | |
| print(f"!!! Database creation error: {e} !!!") | |
| app = FastAPI(title="AndesOps AI") | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| # Routes | |
| app.include_router(health.router, prefix="/api", tags=["Health"]) | |
| app.include_router(tenders.router, prefix="/api", tags=["Tenders"]) | |
| app.include_router(analysis.router, prefix="/api", tags=["Analysis"]) | |
| app.include_router(company.router, prefix="/api", tags=["Company"]) | |
| app.include_router(documents.router, prefix="/api", tags=["Documents"]) | |
| app.include_router(oc.router, prefix="/api", tags=["Purchase Orders"]) | |
| app.include_router(tender_details.router, prefix="/api", tags=["Tender Details"]) | |
| app.include_router(admin.router, prefix="/api", tags=["Admin"]) | |
| async def startup_event(): | |
| print("!!! BACKEND STARTING UP !!!") | |
| db = SessionLocal() | |
| try: | |
| print(f"Checking database at: {settings.database_url}") | |
| count = db.query(TenderModel).count() | |
| print(f"Current tender count: {count}") | |
| if count == 0: | |
| print("Auto-seeding database...") | |
| # Basic Company Profile - Independent check | |
| if not db.query(CompanyProfileModel).first(): | |
| print("Seeding Generic Company Profile...") | |
| db.add(CompanyProfileModel( | |
| name="My Company", | |
| industry="Consulting", | |
| services="General Services", | |
| experience="1 year", | |
| regions="Nacional", | |
| documents_available="None" | |
| )) | |
| db.commit() | |
| except Exception as e: | |
| print(f"Seed error: {e}") | |
| finally: | |
| db.close() | |
| def read_root(): | |
| return {"message": "Welcome to AndesOps AI API"} | |