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 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 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 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 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 delete(self, photo_id): """one photo delete""" try: user = get_jwt_identity() filename = solution_delete_photo_from_ddb(user, photo_id) file_deleted = delete_s3(filename, user['email']) if file_deleted: app.logger.debug( "success:photo deleted: user_id:{}, photo_id:{}".format( user['user_id'], photo_id)) return make_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 post(self): """user signin""" req_data = request.get_json() client = boto3.client('cognito-idp') try: signin_data = validate_user(req_data)['data'] access_token, refresh_token = cognito_signin(signin_data) res = jsonify({ 'accessToken': access_token, 'refreshToken': refresh_token }) app.logger.debug( 'success:user signin:access_token:{}, refresh_token:{}'.format( access_token, refresh_token)) return make_response(res, 200) except client.exceptions.NotAuthorizedException as e: app.logger.error( 'ERROR:user signin failed:password unmatched or invalid user: {0}' .format(signin_data)) app.logger.error(e) return err_response('password unmatched or invalid user', 400) except ValidationError as e: app.logger.error('ERROR:invalid data format:{0}'.format(req_data)) app.logger.error(e) return err_response(e, 400) except Exception as e: app.logger.error('ERROR:unexpected error:{0}'.format(req_data)) app.logger.error(e) return err_response('ERROR:unexpected error:{0}'.format(req_data), 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): 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, photo_id): """ Return image for thumbnail and original photo. :param photo_id: target photo id :queryparam mode: None(original) or thumbnail :return: image url for authenticated user """ try: mode = request.args.get('mode') user = get_jwt_identity() email = user['email'] path = os.path.join(app.config['UPLOAD_FOLDER'], email_normalize(email)) full_path = Path(path) photo = Photo.get(user['user_id'], range_key=photo_id) if photo.id == photo_id: if mode == "thumbnail": full_path = full_path / "thumbnails" / photo.filename else: full_path = full_path / photo.filename with full_path.open('rb') as f: contents = f.read() resp = make_response(contents) app.logger.debug("filepath:{}".format(str(full_path))) resp.content_type = "image/jpeg" return resp except Exception as e: app.logger.error( 'ERROR:get photo failed:photo_id:{}'.format(photo_id)) app.logger.error(e) return err_response('not exist photo_id', 404)
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 post(self): """user signin""" req_data = request.get_json() try: signin_data = validate_user(req_data)['data'] # TODO 2: Implement following solution code to get user profile with GSI db_user = solution_get_user_data_with_idx(signin_data) if db_user is None: return err_response('not exist email', 400) token_data = { 'user_id': db_user.id, 'username': db_user.username, 'email': db_user.email } if db_user is not None and check_password_hash( db_user.password, signin_data['password']): access_token = create_access_token(identity=token_data) refresh_token = create_refresh_token(identity=token_data) res = jsonify({ 'accessToken': access_token, 'refreshToken': refresh_token }) app.logger.debug('success:user signin:{}'.format(token_data)) return make_response(res, 200) else: app.logger.error( 'ERROR:user signin failed:password unmatched or invalid user: {0}' .format(signin_data)) return err_response('password unmatched or invalid user', 400) except ValidationError as e: app.logger.error('ERROR:invalid 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 error:{0}'.format(req_data)) app.logger.error(e) return err_response(e, 400)
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 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 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 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 make_response({'ok': True}, 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""" 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 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 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)