from face_recognition_logic import recognize_face import os import sys import grpc from concurrent import futures sys.path.insert(0, os.path.join(os.path.dirname(__file__), "proto")) from proto import face_recognition_pb2, face_recognition_pb2_grpc EMPLOYEE_DB_PATH = "data/employees" class FaceRecognitionServicer(face_recognition_pb2_grpc.FaceRecognitionServiceServicer): def Recognize(self, request, context): model_name = request.model_name if request.model_name else None print("DEBUG request.ListFields() =") print(f"[INFO] Received recognition request... {model_name}") try: result = recognize_face(request.image, model_name) return face_recognition_pb2.FaceResponse( name=result["name"], confidence=result["confidence"], image=result["image"] ) except Exception as e: print("[ERROR] Recognition failed:", e) return face_recognition_pb2.FaceResponse( name="Error", confidence=0.0, image=b"" ) def EnrollFace(self, request, context): try: name = request.name image_bytes = request.image if not name or not image_bytes: return face_recognition_pb2.EnrollFaceResponse( success=False, message="Name or image missing" ) os.makedirs(EMPLOYEE_DB_PATH, exist_ok=True) file_path = os.path.join(EMPLOYEE_DB_PATH, f"{name}.jpg") with open(file_path, "wb") as f: f.write(image_bytes) print(f"[INFO] Enrolled employee: {name}") return face_recognition_pb2.EnrollFaceResponse( success=True, message="Enrollment successful" ) except Exception as e: print(f"[ERROR] Enrollment failed: {e}") return face_recognition_pb2.EnrollFaceResponse( success=False, message=str(e) ) def GetAllEmployees(self, request, context): try: employee_files = [ f for f in os.listdir(EMPLOYEE_DB_PATH) if f.lower().endswith((".jpg", ".png", ".jpeg")) ] employees = [] for file in employee_files: path = os.path.join(EMPLOYEE_DB_PATH, file) name = os.path.splitext(file)[0] with open(path, "rb") as f: image_bytes = f.read() employees.append(face_recognition_pb2.Employee( name=name, image=image_bytes)) return face_recognition_pb2.EmployeeListResponse(employees=employees) except Exception as e: print("[ERROR] Failed to list employees:", e) return face_recognition_pb2.EmployeeListResponse(employees=[]) def DeleteEmployee(self, request, context): try: found = False for file in os.listdir(EMPLOYEE_DB_PATH): if os.path.splitext(file)[0] == request.name: os.remove(os.path.join(EMPLOYEE_DB_PATH, file)) found = True break message = "Deleted successfully" if found else "Employee not found" return face_recognition_pb2.DeleteEmployeeResponse(success=found, message=message) except Exception as e: print("[ERROR] Failed to delete employee:", e) return face_recognition_pb2.DeleteEmployeeResponse(success=False, message=str(e)) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) face_recognition_pb2_grpc.add_FaceRecognitionServiceServicer_to_server( FaceRecognitionServicer(), server) server.add_insecure_port("[::]:50051") server.start() print("[INFO] gRPC Face Recognition server running on port 50051") server.wait_for_termination() if __name__ == "__main__": os.makedirs(EMPLOYEE_DB_PATH, exist_ok=True) serve()