예제 #1
0
def set_raw_by_ticketkey_host():

    #
    # [Validation]
    #    1. must be content-type is applicaiton/json
    #    2. JSON must be parsed successfully
    #    3. JSON must has TicketKey
    #    4. save to DB
    #

    # 1.
    if request.headers['Content-Type'] != 'application/json':
        return response.bad_request("please send application/json")

    # 2.
    # http://flask.pocoo.org/docs/0.10/api/#flask.Request.get_json
    try:
        data = request.get_json()
    except Exception as ex:
        #criteria_blueprint.loo
        return response.bad_request("invalid JSON format")

    # 3.
    required_key = ['TicketKey', 'Host']
    for key in required_key:
        if key not in data:
            return response.bad_request("{key} is not found".format(key=key))

    # 4.
    dao = DataTable(region_name=current_app.config['DYNAMODB_REGION'],
                    table_name=current_app.config['CRITERIA_TABLE'],
                    logger=current_app.logger)
    result = dao.save(data)

    return response.created()
예제 #2
0
def set_criteria_by_ticketkey_host():
    
    #
    # [Validation]
    #    1. must be content-type is applicaiton/json
    #    2. JSON must be parsed successfully
    #    3. JSON must has TicketKey and Host
    #    4. save to DB
    #    5. purge cache
    #    6. enqueue
    #
    
    # 1.
    if request.headers['Content-Type'] != 'application/json':
        current_app.logger.warn("received Content-Type %s" % request.headers['Content-Type'])
        return response.bad_request("please send application/json")

    # 2.
    # http://flask.pocoo.org/docs/0.10/api/#flask.Request.get_json
    try:
        data = request.get_json()
    except Exception as ex:
        current_app.logger.warn("couldn't parse JSON %s" % ex)
        return response.bad_request("invalid JSON format")

    # 3.
    required_key = ['TicketKey', 'Host']
    for key in required_key:
        if key not in data:
            return response.bad_request("{key} is not found".format(key=key))

    # 4.
    table = DataTable(region_name=current_app.config['DYNAMODB_REGION'],
                    table_name=current_app.config['CRITERIA_TABLE'],
                    logger=current_app.logger)
    result = table.save(data)

    # 5.
    current_app.cache.delete('criteria.all')
    current_app.cache.delete("criteria.ticket_key.%s" % data['TicketKey'])
    current_app.cache.delete("criteria.ticket_key.%s.host.%s" % (data['TicketKey'], data['Host']))
 

    # 6.
    queue = Queue(region_name=current_app.config['SQS_REGIOM'],
                  queue_name=current_app.config['SQS_NAME'],
                  logger=current_app.logger)
    queue.push({key: data[key] for key in required_key})

    return response.created()
예제 #3
0
def set_criteria_by_ticketkey_host(ticket_key, host):
    
    #
    # [Validation]
    #    1. must be content-type is applicaiton/json
    #    2. JSON must be parsed successfully
    #    3. validate JSON string
    #    4. save to DB
    #    5. purge cache
    #    6. enqueue
    #
    
    # 1.
    if request.headers['Content-Type'] != 'application/json':
        current_app.logger.warn("received Content-Type %s" % request.headers['Content-Type'])
        return response.bad_request("please send application/json")

    # 2.
    # http://flask.pocoo.org/docs/0.10/api/#flask.Request.get_json
    try:
        data = request.get_json()
    except Exception as ex:
        current_app.logger.warn("couldn't parse JSON %s" % ex)
        return response.bad_request("invalid JSON format")

    # 3.
    try:
        criteria = CriteriaData(**data).get_json()
    except Exception as ex:
        current_app.logger.error(ex)
        return response.bad_request(ex.message)

    # 4.
    table = DataTable(region_name=current_app.config['DYNAMODB_REGION'],
                      table_name=current_app.config['CRITERIA_TABLE'],
                      logger=current_app.logger)
    result = table.save(criteria, TicketKey=ticket_key, Host=host)

    # 5.
    cache.delete_memoized(get_all_criteria)
    cache.delete_memoized(get_criteria_by_ticketkey, ticket_key)
    cache.delete_memoized(get_criteria_by_ticketkey_host, ticket_key, host)

    # 6.
    queue = Queue(region_name=current_app.config['SQS_REGION'],
                  queue_name=current_app.config['SQS_NAME'],
                  logger=current_app.logger)
    queue.push({'TicketKey': ticket_key, 'Host': host})

    return response.created()
