decentralized and customizable links page on top of atproto
at main 1.6 kB view raw
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