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()
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
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)
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
def add_sprint(event): nest = Nest.get(event["arguments"]["nestId"], 'NEST') nest.sprints += 1 nest.save() return nest.to_dict()