def get(self, user_id): """Get a single user details""" client = boto3.client('cognito-idp') try: response = client.admin_get_user( UserPoolId=app.config['COGNITO_POOL_ID'], Username=user_id) user_data = {} for attr in response['UserAttributes']: key = attr['Name'] if key == 'sub': key = 'user_id' val = attr['Value'] user_data[key] = val app.logger.debug( 'success: get Cognito user data: {}'.format(user_data)) return m_response(user_data, 200) except ValueError as e: app.logger.error("ERROR:user_get_by_id:{}".format(user_id)) app.logger.error(e) return err_response("ERROR:user_get_by_id:{}".format(user_id), 500) except Exception as e: app.logger.error("ERROR:user_get_by_id:{}".format(user_id)) app.logger.error(e) return err_response("ERROR:user_get_by_id:{}".format(user_id), 500)
def post(self): try: app.logger.debug(dir(file_upload_parser)) form = file_upload_parser.parse_args() filename_orig = form['file'].filename extension = (filename_orig.rsplit('.', 1)[1]).lower() if extension.lower() not in ['jpg', 'jpeg', 'bmp', 'gif', 'png']: app.logger.error( 'ERROR:file format is not supported:{0}'.format( filename_orig)) return err_response( 'not supported file format:{}'.format(extension), 400) current_user = get_jwt_identity() filename = secure_filename("{0}.{1}".format( uuid.uuid4(), extension)) filesize = save(form['file'], filename, current_user['email']) user_id = current_user['user_id'] # TODO 3: Implement following solution code to put item into Photo table of DynamoDB solution_put_photo_info_ddb(user_id, filename, form, filesize) return m_response({"photo_id": filename}, 200) except Exception as e: app.logger.error('ERROR:file upload failed:user_id:{}'.format( get_jwt_identity()['user_id'])) app.logger.error(e) return err_response(e, 500)
def get(self): """Get all users as list""" try: client = boto3.client('cognito-idp') response = client.list_users( UserPoolId=app.config['COGNITO_POOL_ID'], AttributesToGet=['sub', 'email', 'name']) data = [] for user in response['Users']: one_user = {} for attr in user['Attributes']: key = attr['Name'] if key == 'sub': key = 'user_id' one_user[key] = attr['Value'] data.append(one_user) app.logger.debug("success:users_list:%s" % data) return m_response(data, 200) except Exception as e: app.logger.error("users list failed") app.logger.error(e) return err_response("users list failed", 500)
def delete(self, photo_id): """one photo delete""" token = get_token_from_header(request) try: user = get_cognito_user(token) photo = Photo.get(user['user_id'], photo_id) photo.delete() file_deleted = delete_s3(photo.filename, user['email']) if file_deleted: app.logger.debug( "success:photo deleted: user_id:{}, photo_id:{}".format( user['user_id'], photo_id)) return m_response({'photo_id': photo_id}, 200) else: raise FileNotFoundError except FileNotFoundError as e: app.logger.error('ERROR:not exist photo_id:{}'.format(photo_id)) return err_response('ERROR:not exist photo_id:{}'.format(photo_id), 404) except Exception as e: app.logger.error( "ERROR:photo delete failed: photo_id:{}".format(photo_id)) app.logger.error(e) return err_response( "ERROR:photo delete failed: photo_id:{}".format(photo_id), 500)
def delete(self, photo_id): """one photo delete""" try: user = get_jwt_identity() # TODO 4: Implement following solution code to delete a photo from Photos which is a list filename = solution_delete_photo_from_ddb(user, photo_id) file_deleted = delete(filename, user['email']) if file_deleted: app.logger.debug( "success:photo deleted: photo_id:{}".format(photo_id)) return m_response({'photo_id': photo_id}, 200) else: raise FileNotFoundError except FileNotFoundError as e: app.logger.error('ERROR:not exist photo_id:{}'.format(photo_id)) app.logger.error(e) return err_response('ERROR:not exist photo_id:{}'.format(photo_id), 404) except Exception as e: app.logger.error( "ERROR:photo delete failed: photo_id:{}".format(photo_id)) app.logger.error(e) return err_response( "ERROR:photo delete failed: photo_id:{}".format(photo_id), 500)
def get(self): try: # 1. Is DB is responsive?! boto3.client('dynamodb').describe_table(TableName='Photo') # 2. Is disk have enough free space?! total, used, free = shutil.disk_usage("/") if used / total * 100 >= 90: raise Exception("free disk size under 10%") # 3. Something else.. # TODO: health check something return m_response( { 'msg': 'health_check success', "hostname": get_ip_addr() }, 200) except ClientError as ce: app.logger.error(ce) return err_response( { 'msg': 'dynamodb healthcheck failed', "hostname": get_ip_addr() }, 500) except Exception as e: app.logger.error(e) return err_response( { 'msg': 'healthcheck failed', "hostname": get_ip_addr() }, 500)
def post(self): token = get_token_from_header(request) try: app.logger.debug(dir(file_upload_parser)) form = file_upload_parser.parse_args() filename_orig = form['file'].filename extension = (filename_orig.rsplit('.', 1)[1]).lower() if extension.lower() not in ['jpg', 'jpeg', 'bmp', 'gif', 'png']: app.logger.error('ERROR:file format is not supported:{0}'.format(filename_orig)) return err_response('ERROR:file format is not supported:{0}'.format(filename_orig), 400) current_user = get_cognito_user(token) filename = secure_filename("{0}.{1}".format(uuid.uuid4(), extension)) filesize = save_s3(form['file'], filename, current_user['email']) user_id = current_user['user_id'] new_photo = create_photo_info(user_id, filename, filesize, form) solution_put_photo_info_ddb(user_id, new_photo) return m_response({"photo_id": filename}, 200) except Exception as e: app.logger.error('ERROR:file upload failed:user_id:{}'.format(get_cognito_user(token)['user_id'])) app.logger.error(e) return err_response(e, 500)
def get(self, user_id): """Get a single user details""" try: user = User.get(hash_key=user_id) if user is None: app.logger.error('ERROR:user_id not exist:{}'.format(user_id)) return err_response({'user_id': user_id}, 404) data = { 'user': { 'id': user.id, 'username': user.username, 'email': user.email } } app.logger.debug("success:user_get_by_id:%s" % data['user']) return m_response(data, 200) except ValueError as e: app.logger.error("ERROR:user_get_by_id:{}".format(user_id)) app.logger.error(e) return err_response("ERROR:user_get_by_id:{}".format(user_id), 500) except Exception as e: app.logger.error("ERROR:user_get_by_id:{}".format(user_id)) app.logger.error(e) return err_response("ERROR:user_get_by_id:{}".format(user_id), 500)
def post(self): """user signout""" try: user = get_jwt_identity() add_token_to_set(get_raw_jwt()) app.logger.debug("user token signout: {}".format(user)) return m_response({'user': user, 'msg': 'logged out'}, 200) except Exception as e: app.logger.error('ERROR:Sign-out:unknown issue:user:{}'.format( get_jwt_identity())) app.logger.error(e) return err_response(e, 500)
def get(self): """Get all photos as list""" data = {'photos': []} try: photos = Photo.query(get_jwt_identity()['user_id']) for photo in photos: data['photos'].append(photo_deserialize(photo)) app.logger.debug("success:photos_list:{}".format(data)) return m_response(data['photos'], 200) except Exception as e: app.logger.error("ERROR:photos list failed") app.logger.error(e) return err_response(e, 500)
def delete(self): """user signout""" token = get_token_from_header(request) try: client = boto3.client('cognito-idp') response = client.global_sign_out( AccessToken=token ) app.logger.debug("Access token expired: {}".format(token)) return m_response({'accessToken':token}, 200) except Exception as e: app.logger.error('ERROR:Sign-out:unknown issue:token:{}'.format(token)) app.logger.error(e) return err_response(e, 500)
def get(self): """Get all photos as list""" token = get_token_from_header(request) try: user = get_cognito_user(token) photos = Photo.query(user['user_id']) data = {'photos': []} [data['photos'].append(with_presigned_url(user, photo)) for photo in photos] app.logger.debug("success:photos_list:{}".format(data)) return m_response(data['photos'], 200) except Exception as e: app.logger.error("ERROR:photos list failed") app.logger.error(e) return err_response(e, 500)
def post(self): """Enroll a new user""" req_data = request.get_json() try: validated = validate_user(req_data) user_data = validated['data'] user = cognito_signup(user_data) app.logger.debug("success: enroll user into Cognito user pool:{}".format(user)) return m_response( user, 201) except ValidationError as e: app.logger.error('ERROR:invalid signup data format:{0}'.format(req_data)) app.logger.error(e) return err_response(e.message, 400) except Exception as e: app.logger.error('ERROR:unexpected signup error:{}'.format(req_data)) app.logger.error(e) return err_response(e, 500)
def get(self): """Get all users as list""" try: data = [] for user in User.scan(): one_user = { 'id': user.id, 'email': user.email, 'username': user.username } data.append(one_user) app.logger.debug("success:users_list:%s" % data) return m_response(data, 200) except Exception as e: app.logger.error("users list failed") app.logger.error(e) return err_response("users list failed", 500)
def post(self): """Enroll a new user""" req_data = request.get_json() try: validated = validate_user(req_data) user_data = validated['data'] exist_user = None email = user_data['email'] for item in User.email_index.query(email): exist_user = item if not exist_user: new_user_id = uuid.uuid4().hex # TODO 1 : Implement following solution code to save user information into DynamoDB solution_put_new_user(new_user_id, user_data) user = { "id": new_user_id, 'username': user_data['username'], 'email': email } app.logger.debug('success:user_signup: {0}'.format(user)) return m_response(user, 201) else: app.logger.error('ERROR:exist user: {0}'.format(user_data)) return err_response('exist user', 409) except ValidationError as e: app.logger.error( 'ERROR:invalid signup data format:{0}'.format(req_data)) app.logger.error(e) return err_response(e.message, 400) except Exception as e: app.logger.error( 'ERROR:unexpected signup error:{}'.format(req_data)) app.logger.error(e) return err_response(e, 500)
def get(self): app.logger.debug('success:pong!') return m_response({'msg': 'pong!'}, 200)
def get(self): """Ping api""" app.logger.debug("success:ping pong!") return m_response(True, {'msg': 'pong!'}, 200)