from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app.core.database import get_db from app.core.security import get_current_user from app.models.module import Module import secrets from pydantic import BaseModel from datetime import datetime from typing import List, Optional router = APIRouter() class ModuleCreate(BaseModel): name: str program: Optional[str] = None lob: Optional[str] = None job_code: Optional[str] = None class ModuleResponse(BaseModel): id: int name: str secret_key: str program: Optional[str] lob: Optional[str] job_code: Optional[str] is_active: bool created_at: datetime last_rotated_at: datetime class Config: from_attributes = True @router.post("/modules", response_model=ModuleResponse) def create_module( module_in: ModuleCreate, db: Session = Depends(get_db), current_user: str = Depends(get_current_user) ): 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, program=module_in.program, lob=module_in.lob, job_code=module_in.job_code ) db.add(db_module) db.commit() db.refresh(db_module) return db_module @router.get("/modules", response_model=List[ModuleResponse]) def get_modules( db: Session = Depends(get_db), current_user: str = Depends(get_current_user) ): return db.query(Module).all() @router.post("/modules/{module_id}/rotate", response_model=ModuleResponse) def rotate_module_key( module_id: int, db: Session = Depends(get_db), current_user: str = Depends(get_current_user) ): 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.delete("/modules/{module_id}") def delete_module( module_id: int, db: Session = Depends(get_db), current_user: str = Depends(get_current_user) ): 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.delete(db_module) db.commit() return {"status": "success"}