Spaces:
Runtime error
Runtime error
Commit ·
1bc36c9
1
Parent(s): 5e2b9a0
Add AuthService for user authentication and session management
Browse files- src/services/__init__.py +5 -2
- src/services/_auth_service.py +62 -0
src/services/__init__.py
CHANGED
|
@@ -1,7 +1,10 @@
|
|
| 1 |
-
from .
|
|
|
|
| 2 |
from ._ai_text_service import AITextService
|
|
|
|
| 3 |
from ._pinecone_service import PineconeService
|
| 4 |
|
| 5 |
-
__all__ = ["AIVoiceService", "AITextService", "PineconeService"]
|
|
|
|
| 6 |
__version__ = "0.1.0"
|
| 7 |
__author__ = "Ramanjit Singh"
|
|
|
|
| 1 |
+
from ._auth_service import AuthService
|
| 2 |
+
from ._user_service import UserService
|
| 3 |
from ._ai_text_service import AITextService
|
| 4 |
+
from ._ai_voice_service import AIVoiceService
|
| 5 |
from ._pinecone_service import PineconeService
|
| 6 |
|
| 7 |
+
__all__ = ["AIVoiceService", "AITextService", "PineconeService", "AuthService", "UserService"]
|
| 8 |
+
|
| 9 |
__version__ = "0.1.0"
|
| 10 |
__author__ = "Ramanjit Singh"
|
src/services/_auth_service.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import HTTPException
|
| 2 |
+
from datetime import datetime, timedelta
|
| 3 |
+
|
| 4 |
+
from src.utils import JWTUtil, BcryptUtil
|
| 5 |
+
from src.schemas import UserSignInSchema, UserSignUpSchema, SessionCreateSchema
|
| 6 |
+
|
| 7 |
+
from ._user_service import UserService
|
| 8 |
+
from ._session_service import SessionService
|
| 9 |
+
|
| 10 |
+
class AuthService:
|
| 11 |
+
def __init__(self):
|
| 12 |
+
self._jwt_util = JWTUtil()
|
| 13 |
+
self._user_service = UserService()
|
| 14 |
+
self._session_service = SessionService()
|
| 15 |
+
|
| 16 |
+
async def sign_up(self, user: UserSignUpSchema):
|
| 17 |
+
existing_user = await self._user_service.list_users(filter_by={"email": user.email})
|
| 18 |
+
if existing_user:
|
| 19 |
+
raise HTTPException(409, "User already exists")
|
| 20 |
+
|
| 21 |
+
return await self._user_service.create_user(user)
|
| 22 |
+
|
| 23 |
+
async def sign_in(self, user: UserSignInSchema):
|
| 24 |
+
existing_user = await self._user_service.list_users(filter_by={"email": user.email})
|
| 25 |
+
if not existing_user:
|
| 26 |
+
raise HTTPException(404, "Invalid credentials")
|
| 27 |
+
|
| 28 |
+
if not BcryptUtil.compare_password(
|
| 29 |
+
existing_user[0].hashed_password, user.password
|
| 30 |
+
):
|
| 31 |
+
raise HTTPException(404, "Invalid credentials")
|
| 32 |
+
|
| 33 |
+
token_payload = {
|
| 34 |
+
"user_id": str(existing_user[0].id),
|
| 35 |
+
"email": existing_user[0].email,
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
expiration_minutes = 60
|
| 39 |
+
|
| 40 |
+
token = self._jwt_util.generate_jwt(token_payload, expiration_minutes)
|
| 41 |
+
|
| 42 |
+
await self._session_service.create_session(
|
| 43 |
+
SessionCreateSchema(
|
| 44 |
+
user_id=existing_user[0].id,
|
| 45 |
+
token=token,
|
| 46 |
+
device_ipv4_address="127.0.0.1",
|
| 47 |
+
expired_at=datetime.now() + timedelta(minutes=expiration_minutes),
|
| 48 |
+
)
|
| 49 |
+
)
|
| 50 |
+
return token
|
| 51 |
+
|
| 52 |
+
async def sign_out(self, token: str):
|
| 53 |
+
session = await self._session_service.get_session_by_token(token)
|
| 54 |
+
|
| 55 |
+
expired_session = SessionCreateSchema(
|
| 56 |
+
user_id=session.user_id,
|
| 57 |
+
token=session.token,
|
| 58 |
+
device_ipv4_address=session.device_ipv4_address,
|
| 59 |
+
expired_at=datetime.now(),
|
| 60 |
+
)
|
| 61 |
+
|
| 62 |
+
await self._session_service.update_session(session.id, expired_session)
|