admin / Strike
publicWeb-Based UK Cyber Compliance Tool with Reporting
Strike / strikexi-v2 / backend / app / main.py
2071 B · main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | import time from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from sqlalchemy import text from sqlalchemy.exc import OperationalError from .config import settings from .database import engine, SessionLocal, Base from . import models from .security import hash_password from .routers import auth, catalogue, assessments, audit, users app = FastAPI(title="StrikeXi API", version="2.0.0", description="NCSC CAF Cyber Maturity Assessment platform") app.add_middleware( CORSMiddleware, allow_origins=[o.strip() for o in settings.CORS_ORIGINS.split(",")], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(auth.router) app.include_router(users.router) app.include_router(catalogue.router) app.include_router(assessments.router) app.include_router(audit.router) def _wait_for_db(retries: int = 30): for i in range(retries): try: with engine.connect() as conn: conn.execute(text("SELECT 1")) return except OperationalError: time.sleep(2) raise RuntimeError("Database not reachable after retries") @app.on_event("startup") def on_startup(): _wait_for_db() # Schema is created by SQL init scripts; ensure ORM tables exist too (idempotent). Base.metadata.create_all(bind=engine) # Seed the admin user (bcrypt) if missing. db = SessionLocal() try: existing = db.query(models.User).filter( models.User.username == settings.ADMIN_USERNAME).first() if not existing: db.add(models.User( username=settings.ADMIN_USERNAME, password_hash=hash_password(settings.ADMIN_PASSWORD), full_name="Administrator", role="admin", is_active=True, # Force the operator to set a real password on first login. must_change_password=True, )) db.commit() finally: db.close() @app.get("/api/health") def health(): return {"status": "ok"} |