Spaces:
Running
Running
Made changes for face login
Browse files- users/routes.py +33 -15
users/routes.py
CHANGED
@@ -8,6 +8,7 @@ from users.services import create_user_account, create_user_embeddings, update_u
|
|
8 |
from services.facial_processing import FacialProcessing
|
9 |
from services.face_match import FaceMatch
|
10 |
import os
|
|
|
11 |
from datetime import timedelta
|
12 |
from dotenv import load_dotenv
|
13 |
from auth.services import get_token
|
@@ -25,76 +26,93 @@ async def create_user(data: UserCreate, db: Session = Depends(get_db)):
|
|
25 |
new_user = await create_user_account(data, db)
|
26 |
return new_user
|
27 |
|
28 |
-
@router.get("/me", response_model=UserBase)
|
29 |
async def read_users_me(current_user: User = Depends(get_current_user)):
|
30 |
return current_user
|
31 |
|
32 |
-
@router.put("/me", response_model=UserBase)
|
33 |
async def update_user_me(user: UserUpdate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
34 |
updated_user = update_user(db, current_user.id, user)
|
35 |
return updated_user
|
36 |
|
37 |
-
@router.post("/me/face", status_code=status.HTTP_200_OK)
|
38 |
async def create_face_embeddings(file: UploadFile = File(...), user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
39 |
face_processor = FacialProcessing()
|
40 |
|
41 |
-
|
42 |
-
|
43 |
-
|
|
|
|
|
44 |
|
45 |
embeddings = face_processor.extract_embeddings_vgg(image_path)
|
46 |
if embeddings:
|
47 |
user_embeddings = UserEmbeddingsBase(embeddings=embeddings)
|
48 |
await create_user_embeddings(user.id, user_embeddings, db)
|
|
|
|
|
|
|
49 |
return {"message": "Face embeddings created successfully"}
|
50 |
|
|
|
|
|
51 |
raise HTTPException(status_code=400, detail="Failed to process face")
|
52 |
|
53 |
-
@router.get("/me/face", status_code=status.HTTP_200_OK)
|
54 |
async def get_face_embeddings(user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
55 |
face = db.query(UserEmbeddingsBase).filter(UserEmbeddingsBase.user_id == user.id).first()
|
56 |
if not face:
|
57 |
raise HTTPException(status_code=404, detail="Face embeddings not found")
|
58 |
return JSONResponse(content={"embeddings": face.embeddings}, status_code=status.HTTP_200_OK)
|
59 |
|
60 |
-
@router.put("/me/face", status_code=status.HTTP_200_OK)
|
61 |
async def update_face_embeddings(file: UploadFile = File(...), user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
62 |
face_processor = FacialProcessing()
|
63 |
|
64 |
-
|
65 |
-
|
66 |
-
|
|
|
67 |
|
68 |
embeddings = face_processor.extract_embeddings_vgg(image_path)
|
69 |
if embeddings:
|
70 |
user_embeddings = UserEmbeddingsBase(embeddings=embeddings)
|
71 |
await update_user_embeddings(user.id, user_embeddings, db)
|
|
|
|
|
72 |
return {"message": "Face embeddings updated successfully"}
|
73 |
|
|
|
74 |
raise HTTPException(status_code=400, detail="Failed to process face")
|
75 |
|
76 |
-
@router.post("/login/face")
|
77 |
async def face_login(file: UploadFile = File(...), db: Session = Depends(get_db)):
|
78 |
face_processor = FacialProcessing()
|
79 |
face_matcher = FaceMatch(db)
|
80 |
|
81 |
-
|
82 |
-
|
83 |
-
|
|
|
84 |
|
85 |
embeddings = await face_processor.extract_embeddings(image_path)
|
86 |
if not embeddings:
|
|
|
87 |
raise HTTPException(status_code=400, detail="Failed to process face")
|
88 |
|
89 |
match_result = face_matcher.new_face_matching(embeddings)
|
90 |
if match_result['status'] == 'Success':
|
91 |
user = get_user_by_id(match_result['user_id'], db)
|
92 |
if not user:
|
|
|
93 |
raise HTTPException(status_code=404, detail="User not found")
|
94 |
|
95 |
access_token_expires = timedelta(minutes=int(os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", "30")))
|
96 |
payload = {"id": user.id, "sub": user.email}
|
97 |
token = get_token(payload, db)
|
|
|
|
|
98 |
return JSONResponse(content=token.dict(), status_code=status.HTTP_200_OK)
|
99 |
|
|
|
100 |
raise HTTPException(status_code=401, detail="Face not recognized")
|
|
|
8 |
from services.facial_processing import FacialProcessing
|
9 |
from services.face_match import FaceMatch
|
10 |
import os
|
11 |
+
import tempfile
|
12 |
from datetime import timedelta
|
13 |
from dotenv import load_dotenv
|
14 |
from auth.services import get_token
|
|
|
26 |
new_user = await create_user_account(data, db)
|
27 |
return new_user
|
28 |
|
29 |
+
@router.get("/me/", response_model=UserBase)
|
30 |
async def read_users_me(current_user: User = Depends(get_current_user)):
|
31 |
return current_user
|
32 |
|
33 |
+
@router.put("/me/", response_model=UserBase)
|
34 |
async def update_user_me(user: UserUpdate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
35 |
updated_user = update_user(db, current_user.id, user)
|
36 |
return updated_user
|
37 |
|
38 |
+
@router.post("/me/face/", status_code=status.HTTP_200_OK)
|
39 |
async def create_face_embeddings(file: UploadFile = File(...), user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
40 |
face_processor = FacialProcessing()
|
41 |
|
42 |
+
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
|
43 |
+
temp_file.write(await file.read())
|
44 |
+
temp_file.flush()
|
45 |
+
image_path = temp_file.name
|
46 |
+
|
47 |
|
48 |
embeddings = face_processor.extract_embeddings_vgg(image_path)
|
49 |
if embeddings:
|
50 |
user_embeddings = UserEmbeddingsBase(embeddings=embeddings)
|
51 |
await create_user_embeddings(user.id, user_embeddings, db)
|
52 |
+
|
53 |
+
os.remove(image_path)
|
54 |
+
|
55 |
return {"message": "Face embeddings created successfully"}
|
56 |
|
57 |
+
os.remove(image_path)
|
58 |
+
|
59 |
raise HTTPException(status_code=400, detail="Failed to process face")
|
60 |
|
61 |
+
@router.get("/me/face/", status_code=status.HTTP_200_OK)
|
62 |
async def get_face_embeddings(user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
63 |
face = db.query(UserEmbeddingsBase).filter(UserEmbeddingsBase.user_id == user.id).first()
|
64 |
if not face:
|
65 |
raise HTTPException(status_code=404, detail="Face embeddings not found")
|
66 |
return JSONResponse(content={"embeddings": face.embeddings}, status_code=status.HTTP_200_OK)
|
67 |
|
68 |
+
@router.put("/me/face/", status_code=status.HTTP_200_OK)
|
69 |
async def update_face_embeddings(file: UploadFile = File(...), user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
70 |
face_processor = FacialProcessing()
|
71 |
|
72 |
+
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
|
73 |
+
temp_file.write(await file.read())
|
74 |
+
temp_file.flush()
|
75 |
+
image_path = temp_file.name
|
76 |
|
77 |
embeddings = face_processor.extract_embeddings_vgg(image_path)
|
78 |
if embeddings:
|
79 |
user_embeddings = UserEmbeddingsBase(embeddings=embeddings)
|
80 |
await update_user_embeddings(user.id, user_embeddings, db)
|
81 |
+
|
82 |
+
os.remove(image_path)
|
83 |
return {"message": "Face embeddings updated successfully"}
|
84 |
|
85 |
+
os.remove(image_path)
|
86 |
raise HTTPException(status_code=400, detail="Failed to process face")
|
87 |
|
88 |
+
@router.post("/login/face/")
|
89 |
async def face_login(file: UploadFile = File(...), db: Session = Depends(get_db)):
|
90 |
face_processor = FacialProcessing()
|
91 |
face_matcher = FaceMatch(db)
|
92 |
|
93 |
+
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
|
94 |
+
temp_file.write(await file.read())
|
95 |
+
temp_file.flush()
|
96 |
+
image_path = temp_file.name
|
97 |
|
98 |
embeddings = await face_processor.extract_embeddings(image_path)
|
99 |
if not embeddings:
|
100 |
+
os.remove(image_path)
|
101 |
raise HTTPException(status_code=400, detail="Failed to process face")
|
102 |
|
103 |
match_result = face_matcher.new_face_matching(embeddings)
|
104 |
if match_result['status'] == 'Success':
|
105 |
user = get_user_by_id(match_result['user_id'], db)
|
106 |
if not user:
|
107 |
+
os.remove(image_path)
|
108 |
raise HTTPException(status_code=404, detail="User not found")
|
109 |
|
110 |
access_token_expires = timedelta(minutes=int(os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", "30")))
|
111 |
payload = {"id": user.id, "sub": user.email}
|
112 |
token = get_token(payload, db)
|
113 |
+
|
114 |
+
os.remove(image_path)
|
115 |
return JSONResponse(content=token.dict(), status_code=status.HTTP_200_OK)
|
116 |
|
117 |
+
os.remove(image_path)
|
118 |
raise HTTPException(status_code=401, detail="Face not recognized")
|