def mutate(self, info, person_data=None):
        person = Person(key=person_data.key,
                        name=person_data.name,
                        bio=person_data.bio,
                        email=person_data.email,
                        phone=person_data.phone)
        person.save(graph)
        ok = True

        return CreatePerson(person=person, ok=ok)
    def mutate(self, info, following_data=None):
        person = Person.match(graph, following_data.person_key).first()
        follower = Person.match(graph, following_data.follower_key).first()

        if not person or not follower:
            ok = False
            return LinkFollowing(person=None, follower=None, ok=ok)

        person.add_or_update_follower(follower)
        person.save(graph)

        follower.add_or_update_following(person)
        follower.save(graph)
        ok = True

        return LinkFollowing(person=person, follower=follower, ok=ok)
    def resolve_person(self, info, key):
        person = Person.match(graph, key).first()

        if not person:
            return None

        return PersonSchema(**person.as_dict())
    def resolve_person_posted_tweets(self, info, key):
        person = Person.match(graph, key).first()

        if not person:
            return None

        return [TweetQuerySchema(**tweet.as_dict())
                for tweet in person.posted_tweets]
    def resolve_followings(self, info, key):
        person = Person.match(graph, key).first()

        if not person:
            return None

        return [PersonSchema(**following.as_dict())
                for following in person.followings]
    def mutate(self, info, person_data=None):
        person = Person.match(graph, person_data.key).first()

        if not person:
            ok = False
            return DeletePerson(person=None, ok=ok)

        person.delete(graph)
        ok = True

        return DeletePerson(person=person, ok=ok)
    def mutate(self, info, person_tweet_data=None):
        person = Person.match(graph, person_tweet_data.person_key).first()
        tweet = Tweet.match(graph, person_tweet_data.tweet_key).first()

        if not person or not tweet:
            ok = False
            return LinkPersonTweet(person=None, tweet=None, ok=ok)

        person.remove_posted_tweet(tweet)
        person.save(graph)

        tweet.remove_poster(person)
        tweet.save(graph)
        ok = True

        return DelinkPersonTweet(person=person, tweet=tweet, ok=ok)