from datetime import datetime, timezone from flask import g import config from auth.atlas.atlas_token_decoder import AtlasTokenDecoder from auth.atlas.constants import DECIBEL_ADMIN_ROLE from auth.atlas.models import AtlasTokenSchema, DecibelRoleSchema from auth.atlas.helpers import add_or_update_user from auth.models import UserDataSchema from services.users_repository import UsersRepository class AtlasUMAuthService: token = None users_repository = UsersRepository() atlas_token_decoder = AtlasTokenDecoder() def __init__(self, token): self.token = token def authorize(self): payload = self.atlas_token_decoder.decode(self.token, schema=AtlasTokenSchema) self.__update_context(payload) def __update_context(self, token_data): """Update context with user info""" should_update = False g.user_id = None g.user_external_id = token_data.atlas_user_id # TODO: Remove after Atlas deployment if type(token_data.decibel_roles) is DecibelRoleSchema: g.is_admin = token_data.decibel_roles.name == DECIBEL_ADMIN_ROLE else: g.is_admin = DECIBEL_ADMIN_ROLE in token_data.decibel_roles user = self.users_repository.get_user_by_email(token_data.email) if user: g.user_id = user.id should_update = (user.updated_at + config.ATLAS_USER_UPDATE_INTERVAL_MIN <= datetime.now(timezone.utc)) or ( g.is_admin != user.is_admin ) if not g.user_id or should_update: user_model = UserDataSchema( id=token_data.atlas_user_id, name=token_data.name, email=token_data.email, labels=token_data.labels ) user = add_or_update_user(user_model) g.user_id = user.id return True