"""Model for ows-user.""" import time from owsrequest import request from podcast import config from podcast.constants import api from podcast.utils import api_utils from podcast.utils.exc import OwsError OWS_USERS = 'ows-users' def get_auth0_user_by_email(email): """Check if email exists in art-relation connection. Args: email (string): email. Returns: string|None: Auth0 identity or none """ user_response = request.get( OWS_USERS, '/users/auth0/email/{}'.format(email), headers=api_utils.get_ows_json_headers()) if user_response.status_code == 404: return None result = user_response.json()['result'] if len(result) == 0: return None return result[0] def get_identity_user_by_email(email): """Check if email exists. Args: email (string): email. Returns: string|None: Auth0 identity or none """ user_response = request.get( OWS_USERS, '/users/identity/email/{}'.format(email), headers=api_utils.get_ows_json_headers()) if user_response.status_code == 404: return None return user_response.json() def check_for_existing_profile(identity): """Check if profile exists. Args: identity (string): auth0 identity. Returns: bool: Does the profile exist? """ user_response = request.get( OWS_USERS, '/users/identity/{}/application/{}/profiles'.format(identity, api.AUTH0_APP_NAME), ) profiles = user_response.json()['items'] podcast_profile = [profile for profile in profiles if profile['profile_type'] == api.AUTH0_PROFILE_NAME] return len(podcast_profile) > 0 def create_auth0_user(name, email, organization): """Create auth0 user. Args: name (string): name. email (string): email. Returns: dict: auth0 user """ data = { 'email_client_id': config.AUTH0_CLIENT_ID, 'name': name, 'email': email, 'verify_email': False, 'email_verified': True, 'reset_password': True, 'user_metadata': { 'lang': 'en', 'organization': organization }, 'app_metadata': { 'should_send_welcome_as_password_reset': True, } } headers = api_utils.get_ows_json_headers() user_response = request.post( OWS_USERS, '/auth0/users', json=data, headers=headers) return user_response.json() def create_user_identity(identity_id, name, email, default_brand): """Create auth0 user. Args: identity_id (string): auth0 identity name (string): name. email (string): email. default_brand (string): brand. Returns: dict: auth0 user """ data = { 'identity_id': identity_id, 'name': name, 'email': email, 'default_brand': default_brand } headers = api_utils.get_ows_json_headers() user_response = request.post( OWS_USERS, '/users/identity', json=data, headers=headers) return user_response.json() def delete_profile(profile_id): """Delete auth0 profile. Args: profile_id (int): profile id to delete. Returns: boolean: if worked or not """ user_response = request.delete( OWS_USERS, '/profile/profile_id/{}/profile_type/{}'.format(profile_id, api.AUTH0_PROFILE_NAME), headers=api_utils.get_ows_headers() ) return user_response.status_code == 204 def create_auth0_profile(identity, role, brand): """Create auth0 profile. Args: identity (string): id. role (string): user role. brand (string): brand. """ data = { 'profile_name': api.AUTH0_PROFILE_NAME, 'profile_type': api.AUTH0_PROFILE_NAME, 'roles': [role], 'brand': brand } return _retry_create_profile(identity, data) def _retry_create_profile(identity, data, tries=5): user_response = request.post( OWS_USERS, '/profile/identity/{}'.format(identity), json=data, headers=api_utils.get_ows_json_headers()) if user_response.status_code > 201: time.sleep(0.5) if tries == 0: raise OwsError.response_error(user_response) return _retry_create_profile(identity, data, tries - 1) else: return user_response.json() def create_organization_invitation(identity_id, email, brand): """Create auth0 user in organization i.e as organization member and send user invitation email. Args: identity_id (string): orchard-identity-id. email (string): email. brand (string): brand. Returns: dict: auth0 organization invite response, success status code is always 200 """ data = { 'email': email, 'brand': brand, 'auth0_application_name': api.AUTH0_PODCAST_APP_NAME, 'user_metadata': {'orchardIdentityId': identity_id} } headers = api_utils.get_ows_json_headers() user_response = request.post( OWS_USERS, '/auth0/invite/organization-member', json=data, headers=headers) if user_response.status_code != 200: raise OwsError.response_error(user_response) return user_response.json() def create_organization_members(brand, members): """Add auth0 user in organization as member. Args: brand (string): brand. members (list of string): list of Auth0 ids, eg: ['auth0|122334']. Returns: empty response, success status code is always 200 """ data = { 'brand': brand, 'members': members } headers = api_utils.get_ows_json_headers() user_response = request.post( OWS_USERS, '/auth0/add/organization-members', json=data, headers=headers) if user_response.status_code != 200: raise OwsError.response_error(user_response) return user_response