Coverage for app/services/user.py: 95%

18 statements  

« prev     ^ index     » next       coverage.py v7.8.2, created at 2025-06-02 23:27 +0000

1from app.db.models import Campaign, UserCampaignRole, World 

2from fastapi import HTTPException 

3from app.core.exceptions import DatabaseQueryError, UserNotFoundError 

4from sqlalchemy.exc import SQLAlchemyError 

5 

6def get_user_info(user_id: str, db): 

7 try: 

8 # load user's roles in every campaign 

9 user_involvements = db.query(UserCampaignRole).filter_by(user_id = user_id).all() 

10 

11 if not user_involvements: 

12 raise UserNotFoundError() 

13 

14 # extract campaign ID's 

15 user_campaign_ids = {item.campaign_id for item in user_involvements} 

16 

17 # load campaign object 

18 user_campaigns = db.query(Campaign).filter(Campaign.id.in_(user_campaign_ids)).all() 

19 

20 # extract campaign name 

21 user_campaign_names = [c.name for c in user_campaigns] 

22 

23 # extract world ID's 

24 user_world_ids = {item.world_id for item in user_involvements} 

25 

26 # load world objects 

27 user_worlds = db.query(World).filter(World.id.in_(user_world_ids)).all() 

28 

29 # extract world name 

30 user_world_names = [w.name for w in user_worlds] 

31 

32 return { 

33 "campaign_names": user_campaign_names, 

34 "campaign_info": user_campaigns, 

35 "world_names": user_world_names, 

36 "world_info": user_worlds, 

37 } 

38 

39 except SQLAlchemyError as e: 

40 raise DatabaseQueryError()