"""API access status""" # pylint: disable=too-few-public-methods import datetime import typing import strawberry from strawberry.types import Info from selfprivacy_api.actions.api_tokens import get_api_tokens_with_caller_flag from selfprivacy_api.graphql import IsAuthenticated from selfprivacy_api.utils import parse_date from selfprivacy_api.utils.auth import ( get_recovery_token_status, is_recovery_token_exists, is_recovery_token_valid, ) def get_api_version() -> str: """Get API version""" return "1.2.7" @strawberry.type class ApiDevice: """A single device with SelfPrivacy app installed""" name: str creation_date: datetime.datetime is_caller: bool @strawberry.type class ApiRecoveryKeyStatus: """Recovery key status""" exists: bool valid: bool creation_date: typing.Optional[datetime.datetime] expiration_date: typing.Optional[datetime.datetime] uses_left: typing.Optional[int] def get_recovery_key_status() -> ApiRecoveryKeyStatus: """Get recovery key status""" if not is_recovery_token_exists(): return ApiRecoveryKeyStatus( exists=False, valid=False, creation_date=None, expiration_date=None, uses_left=None, ) status = get_recovery_token_status() if status is None: return ApiRecoveryKeyStatus( exists=False, valid=False, creation_date=None, expiration_date=None, uses_left=None, ) return ApiRecoveryKeyStatus( exists=True, valid=is_recovery_token_valid(), creation_date=parse_date(status["date"]), expiration_date=parse_date(status["expiration"]) if status["expiration"] is not None else None, uses_left=status["uses_left"] if status["uses_left"] is not None else None, ) @strawberry.type class Api: """API access status""" version: str = strawberry.field(resolver=get_api_version) @strawberry.field(permission_classes=[IsAuthenticated]) def devices(self, info: Info) -> typing.List[ApiDevice]: return [ ApiDevice( name=device.name, creation_date=device.date, is_caller=device.is_caller, ) for device in get_api_tokens_with_caller_flag(info.context.auth_token) ] recovery_key: ApiRecoveryKeyStatus = strawberry.field( resolver=get_recovery_key_status, permission_classes=[IsAuthenticated] )