コード例 #1
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)
コード例 #2
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)
コード例 #3
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)
コード例 #4
0
    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)
コード例 #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)
コード例 #6
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)
コード例 #7
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)
コード例 #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):
        """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)
コード例 #10
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)
コード例 #11
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 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)
コード例 #12
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)
コード例 #13
0
    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 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)
コード例 #15
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)
コード例 #16
0
 def get(self):
     app.logger.debug('success:pong!')
     return m_response({'msg': 'pong!'}, 200)
コード例 #17
0
 def get(self):
     """Ping api"""
     app.logger.debug("success:ping pong!")
     return m_response(True, {'msg': 'pong!'}, 200)