AndesOps-AI / backend /app /main.py
Álvaro Valenzuela Valdes
style: Final layout polish, independent profile seeding, and detail view optimization
e1d119c
raw
history blame
5.48 kB
import sys
import os
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
from app.database import engine, Base, SessionLocal
from app.models.tender import TenderModel
from app.models.analysis import AnalysisHistoryModel
from app.models.company import CompanyProfileModel
from app.config import settings
from datetime import datetime, timedelta
import json
# Create tables
Base.metadata.create_all(bind=engine)
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.on_event("startup")
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 Company Profile...")
db.add(CompanyProfileModel(
name="Andes Digital Solutions",
industry="Software Engineering",
services="AI & Cloud",
experience="10 years",
regions="Nacional",
documents_available="RUT, Portfolio"
))
db.commit()
# Software Tenders
tenders_to_add = [
TenderModel(
code="2394-15-LR24",
name="ERP Implementation - Health Sector",
description="Large scale ERP for hospital network.",
buyer="Servicio de Salud",
status="Publicada",
closing_date=datetime.now() + timedelta(days=15),
estimated_amount=450000000,
region="Metropolitana",
sector="Software",
source="Mercado Público",
items=[],
attachments=[]
),
TenderModel(
code="5021-10-LP24",
name="AI Platform for Crime Analysis",
description="Machine learning and predictive models.",
buyer="Subsecretaría de Prevención del Delito",
status="Publicada",
closing_date=datetime.now() + timedelta(days=10),
estimated_amount=180000000,
region="Nacional",
sector="AI & Software",
source="Mercado Público",
items=[],
attachments=[]
),
TenderModel(
code="1022-5-LP24",
name="Cybersecurity Operations Center (SOC)",
description="24/7 monitoring and incident response.",
buyer="Ministerio del Interior",
status="Publicada",
closing_date=datetime.now() + timedelta(days=5),
estimated_amount=320000000,
region="Metropolitana",
sector="Cybersecurity",
source="Mercado Público",
items=[],
attachments=[]
),
TenderModel(
code="8821-2-LR24",
name="Cloud Migration Strategy",
description="Migration of legacy systems to AWS/Azure.",
buyer="Tesorería General",
status="Publicada",
closing_date=datetime.now() + timedelta(days=25),
estimated_amount=120000000,
region="Valparaíso",
sector="Cloud",
source="Mercado Público",
items=[
{"name": "Migration Service", "quantity": 1, "unit": "Unit"},
{"name": "Cloud Storage 100TB", "quantity": 1, "unit": "Year"}
],
attachments=[
{"name": "Bases_Tecnicas.pdf", "url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"},
{"name": "Anexo_Economico.docx", "url": "https://calibre-ebook.com/downloads/demos/demo.docx"}
]
)
]
for t in tenders_to_add:
if not db.query(TenderModel).filter(TenderModel.code == t.code).first():
db.add(t)
db.commit()
except Exception as e:
print(f"Seed error: {e}")
finally:
db.close()
@app.get("/")
def read_root():
return {"message": "Welcome to AndesOps AI API"}