from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app.core.database import get_db from app.api.deps import get_api_key from app.models.module import Module import secrets from pydantic import BaseModel from datetime import datetime router = APIRouter() class ModuleCreate(BaseModel): name: str class ModuleResponse(BaseModel): id: int name: str secret_key: str is_active: bool class Config: from_attributes = True @router.post("/modules", response_model=ModuleResponse) def create_module( module_in: ModuleCreate, db: Session = Depends(get_db), api_key: str = Depends(get_api_key) # Only global admin key should be allowed here ideally ): # Check if exists db_module = db.query(Module).filter(Module.name == module_in.name).first() if db_module: raise HTTPException(status_code=400, detail="Module already exists") new_key = secrets.token_hex(32) db_module = Module( name=module_in.name, secret_key=new_key ) db.add(db_module) db.commit() db.refresh(db_module) return db_module @router.post("/modules/{module_id}/rotate", response_model=ModuleResponse) def rotate_module_key( module_id: int, db: Session = Depends(get_db), api_key: str = Depends(get_api_key) ): db_module = db.query(Module).filter(Module.id == module_id).first() if not db_module: raise HTTPException(status_code=404, detail="Module not found") db_module.secret_key = secrets.token_hex(32) db_module.last_rotated_at = datetime.utcnow() db.commit() db.refresh(db_module) return db_module @router.get("/modules", response_model=list[ModuleResponse]) def get_modules( db: Session = Depends(get_db), api_key: str = Depends(get_api_key) ): return db.query(Module).all()