narinder1231 commited on
Commit
1bc36c9
·
1 Parent(s): 5e2b9a0

Add AuthService for user authentication and session management

Browse files
src/services/__init__.py CHANGED
@@ -1,7 +1,10 @@
1
- from ._ai_voice_service import AIVoiceService
 
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)