예제 #4
0
def lambda_handler(event, context):
    # Authentication check before we do anything else.
    if not authentication.validate(event):
        return response.forbidden()

    # Get the supplied parameters.
    params = event['pathParameters']
    netid = params['netid']

    if netid == "":
        return response.bad_request()
    
    # Get the student's information.
    result = _STUDENT_TABLE.get_item(
        Key={
            '_netid': netid.upper()
        }
    )

    try:
        item = result['Item']
        # Filter out the index keys.
        item = {key: item[key] for key in item if not key.startswith('_')}
    except KeyError:
        return response.not_found()
        
    return response.okay(json.dumps({'student': item}))
예제 #5
0
def set_result_by_ticketkey_host(ticket_key, host):

    #
    # [Validation]
    #    1. must be content-type is applicaiton/json
    #    2. JSON must be parsed successfully
    #    3. validate JSON string
    #    4. save to DB
    #    5. purge cache
    #

    # 1.
    if request.headers['Content-Type'] != 'application/json':
        return response.bad_request("please send application/json")

    # 2.
    # http://flask.pocoo.org/docs/0.10/api/#flask.Request.get_json
    try:
        data = request.get_json()
    except Exception as ex:
        current_app.logger.error(ex)
        return response.bad_request("invalid JSON format")

    # 3.
    try:
        result = ResultData(**data).get_json()
    except Exception as ex:
        current_app.logger.error(ex)
        return response.bad_request(ex.message)

    # 4.
    dao = DataTable(region_name=current_app.config['DYNAMODB_REGION'],
                    table_name=current_app.config['RESULT_TABLE'],
                    logger=current_app.logger)
    dao.save(result, TicketKey=ticket_key, Host=host)

    # 5.
    cache.delete_memoized(get_all_result)
    cache.delete_memoized(get_result_by_ticketkey, ticket_key)
    cache.delete_memoized(get_result_by_ticketkey_host, ticket_key, host)

    return response.created()
예제 #6
0
def lambda_handler(event, context):
    # Authentication check before we do anything else.
    if not authentication.validate(event):
        return response.forbidden()

    # Get the supplied parameters.
    params = event['queryStringParameters']
    try:
        # The user's query.
        q = str(params['q'])
        if not q:
            return response.bad_request()
        # True to quickly return results, false to do a slower search to find
        # more results (always a superset of fast=True results).
        fast = (True if params['fast'] == '1' else False)
    except:
        return response.bad_request()

    results = []

    # Analyze `q`.
    # Our index is always upper case.
    q = q.upper()
    tokens = q.split(' ')

    if len(tokens) == 0:
        return {
            'statusCode': 400,
            'body': json.dumps({'message': '400 Bad Request'})
        }

    # Only use the first 4 tokens for speed.
    too_many_tokens = False
    if len(tokens) > 4:
        too_many_tokens = True
        tokens = tokens[:4]

    if len(tokens) == 1:
        token = tokens[0]

        items = lib.query_as_netid(_STUDENT_TABLE, token)
        results.extend(items)

        items = lib.query_as_fname(_STUDENT_TABLE, token)
        results.extend(items)

        items = lib.query_as_lname(_STUDENT_TABLE, token)
        results.extend(items)

        if not fast:
            if len(token) <= 10:
                for i, c in enumerate(token):
                    if c in _REPLACEMENTS:
                        for _c in _REPLACEMENTS[c]:
                            _token = token[:i] + _c + token[i + 1:]

                            items = lib.query_as_fname(_STUDENT_TABLE, _token)
                            results.extend(items)

                            items = lib.query_as_lname(_STUDENT_TABLE, _token)
                            results.extend(items)
        """
        # Scan operations are too slow.
        if not fast:
            items = lib.scan_as_fname(_STUDENT_TABLE, token)
            results.extend(items)
            
            items = lib.scan_as_lname(_STUDENT_TABLE, token)
            results.extend(items)
        """

    else:
        for token_one, token_two in itertools.combinations(tokens, 2):
            items = lib.query_as_fname_and_lname(_STUDENT_TABLE, token_one,
                                                 token_two)
            results.extend(items)

        if not fast:
            for token in tokens:
                items = lib.query_as_netid(_STUDENT_TABLE, token)
                results.extend(items)

            for token in tokens:
                items = lib.query_as_fname(_STUDENT_TABLE, token)
                results.extend(items)

            for token in tokens:
                items = lib.query_as_lname(_STUDENT_TABLE, token)
                results.extend(items)

    # Deduplicate the results and remove all properties that start with
    # underscore (as these are our table keys in uppercase). Use a list the
    # whole time to preserve ordering.
    seen_netids = set()
    results_curated = []
    for result in results:
        if result['_netid'] not in seen_netids:
            results_curated.append({
                key: result[key]
                for key in result if not key.startswith('_')
            })

    return response.okay(
        json.dumps({
            'students': results_curated,
            'too_many_tokens': too_many_tokens
        }))