From 7897f34c1ee3f1b9b749f9303fe84ec03e793dbf Mon Sep 17 00:00:00 2001 From: Anuj-Gupta4 Date: Fri, 6 Sep 2024 15:32:37 +0545 Subject: [PATCH] refactor: get user interests --- backend/api/users/resources.py | 24 +++++++++++++++++------- backend/services/users/user_service.py | 20 +++++++++++++------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/backend/api/users/resources.py b/backend/api/users/resources.py index 3ab6e597b8..294bb6a3aa 100644 --- a/backend/api/users/resources.py +++ b/backend/api/users/resources.py @@ -6,10 +6,15 @@ # from backend.services.users.authentication_service import token_auth from backend.services.users.user_service import UserService from backend.services.project_service import ProjectService +from backend.services.users.authentication_service import login_required +from backend.models.dtos.user_dto import AuthUserDTO from fastapi import APIRouter, Depends, Request from backend.db import get_session from starlette.authentication import requires from sqlalchemy.ext.asyncio import AsyncSession +from databases import Database +from backend.db import get_db + router = APIRouter( prefix="/users", @@ -326,11 +331,8 @@ async def get(request: Request): return locked_tasks.model_dump(by_alias=True), 200 -# class UsersQueriesInterestsAPI(): - # @token_auth.login_required @router.get("/{username}/queries/interests/") -@requires("authenticated") -async def get(request: Request, username): +async def get(request: Request, username: str, db: Database = Depends(get_db), user: AuthUserDTO = Depends(login_required)): """ Get interests by username --- @@ -358,9 +360,17 @@ async def get(request: Request, username): 500: description: Internal Server Error """ - user = UserService.get_user_by_username(username) - interests_dto = UserService.get_interests(user) - return interests_dto.model_dump(by_alias=True), 200 + query = """ + SELECT u.id, u.username, array_agg(i.name) AS interests + FROM users u + LEFT JOIN user_interests ui ON u.id = ui.user_id + LEFT JOIN interests i ON ui.interest_id = i.id + WHERE u.username = :username + GROUP BY u.id, u.username + """ + user = await db.fetch_one(query, {"username": username}) + interests_dto = await UserService.get_interests(user, db) + return interests_dto # class UsersRecommendedProjectsAPI(): diff --git a/backend/services/users/user_service.py b/backend/services/users/user_service.py index f94be38c47..ce30700383 100644 --- a/backend/services/users/user_service.py +++ b/backend/services/users/user_service.py @@ -20,7 +20,7 @@ UserCountryContributed, UserCountriesContributed, ) -from backend.models.dtos.interests_dto import InterestsListDTO, InterestDTO +from backend.models.dtos.interests_dto import InterestsListDTO, InterestDTO, ListInterestDTO from backend.models.postgis.interests import Interest, project_interests from backend.models.postgis.message import Message, MessageType from backend.models.postgis.project import Project @@ -840,12 +840,18 @@ def register_user_with_email(user_dto: UserRegisterEmailDTO): return user @staticmethod - def get_interests(user: User) -> InterestsListDTO: - dto = InterestsListDTO() - for interest in Interest.query.all(): - int_dto = interest.as_dto() + async def get_interests(user: User, db: Database) -> InterestsListDTO: + query = """ + SELECT * FROM interests + """ + interests = await db.fetch_all(query) + interest_list_dto = InterestsListDTO() + + for interest in interests: + int_dto = ListInterestDTO(**interest) + if interest in user.interests: int_dto.user_selected = True - dto.interests.append(int_dto) + interest_list_dto.interests.append(int_dto) - return dto + return interest_list_dto