def setUp(self):
        """ Setup mock dynamodb table and base configuration"""

        # base event config
        self.event = {
            "identity": {
                "username": "******"
            },
            "info": {},
            "arguments": {}
        }

        # dynamodb table
        self.dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
        self.table = self.dynamodb.create_table(TableName='scrumnest-dev',
                                                KeySchema=[{
                                                    'AttributeName': 'nestId',
                                                    'KeyType': 'HASH'
                                                }, {
                                                    'AttributeName':
                                                    'nestComponent',
                                                    'KeyType': 'RANGE'
                                                }],
                                                AttributeDefinitions=[{
                                                    'AttributeName':
                                                    'nestId',
                                                    'AttributeType':
                                                    'S'
                                                }, {
                                                    'AttributeName':
                                                    'nestComponent',
                                                    'AttributeType':
                                                    'S'
                                                }],
                                                ProvisionedThroughput={
                                                    'ReadCapacityUnits': 1,
                                                    'WriteCapacityUnits': 1
                                                })
        self.table.meta.client.get_waiter('table_exists').wait(
            TableName='scrumnest-dev')

        self.nest = Nest('abc123',
                         'NEST',
                         name='Test Nest',
                         owner='test_admin',
                         users=[{
                             'username': '******',
                             'email': '*****@*****.**'
                         }, {
                             'username': '******',
                             'email': '*****@*****.**'
                         }])
        self.nest.save()

        self.story1 = Story('abc123',
                            'STORY.123',
                            title='test story 1',
                            owner='test_admin')
        self.story1.save()
def create_nest(event):
    """
    createNest function to create a nest object in the dynamodb table
    """
    username = (event["identity"] or {}).get("username")

    nest = Nest(str(ulid.new().int >> 64),
                'NEST',
                name=event["arguments"].get("name", ""),
                owner=username)
    nest.save()

    return nest.to_dict()
def add_nest_user(event):
    sender_username = (event["identity"] or {}).get("username")
    nest = Nest.get(event["arguments"]["nestId"], 'NEST')
    users = list(nest.users)
    email = event["arguments"]["email"]

    user_obj = {
        "email": email,
        "username": get_user_by_email(event["arguments"]["email"]) or ""
    }

    users.append(user_obj)
    # make unique
    users = list({v['email']: v for v in users}.values())
    nest.users = users
    nest.save()

    # send email
    ses.send_email(
        Source=FROM_EMAIL,
        Destination={'ToAddresses': [email]},
        Message={
            'Subject': {
                'Data': f"You are invited to join the nest: {nest.name}"
            },
            'Body': {
                'Text': {
                    'Data':
                    f"Hi there,\n\nYou have been added to {nest.name} by {sender_username}.\nCheck it out at https://scrumnest.com/nests/{nest.nestId}"
                }
            }
        })

    return nest.to_dict()
def update_story(event):
    nest_id = event["arguments"].pop('nestId')
    story_id = event["arguments"].pop('storyId')
    story = Story.get(nest_id, f"STORY.{story_id}")

    # handle comments first because they don't line up with model
    if event["arguments"].get('comment'):
        comment = Comment(
            username=(event["identity"] or {}).get("username", ""),
            content=event["arguments"].pop('comment'),
            createdAt=datetime.now().replace(tzinfo=dateutil.tz.gettz()),
        )
        story.comments.insert(0, comment)

    dateToBeCompleted = event["arguments"].get("dateToBeCompleted")

    # Parse string to datetime obj
    if dateToBeCompleted:
        event["arguments"]["dateToBeCompleted"] = datetime.strptime(
            dateToBeCompleted, '%Y-%m-%d')

    # Set parameters
    for arg, value in event["arguments"].items():
        if value:
            setattr(story, arg, value)

    story.save()

    return Nest.get(nest_id,
                    "NEST").to_dict()  # Return Nest for UI simplification
def delete_story(event):
    nest_id = event["arguments"].pop('nestId')
    story_id = event["arguments"].pop('storyId')

    story = Story.get(nest_id, f"STORY.{story_id}")
    story.delete()

    return Nest.get(nest_id,
                    "NEST").to_dict()  # Return Nest for UI simplification
def remove_nest_user(event):
    nest = Nest.get(event["arguments"]["nestId"], 'NEST')
    users = list(nest.users)
    email = event["arguments"]["email"]

    for i, user in enumerate(users):
        if user["email"] == email:
            users.pop(i)

    nest.users = users
    nest.save()

    return nest.to_dict()
Exemple #7
0
    def wrapper_function(*args, **kwargs):
        nestId = args[0]["arguments"].get("nestId")
        user = (args[0]["identity"] or {}).get("username")

        # check if user is in nest users or is the nest owner
        try:
            nest = Nest.get(nestId, 'NEST')
        except Nest.DoesNotExist:
            raise UnauthorizedException()

        if user != nest.owner:
            raise UnauthorizedException()

        return function(*args, **kwargs)
def create_story(event):
    # get nest so we know it exists first
    nest = Nest.get(event["arguments"]["nestId"], 'NEST')

    story = Story(event["arguments"]["nestId"],
                  f'STORY.{ulid.new().int >> 64}',
                  title=event["arguments"]["title"],
                  description=event["arguments"].get("descritpion", ''),
                  owner=event["arguments"].get("owner")
                  or (event["identity"] or {}).get("username"),
                  status=event["arguments"].get("status", "TODO") or "TODO",
                  sprint=event["arguments"].get("sprint", -1) or -1)
    story.save()

    return nest.to_dict()  # Return Nest for UI simplification
Exemple #9
0
    def wrapper_function(*args, **kwargs):
        nestId = args[0]["arguments"].get("nestId")
        user = (args[0]["identity"] or {}).get("username")

        # check if user is in nest users or is the nest owner
        try:
            nest = Nest.get(nestId, 'NEST')
        except Nest.DoesNotExist:
            raise UnauthorizedException()

        # generate list of users
        nest_users = [user['username'] for user in nest.users]

        if user not in [*nest_users, nest.owner]:
            raise UnauthorizedException()

        return function(*args, **kwargs)
Exemple #10
0
def add_usernames_to_nests(event, context):
    """
    Once the users are created, we need to check if the
    email address is stored in any nests.
    If the email is part of the nest, we must add the
    corrisponding username
    """
    print(event)
    email = event["request"]["userAttributes"]["email"]
    username = event["userName"]

    # now we query all nests
    nests = Nest.scan(Nest.nestComponent == 'NEST')

    # I am aware that is a super ugly for loop and I don't care
    for nest in nests:
        for user in nest.users:
            if user["email"] == email:
                user["username"] = username
                nest.save()

    return event
Exemple #11
0
def add_sprint(event):
    nest = Nest.get(event["arguments"]["nestId"], 'NEST')
    nest.sprints += 1
    nest.save()

    return nest.to_dict()