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()
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()
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()
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}))
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()
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 }))