1- from fastapi import APIRouter , Depends , HTTPException , Form
2- from passlib .hash import bcrypt
3- from sqlalchemy .orm import Session
4- from app .database import get_db
5- from app .models .user import User
6-
7- router = APIRouter ()
8-
9- # ✅ Create a new user
10- @router .post ("/" )
11- def create_user (
12- name : str = Form (...),
13- email : str = Form (...),
14- password : str = Form (...),
15- department : str = Form (None ),
16- role : str = Form ("auditee" ),
17- manager_email : str = Form (None ),
18- db : Session = Depends (get_db ),
19- ):
20- try :
21- if db .query (User ).filter (User .email == email ).first ():
22- raise HTTPException (status_code = 400 , detail = "Email already exists" )
23- user = User (
24- name = name ,
25- email = email ,
26- hashed_password = bcrypt .hash (password ),
27- department = department ,
28- role = role ,
29- manager_email = manager_email ,
30- )
31- db .add (user )
32- db .commit ()
33- return {"ok" : True , "message" : "User created successfully" }
34- except Exception as e :
35- return {"ok" : False , "error" : str (e )}
36-
37- # ✅ Login route
38- @router .post ("/login" )
39- def login_user (
40- email : str = Form (...),
41- password : str = Form (...),
42- db : Session = Depends (get_db )
43- ):
44- try :
45- user = db .query (User ).filter (User .email == email ).first ()
46- if not user or not bcrypt .verify (password , user .hashed_password ):
47- raise HTTPException (status_code = 401 , detail = "Invalid email or password" )
48- return {
49- "ok" : True ,
50- "message" : "Login successful" ,
51- "user" : {"id" : user .id , "name" : user .name , "role" : user .role },
52- }
53- except Exception as e :
54- return {"ok" : False , "error" : str (e )}
55-
56- # ✅ Get all users
57- @router .get ("/" )
58- def list_users (db : Session = Depends (get_db )):
59- try :
60- return db .query (User ).all ()
61- except Exception as e :
62- return {"ok" : False , "error" : str (e )}
63-
64- # ✅ Delete user
65- @router .delete ("/{user_id}" )
66- def delete_user (user_id : int , db : Session = Depends (get_db )):
67- try :
68- user = db .get (User , user_id )
69- if not user :
70- raise HTTPException (status_code = 404 , detail = "User not found" )
71- db .delete (user )
72- db .commit ()
73- return {"ok" : True , "message" : "User deleted" }
74- except Exception as e :
75- return {"ok" : False , "error" : str (e )}
76-
77- # ✅ Check Admin Users
78- @router .get ("/check-admin" )
79- def check_admin (db : Session = Depends (get_db )):
80- try :
81- users = db .query (User ).all ()
82- return {"count" : len (users ), "users" : [u .email for u in users ]}
83- except Exception as e :
84- return {"ok" : False , "error" : str (e )}
85-
86- # ✅ Seed Admin User (One-Time Setup)
1+ # ✅ Seed Admin User (One-Time Setup) – FIXED bcrypt byte issue
872@router .post ("/seed-admin" )
883def seed_admin (db : Session = Depends (get_db )):
894 try :
@@ -92,18 +7,25 @@ def seed_admin(db: Session = Depends(get_db)):
927 if existing :
938 return {"ok" : True , "note" : "Admin already exists" }
949
10+ # --- Fix bcrypt 72-byte password limit ---
11+ raw_password = "Edme@123"
12+ encoded = raw_password .encode ("utf-8" )
13+ if len (encoded ) > 72 :
14+ encoded = encoded [:72 ]
15+ safe_password = encoded .decode ("utf-8" , "ignore" )
16+ hashed_password = bcrypt .hash (safe_password )
17+ # ------------------------------------------
18+
9519 admin = User (
9620 name = "Admin" ,
9721 email = email ,
98- hashed_password = bcrypt . hash ( "Edme@123" ) ,
22+ hashed_password = hashed_password ,
9923 department = "Finance" ,
10024 role = "admin" ,
10125 manager_email = None ,
10226 )
10327 db .add (admin )
10428 db .commit ()
105- return {"ok" : True , "note" : "Admin created" }
29+ return {"ok" : True , "note" : "Admin created successfully " }
10630 except Exception as e :
10731 return {"ok" : False , "error" : str (e )}
108-
109-
0 commit comments