示例#1
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
    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)
示例#14
0
    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)
示例#16
0
    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)
示例#17
0
    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)
示例#18
0
    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)
示例#19
0
    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)