Exemple #1
0
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'