From 69c49a6dfd690df0d0818886ced26e55ca5e81dd Mon Sep 17 00:00:00 2001 From: Antoine Dao Date: Sun, 10 Apr 2022 12:28:07 +0100 Subject: [PATCH] fix(login): prevent duplicate api-token names (#3) --- pollination_apps/cli/__init__.py | 16 ++++++++++++++-- pollination_apps/client.py | 13 +++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/pollination_apps/cli/__init__.py b/pollination_apps/cli/__init__.py index 3ee9276..ff47bb4 100644 --- a/pollination_apps/cli/__init__.py +++ b/pollination_apps/cli/__init__.py @@ -32,7 +32,11 @@ def main(ctx: click.Context): type=click.Choice(['staging', 'production']), default='production' ) -def login(environment): +@click.option( + '-t', '--token-name', help='the name of the api tokern created for this client', + default='pollination-apps-cli', +) +def login(environment: str, token_name: str): """login to pollination""" ctx = Context.from_file() @@ -41,7 +45,15 @@ def login(environment): client = ctx.client client.set_host(env.api_host) client.set_jwt(jwt) - ctx.api_token = client.create_api_token() + user = client.get_account() + if client.api_token_name_exists(name=token_name): + raise click.ClickException( + f'Login Failed -> API Token name {token_name} is already taken. ' + 'You can either:\n' + f'\t1. delete it from the web application at https://app.pollination.cloud/{user.username}?tab=settings\n' + '\t2. choose a new name by using the --token-name/-t flag' + ) + ctx.api_token = client.create_api_token(name=token_name) ctx.save() diff --git a/pollination_apps/client.py b/pollination_apps/client.py index b59e31c..5d096b8 100644 --- a/pollination_apps/client.py +++ b/pollination_apps/client.py @@ -1,5 +1,6 @@ import tarfile import tempfile +from operator import truediv from pathlib import Path import pollination_sdk as sdk @@ -36,11 +37,19 @@ def set_api_token(self, api_token: str): def get_account(self) -> sdk.UserPrivate: return self.auth.get_me() - def create_api_token(self) -> str: + def api_token_name_exists(self, name: str) -> bool: + token_list: sdk.APITokenList = self.api_tokens.list_tokens() + for token in token_list.resources: + token: sdk.APIToken + if token.name == name: + return True + return False + + def create_api_token(self, name: str) -> str: token: sdk.APITokenPrivate = self.api_tokens.create_token( api_token_create=sdk.APITokenCreate( token_id='pollination-apps-cli', - name='pollination-apps-cli' + name=name, ) ) return token.token