示例#1
0
def delete_subscription():
    user_id = request.data['user_id']
    query_id = request.data['query_id']
    session = setup_db(app.config)()
    es = setup_elasticsearch(app.config)

    uq = session.query(UserQueries).filter_by(user_id=user_id,
                                              query_id=query_id).first()
    if uq is not None:
        # delete from the database first.
        try:
            session.query(UserQueries).filter_by(user_id=user_id,
                                                 query_id=query_id).delete()
            session.commit()
        except Exception as e:
            session.rollback()
            raise BinoasError('General error: %s' % (str(e), ), 400)

    # now we need to find out if there are any user subscribed to this query
    # if not so, delete the query also.
    num_users = session.query(UserQueries).filter_by(query_id=query_id).count()
    if num_users <= 0:
        es.delete_by_query(index='_all',
                           doc_type='queries',
                           body={"query": {
                               "term": {
                                   "_id": query_id
                               }
                           }})

    session.close()

    return jsonify({'status': 'ok'})
示例#2
0
def database_rollback():
    """
    Do a database rollback.
    """

    config = load_config()
    session = setup_db(config)
    session.rollback()
示例#3
0
def new_subscription():
    result = {}
    session = setup_db(app.config)()
    try:
        subscription = Subscription(request.data)
    except ValueError:
        raise BinoasError('Not a valid subscription payload', 400)

    try:
        user, user_query = subscription.save(session)
        result = {
            'status': 'ok',
            'user': {
                'id': user.id,
            },
            'query': {
                'id': user_query.query_id
            }
        }
    except Exception as e:
        session.rollback()
        raise BinoasError('General error: %s' % (str(e), ), 400)
    finally:
        session.close()

    transformed_message = {
        'application': subscription['application'],
        'payload': {
            'alerts': [{
                'query': {
                    'id': user_query.query_id,
                    'description': subscription['description'],
                    'frequency': user_query.frequency
                }
            }],
            'user': {
                'id': user.id
            }
        }
    }

    try:
        templater = Templater(app.config)
        content = templater.compile(transformed_message, 'welcome')
        subject = templater.get_subject(transformed_message, 'welcome')

        send_mail(app.config['binoas']['sendgrid']['api_key'], subject,
                  content, [subscription['email']])
    except Exception as e:
        l = "\n".join(traceback.format_exc().splitlines())
        raise BinoasError(
            'General error upon mailing: %s (%s)' % (
                str(e),
                l,
            ), 400)

    return jsonify(result)
示例#4
0
def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)
    app.config['binoas'] = load_config()['binoas']

    app.errorhandler(BinoasError)(BinoasError.serialize_error)

    def add_cors_headers(resp):
        resp.headers['Access-Control-Allow-Origin'] = '*'
        # See https://stackoverflow.com/questions/12630231/how-do-cors-and-access-control-allow-headers-work
        resp.headers[
            'Access-Control-Allow-Headers'] = 'origin, content-type, accept'
        return resp

    app.after_request(add_cors_headers)

    setup_db(app.config)
    setup_elasticsearch(app.config)

    return app
示例#5
0
def list_subscriptions():
    session = setup_db(app.config)()
    user_queries = session.query(UserQueries).filter_by(**request.args).all()
    results = {
        'meta': {
            'total': len(user_queries)
        },
        'results': [u.to_json() for u in user_queries]
    }
    session.close()
    return jsonify(results)
示例#6
0
    def transform(self, message):
        query_ids = {
            h['_id']: h for h in message.value['alerts']['hits']['hits']}
        logging.info('Found queries:')
        logging.info(query_ids)

        self.db = setup_db(self.config)()
        user_queries = self.db.query(UserQueries).filter(
            UserQueries.query_id.in_(query_ids.keys())
        ).filter(
            UserQueries.frequency == None
        ).all()
        logging.info('Found user queries:')
        logging.info([u.user_id for u in user_queries])

        result = []
        for u in user_queries:
            result.append({
                'application': message.value['application'],
                'payload': {
                    'alerts': [
                        {
                            'query': {
                                'id': u.query_id,
                                'description': u.description
                            },
                            'documents': [
                                message.value['payload']
                            ],
                        }
                    ],
                    'user': {
                        'id': u.user_id,
                        'email': u.user.email
                    }
                }
            })

        self.db.close()
        return result
示例#7
0
 def __init__(self, config):
     self.config = config
     self.role = 'subfetcher'
     self.es = setup_elasticsearch(self.config)
     self.db = setup_db(self.config)()
     self.init_producer()