fix(sysadmin): use site_id UUID string instead of integer PK throughout manager endpoints
The sysadmin panel URL uses site.site_id (UUID string) not site.id (int PK).
All manager account endpoints were querying/expecting the integer PK — none matched.
- GET /by-site/{site_id}: param type str, filter by Site.site_id
- POST /register: site_ids type list[str], query Site.site_id.in_()
- DELETE /site-access: site_id type str, query Site.site_id
- schemas/manager.py: ManagerRegisterRequest.site_ids list[int] → list[str]
- SiteDetailPage.jsx: remove Number() casts on siteId in add/remove calls
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -59,7 +59,7 @@ def register_manager(
|
|||||||
_admin=Depends(get_current_admin),
|
_admin=Depends(get_current_admin),
|
||||||
):
|
):
|
||||||
existing = db.query(ManagerAccount).filter(ManagerAccount.email == body.email).first()
|
existing = db.query(ManagerAccount).filter(ManagerAccount.email == body.email).first()
|
||||||
sites = db.query(Site).filter(Site.id.in_(body.site_ids)).all()
|
sites = db.query(Site).filter(Site.site_id.in_(body.site_ids)).all()
|
||||||
|
|
||||||
if existing:
|
if existing:
|
||||||
# Email already exists — just add the new site access links, don't recreate the account
|
# Email already exists — just add the new site access links, don't recreate the account
|
||||||
@@ -114,11 +114,11 @@ class ManagerBySiteOut(BaseModel):
|
|||||||
|
|
||||||
@router.get("/by-site/{site_id}", response_model=list[ManagerBySiteOut])
|
@router.get("/by-site/{site_id}", response_model=list[ManagerBySiteOut])
|
||||||
def get_managers_by_site(
|
def get_managers_by_site(
|
||||||
site_id: int,
|
site_id: str,
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
_admin=Depends(get_current_admin),
|
_admin=Depends(get_current_admin),
|
||||||
):
|
):
|
||||||
site = db.query(Site).filter(Site.id == site_id).first()
|
site = db.query(Site).filter(Site.site_id == site_id).first()
|
||||||
if not site:
|
if not site:
|
||||||
raise HTTPException(status_code=404, detail="Site not found")
|
raise HTTPException(status_code=404, detail="Site not found")
|
||||||
return site.manager_accounts
|
return site.manager_accounts
|
||||||
@@ -128,7 +128,7 @@ def get_managers_by_site(
|
|||||||
|
|
||||||
class SiteAccessRemoveRequest(BaseModel):
|
class SiteAccessRemoveRequest(BaseModel):
|
||||||
manager_id: int
|
manager_id: int
|
||||||
site_id: int
|
site_id: str # site_id UUID string, not integer PK
|
||||||
|
|
||||||
|
|
||||||
@router.delete("/site-access", status_code=status.HTTP_204_NO_CONTENT)
|
@router.delete("/site-access", status_code=status.HTTP_204_NO_CONTENT)
|
||||||
@@ -141,7 +141,7 @@ def remove_manager_site_access(
|
|||||||
if not manager:
|
if not manager:
|
||||||
raise HTTPException(status_code=404, detail="Manager not found")
|
raise HTTPException(status_code=404, detail="Manager not found")
|
||||||
|
|
||||||
site = db.query(Site).filter(Site.id == body.site_id).first()
|
site = db.query(Site).filter(Site.site_id == body.site_id).first()
|
||||||
if not site:
|
if not site:
|
||||||
raise HTTPException(status_code=404, detail="Site not found")
|
raise HTTPException(status_code=404, detail="Site not found")
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class ManagerRegisterRequest(BaseModel):
|
|||||||
email: str
|
email: str
|
||||||
password: str
|
password: str
|
||||||
full_name: Optional[str] = None
|
full_name: Optional[str] = None
|
||||||
site_ids: list[int] = []
|
site_ids: list[str] = [] # site_id UUID strings, not integer PKs
|
||||||
|
|
||||||
|
|
||||||
class ManagerLoginRequest(BaseModel):
|
class ManagerLoginRequest(BaseModel):
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ export default function SiteDetailPage() {
|
|||||||
if (!newMgrEmail.trim() || !newMgrPass.trim()) return
|
if (!newMgrEmail.trim() || !newMgrPass.trim()) return
|
||||||
setAddingMgr(true)
|
setAddingMgr(true)
|
||||||
try {
|
try {
|
||||||
await addManagerToSite(newMgrEmail.trim(), newMgrName.trim(), newMgrPass.trim(), Number(siteId))
|
await addManagerToSite(newMgrEmail.trim(), newMgrName.trim(), newMgrPass.trim(), siteId)
|
||||||
toast.success('Manager added')
|
toast.success('Manager added')
|
||||||
setModal(null)
|
setModal(null)
|
||||||
setNewMgrEmail(''); setNewMgrName(''); setNewMgrPass('')
|
setNewMgrEmail(''); setNewMgrName(''); setNewMgrPass('')
|
||||||
@@ -90,7 +90,7 @@ export default function SiteDetailPage() {
|
|||||||
async function doRemoveManager(managerId) {
|
async function doRemoveManager(managerId) {
|
||||||
setRemovingMgrId(managerId)
|
setRemovingMgrId(managerId)
|
||||||
try {
|
try {
|
||||||
await removeManagerSiteAccess(managerId, Number(siteId))
|
await removeManagerSiteAccess(managerId, siteId)
|
||||||
toast.success('Access removed')
|
toast.success('Access removed')
|
||||||
setManagers(prev => prev.filter(m => m.id !== managerId))
|
setManagers(prev => prev.filter(m => m.id !== managerId))
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user