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'})
def database_rollback(): """ Do a database rollback. """ config = load_config() session = setup_db(config) session.rollback()
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)
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
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)
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
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()