def get(request, time=None, lang=None): #Validate the time that was provided to avoid spoofing. if time is not None: client_datetime = message_utils.get_struct_time(time) current_time = datetime.utcnow() time_diff = current_time - client_datetime time_diff_in_hours = time_diff.total_seconds() / 3600 #No matter where you are in the world you should not have a time difference greater than 12 hours if time_diff_in_hours > 12 or time_diff_in_hours < -12: print('Time diff is {}'.format(time_diff_in_hours)) raise errors.ClientError('Invalid client time') #This function will return UTC if no timestring is provided client_time_as_number = message_utils.get_time_as_number(time) response = message_utils.get_message_table().scan( ProjectionExpression='message, priority, startTime, endTime', FilterExpression=Attr('startTime').lte(client_time_as_number) & Attr('endTime').gte(client_time_as_number)) data = [] for i in response['Items']: conv = convert_table_entry(i) data.append(conv) return {"list": data}
def post(request, msg): rand_uuid = uuid.uuid4() unique_msg_id = rand_uuid.hex message = msg.get('message') if message is None: raise errors.ClientError('Value message cannot be None') if len(message.decode('utf8')) > message_utils.message_size_limit: raise errors.ClientError( 'Maximum message size is {} UTF8 encoded characters'.format( message_utils.message_size_limit)) priority = msg.get('priority', 0) #If no start time specified set it to the min to deactivate filtering based on start start_time = msg.get('startTime', message_utils.custom_datetime_min) #If no start time specified set it to the max to deactivate filtering based on end end_time = msg.get('endTime', message_utils.custom_datetime_max) message_utils.validate_start_end_times(start_time, end_time) start_time_as_number = message_utils.get_time_as_number(start_time) end_time_as_number = message_utils.get_time_as_number(end_time) message_utils.get_message_table().put_item( Item={ 'UniqueMsgID': unique_msg_id, 'message': message, 'priority': priority, 'startTime': start_time_as_number, 'endTime': end_time_as_number }) # As opposed to the item that was added to the DB the return object uses the human readable time format returnObj = { 'UniqueMsgID': unique_msg_id, 'message': message, 'priority': priority, 'startTime': start_time, 'endTime': end_time } return returnObj
def put(request, msg_id, msg): if msg_id is None: raise errors.ClientError('Value msg_id cannot be None') unique_msg_id = msg_id message = msg.get('message') if len(message.decode('utf8')) > message_utils.message_size_limit: raise errors.ClientError( 'Maximum message size is {} UTF8 encoded characters'.format( message_utils.message_size_limit)) priority = msg.get('priority', 0) #If no start time specified set it to the min to deactivate filtering based on start start_time = msg.get('startTime', message_utils.custom_datetime_min) #If no end time specified set it to the max to deactivate filtering based on end end_time = msg.get('endTime', message_utils.custom_datetime_max) message_utils.validate_start_end_times(start_time, end_time) try: table = message_utils.get_message_table() start_time_as_number = message_utils.get_time_as_number(start_time) end_time_as_number = message_utils.get_time_as_number(end_time) if message is not None: table.update_item( Key={'UniqueMsgID': unique_msg_id}, UpdateExpression= 'SET message = :val1, priority = :val2, startTime = :val3, endTime = :val4', ConditionExpression='UniqueMsgID = :val', ExpressionAttributeValues={ ':val': unique_msg_id, ':val1': message, ':val2': priority, ':val3': start_time_as_number, ':val4': end_time_as_number }) #Any value has a default so if you are doing a PUT if the Message is none then we want to leave it as is #in other words for all the other fields in the table if you send a None they will get reset to the default else: table.update_item( Key={'UniqueMsgID': unique_msg_id}, UpdateExpression= 'SET priority = :val1, startTime = :val2, endTime = :val3', ConditionExpression='UniqueMsgID = :val', ExpressionAttributeValues={ ':val': unique_msg_id, ':val1': priority, ':val2': start_time_as_number, ':val3': end_time_as_number }) except ClientError as e: #Our unique message ID was not found if e.response['Error']['Code'] == 'ConditionalCheckFailedException': raise errors.ClientError( 'Invalid message id: {}'.format(unique_msg_id)) raise e return 'MessageUpdated'