1from typing import NamedTuple, TypeVar
2
3from flask import current_app
4from flask.sessions import SessionMixin
5
6from src.atproto.types import OAuthAuthRequest, OAuthSession
7
8
9def save_auth_request(session: SessionMixin, request: OAuthAuthRequest):
10 return _set_into_session(session, "oauth_auth_request", request)
11
12
13def save_auth_session(session: SessionMixin, auth_session: OAuthSession):
14 return _set_into_session(session, "oauth_auth_session", auth_session)
15
16
17def delete_auth_request(session: SessionMixin):
18 return _delete_from_session(session, "oauth_auth_request")
19
20
21def delete_auth_session(session: SessionMixin):
22 return _delete_from_session(session, "oauth_auth_session")
23
24
25def get_auth_request(session: SessionMixin) -> OAuthAuthRequest | None:
26 return _get_from_session(session, "oauth_auth_request", OAuthAuthRequest)
27
28
29def get_auth_session(session: SessionMixin) -> OAuthSession | None:
30 return _get_from_session(session, "oauth_auth_session", OAuthSession)
31
32
33def _set_into_session(session: SessionMixin, key: str, value: NamedTuple):
34 session[key] = value._asdict()
35
36
37def _delete_from_session(session: SessionMixin, key: str):
38 del session[key]
39
40
41OAuthClass = TypeVar("OAuthClass")
42
43
44def _get_from_session(
45 session: SessionMixin,
46 key: str,
47 Type: type[OAuthClass],
48) -> OAuthClass | None:
49 if key not in session:
50 return None
51
52 try:
53 return Type(**session[key])
54 except TypeError as exception:
55 current_app.logger.debug(f"unable to load {key}")
56 current_app.logger.debug(exception)
57 del session[key]
58 return None