diff --git a/src/core/schemas.py b/src/core/schemas.py index c60731a..7ca5bec 100644 --- a/src/core/schemas.py +++ b/src/core/schemas.py @@ -107,6 +107,10 @@ class AdminUserCreate(BaseModel): role: str = "admin" # 'admin' | 'manager' +class AdminPasswordChange(BaseModel): + new_password: str + + # ── Statistics ──────────────────────────────────────────────────────────────── class AccessLogResponse(BaseModel): diff --git a/src/main.py b/src/main.py index 2da09de..bf5d19b 100644 --- a/src/main.py +++ b/src/main.py @@ -95,4 +95,5 @@ def _seed_admin() -> None: if __name__ == "__main__": - uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True) + port = int(os.environ.get("APP_PORT", 8000)) + uvicorn.run("main:app", host="0.0.0.0", port=port, reload=True) diff --git a/src/routers/admins.py b/src/routers/admins.py index 5c9c18c..88deded 100644 --- a/src/routers/admins.py +++ b/src/routers/admins.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Session from core.auth import hash_password from core.database import AdminUser, get_db from core.dependencies import require_admin -from core.schemas import AdminUserCreate, AdminUserResponse +from core.schemas import AdminUserCreate, AdminUserResponse, AdminPasswordChange router = APIRouter(prefix="/api/admin/admins", tags=["admin-admins"]) @@ -53,3 +53,19 @@ async def delete_admin( raise HTTPException(409, "Cannot delete the last admin account") db.delete(user) db.commit() + + +@router.patch("/{username}/password", status_code=204) +async def change_password( + username: str, + req: AdminPasswordChange, + db: Session = Depends(get_db), + _: dict = Depends(require_admin), +): + if not req.new_password: + raise HTTPException(422, "Password cannot be empty") + user: Optional[AdminUser] = db.query(AdminUser).filter_by(username=username).first() + if not user: + raise HTTPException(404, "Admin not found") + user.password_hash = hash_password(req.new_password) + db.commit() diff --git a/src/static/admin.html b/src/static/admin.html index 263beb3..ceb28cd 100644 --- a/src/static/admin.html +++ b/src/static/admin.html @@ -107,7 +107,10 @@ + + +