1- from typing import List
1+ import logging
2+ from typing import Dict , List , Tuple
23
4+ from aiohttp import ClientSession
35from slack import methods
46from slack .events import Message
57from slack .io .abc import SlackAPI
68
7- from pybot .endpoints .slack .utils import COMMUNITY_CHANNEL
9+ from pybot .endpoints .slack .utils import (
10+ BACKEND_PASS ,
11+ BACKEND_URL ,
12+ BACKEND_USERNAME ,
13+ COMMUNITY_CHANNEL ,
14+ )
815from pybot .endpoints .slack .utils .action_messages import not_greeted_attachment
916from pybot .endpoints .slack .utils .event_messages import (
1017 base_resources ,
1320 team_join_initial_message ,
1421)
1522
23+ logger = logging .getLogger (__name__ )
24+
1625
17- def build_messages (user_id ):
26+ def base_user_message (user_id : str ) -> Message :
27+ message = Message ()
28+ message ["channel" ] = user_id
29+ message ["as_user" ] = True
30+ return message
31+
32+
33+ def build_messages (user_id ) -> Tuple [Message , Message , Message , Message ]:
1834 initial_message = base_user_message (user_id )
1935 initial_message ["text" ] = team_join_initial_message (user_id )
2036
@@ -34,17 +50,56 @@ def build_messages(user_id):
3450 return initial_message , second_message , action_menu , community_message
3551
3652
37- async def send_user_greetings (user_messages : List [Message ], slack_api : SlackAPI ):
53+ async def send_user_greetings (
54+ user_messages : List [Message ], slack_api : SlackAPI
55+ ) -> None :
3856 for message in user_messages :
3957 await slack_api .query (url = methods .CHAT_POST_MESSAGE , data = message )
4058
4159
42- async def send_community_notification (community_message : Message , slack_api : SlackAPI ):
60+ async def send_community_notification (
61+ community_message : Message , slack_api : SlackAPI
62+ ) -> dict :
4363 return await slack_api .query (url = methods .CHAT_POST_MESSAGE , data = community_message )
4464
4565
46- def base_user_message (user_id ):
47- message = Message ()
48- message ["channel" ] = user_id
49- message ["as_user" ] = True
50- return message
66+ async def link_backend_user (
67+ slack_id : str ,
68+ auth_header : Dict [str , str ],
69+ slack_api : SlackAPI ,
70+ session : ClientSession ,
71+ ) -> None :
72+ """
73+ Updates the slack user with their profile in the backend
74+ """
75+
76+ user_info = await slack_api .query (methods .USERS_INFO , {"user" : slack_id })
77+ email = user_info ["user" ]["profile" ]["email" ]
78+
79+ async with session .patch (
80+ f"{ BACKEND_URL } /auth/profile/admin/" ,
81+ headers = auth_header ,
82+ params = {"email" : email },
83+ json = {"slackId" : slack_id },
84+ ) as response :
85+ data = await response .json ()
86+ logger .info (f"Backend response from user linking: { data } " )
87+
88+
89+ async def get_backend_auth_headers (session : ClientSession ) -> Dict [str , str ]:
90+ """
91+ Authenticates with the OC Backend server
92+
93+ :return: Authorization header containing the returned JWT
94+ """
95+ async with session .post (
96+ f"{ BACKEND_URL } /auth/login/" ,
97+ json = {"email" : BACKEND_USERNAME , "password" : BACKEND_PASS },
98+ ) as response :
99+ if 400 <= response .status :
100+ logger .exception ("Failed to authenticate with backend" )
101+ return {}
102+ response .raise_for_status ()
103+ data = await response .json ()
104+ headers = {"Authorization" : f"Bearer { data ['token' ]} " }
105+ return headers
0 commit comments