From df7285a37b8863dd08adc97831286095d62adb4b Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Thu, 28 Nov 2024 17:17:29 +0100 Subject: [PATCH] Update --- .../stream_notifications/twitch/webhook.py | 2 + src/modules/web_app/serializers/auth.py | 4 ++ src/modules/web_app/serializers/streamer.py | 5 +++ src/modules/web_app/views/auth.py | 11 ++++-- src/modules/web_app/views/streamer.py | 37 +++++++++++++++++++ src/repositories/users.py | 11 ++++++ 6 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 src/modules/web_app/serializers/streamer.py create mode 100644 src/modules/web_app/views/streamer.py diff --git a/src/modules/stream_notifications/twitch/webhook.py b/src/modules/stream_notifications/twitch/webhook.py index c9878ad..f0982d7 100644 --- a/src/modules/stream_notifications/twitch/webhook.py +++ b/src/modules/stream_notifications/twitch/webhook.py @@ -96,12 +96,14 @@ class TwitchService: assert self.twitch._user_auth_token is not None + logger.info("Check token...") val_result = await validate_token( self.twitch._user_auth_token, auth_base_url=self.twitch.auth_base_url ) if val_result.get('status', 200) != 200: await self.twitch.refresh_used_token() + logger.info("Token refreshed") async def run(self) -> NoReturn: eventsub = EventSubWebhook( diff --git a/src/modules/web_app/serializers/auth.py b/src/modules/web_app/serializers/auth.py index 468454a..b8e8c1e 100644 --- a/src/modules/web_app/serializers/auth.py +++ b/src/modules/web_app/serializers/auth.py @@ -3,3 +3,7 @@ from pydantic import BaseModel class GetAuthorizationUrlResponse(BaseModel): authorization_url: str + + +class CallbackResponse(BaseModel): + token: str diff --git a/src/modules/web_app/serializers/streamer.py b/src/modules/web_app/serializers/streamer.py new file mode 100644 index 0000000..4b21fd5 --- /dev/null +++ b/src/modules/web_app/serializers/streamer.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class StreamerSerializer(BaseModel): + pass diff --git a/src/modules/web_app/views/auth.py b/src/modules/web_app/views/auth.py index 96e535c..963140c 100644 --- a/src/modules/web_app/views/auth.py +++ b/src/modules/web_app/views/auth.py @@ -4,7 +4,7 @@ from domain.auth import OAuthProvider, OAuthData from domain.users import CreateUser from modules.web_app.services.oauth.process_callback import process_callback from modules.web_app.services.oauth.authorization_url_getter import get_authorization_url as gen_auth_link -from modules.web_app.serializers.auth import GetAuthorizationUrlResponse +from modules.web_app.serializers.auth import GetAuthorizationUrlResponse, CallbackResponse from modules.web_app.auth.authx import auth from repositories.users import UserRepository @@ -20,7 +20,7 @@ async def get_authorization_url(provider: OAuthProvider) -> GetAuthorizationUrlR @auth_router.get("/callback/{provider}/") -async def callback(provider: OAuthProvider, code: str): +async def callback(provider: OAuthProvider, code: str) -> CallbackResponse: user_data = await process_callback(provider, code) user = await UserRepository.get_or_create_user( @@ -30,6 +30,9 @@ async def callback(provider: OAuthProvider, code: str): ) ) - token = auth.create_access_token(uid=user.id, data={"is_admin": user.is_admin}) + token = auth.create_access_token( + uid=user.id, + is_admin=user.is_admin + ) - return {"token": token} + return CallbackResponse(token=token) diff --git a/src/modules/web_app/views/streamer.py b/src/modules/web_app/views/streamer.py new file mode 100644 index 0000000..a2c4bb7 --- /dev/null +++ b/src/modules/web_app/views/streamer.py @@ -0,0 +1,37 @@ +from fastapi import APIRouter, Depends +from authx import RequestToken + +from modules.web_app.auth.authx import auth +from modules.web_app.serializers.streamer import StreamerSerializer +from repositories.streamers import StreamerConfigRepository +from repositories.users import UserRepository +from domain.auth import OAuthProvider + + +streamer_router = APIRouter(prefix="/streamers") + + +@streamer_router.get("/") +async def get_streamers( + token: RequestToken = Depends(RequestToken) +) -> list[StreamerSerializer]: + payload = auth.verify_token(token) + + u_id = payload.sub + is_admin: bool = getattr(payload, "is_admin", False) + + + if is_admin: + streamers = await StreamerConfigRepository.all() + else: + user = await UserRepository.get(u_id) + + twith_oauth = user.oauths.get(OAuthProvider.TWITCH) + if not twith_oauth: + return [] + + streamers = [await StreamerConfigRepository.get_by_twitch_id( + int(twith_oauth.id) + )] + + return [StreamerSerializer(**streamer.model_dump()) for streamer in streamers] diff --git a/src/repositories/users.py b/src/repositories/users.py index 3b3db62..0eb0eb9 100644 --- a/src/repositories/users.py +++ b/src/repositories/users.py @@ -6,6 +6,17 @@ from .base import BaseRepository class UserRepository(BaseRepository): COLLECTION_NAME = "users" + @classmethod + async def get(cls, user_id: str) -> User: + async with cls.connect() as collection: + user = await collection.find_one({"_id": user_id}) + + return User( + id=str(user["_id"]), + oauths=user["oauths"], + is_admin=user["is_admin"], + ) + @classmethod async def get_or_create_user(cls, newUser: CreateUser) -> User: filter_data = {}