Ejemplo n.º 1
0
def propose_friendship(request_id, user_id):
    """
    Propose friendship to a user
    :param request_id: user requesting operation
    :param user_id: user to befriend
    :return FriendInvite
    """
    if request_id == user_id:
        raise exceptions.InvalidRequestError("Cannot befriend yourself.")
    to_befriend = user_store.get_user_by_id(user_id)
    if not to_befriend:
        raise exceptions.NotFoundError("Invalid user id.")
    if friend_store.get_invite_by_details(request_id, user_id):
        raise exceptions.InvalidRequestError("Invite already pending.")
    friendinvite = FriendInvite(requesting_id=request_id, requested_id=user_id)
    friend_store.add_friendinvite(friendinvite)
    return friendinvite.as_dict()
Ejemplo n.º 2
0
def leave_event(request_id, event_id):
    """
    Leave an event.
    :param request_id: user requesting operation (must be event member)
    :param event_id: event to leave
    """
    to_delete = userevent_store.get_userevent(request_id, event_id)
    if not to_delete:
        raise exceptions.NotFoundError("Invalid user id or event id.")
    if request_id == event_store.get_owner_id(event_id):
        raise exceptions.InvalidRequestError("Cannot leave owned event.")
    userevent_store.delete_userevent(to_delete)
    return None
Ejemplo n.º 3
0
def invite_user_to_event(request_id, user_id, event_id):
    """
    Invite user to an event.
    :param request_id: user requesting operation (must be event owner)
    :param user_id: user to be invited to event
    :param event_id: event to add user to
    """
    if request_id == user_id:
        raise exceptions.InvalidRequestError("Cannot invite yourself.")
    event = event_store.get_event_by_id(event_id)
    if not event or not event.event_owner_id == request_id:
        raise exceptions.NotFoundError("Invalid event id.")
    if not user_store.get_user_by_id(user_id):
        raise exceptions.NotFoundError("Invalid user id.")
    if userevent_store.get_userevent(user_id, event_id):
        raise exceptions.InvalidRequestError("User already a member of event.")
    if userinvite_store.get_invite_by_details(user_id, event_id):
        raise exceptions.InvalidRequestError("Invite already pending.")
    userinvite = UserInvite(inviter_id=request_id,
                            invitee_id=user_id,
                            event_id=event_id)
    userinvite_store.add_userinvite(userinvite)
    return userinvite.as_dict()
Ejemplo n.º 4
0
def remove_user_from_event(request_id, user_id, event_id):
    """
    Delete user from a event.
    :param request_id: user requesting operation (must be event owner)
    :param user_id: user to be deleted from event
    :param event_id: event to delete user from
    """
    to_delete = userevent_store.get_userevent(user_id, event_id)
    if not to_delete:
        raise exceptions.NotFoundError("Invalid user id or event id.")
    if request_id != event_store.get_owner_id(event_id):
        raise exceptions.NotFoundError("Invalid user id or event id.")
    if user_id == event_store.get_owner_id(event_id):
        raise exceptions.InvalidRequestError("Cannot remove event owner.")
    userevent_store.delete_userevent(to_delete)
    return None
Ejemplo n.º 5
0
def invite_users_to_event(request_id, emails, event_id):
    """
    Invite multiple users to an event given their usernames.
    :param request_id: user requesting operation (must be event owner)
    :param emails: emails of users to be invited to the event
    :param event_id: event to add user to
    :return: usernames, which weren't invited successfully
    """
    if len(emails) > MAX_INVITES_PER_REQUEST:
        raise exceptions.InvalidRequestError("Too many invites per request.")

    event = event_store.get_event_by_id(event_id)
    if not event or not event.event_owner_id == request_id:
        raise exceptions.NotFoundError("Invalid event id.")

    userinvites = userinvite_store.get_users_by_event(event_id)
    already_pending = set(u.id for u in userinvites) if userinvites else {}
    userevents = userevent_store.get_users_by_event(event_id)
    already_accepted = set(u.id for u in userevents) if userevents else {}

    # TODO: figure out what to do with already rejected

    users_to_process = set(emails)

    # TODO: also allow to bulk invite by phone numbers and user IDs
    users = user_store.get_users_by_emails(emails)
    userinvites = []

    for user in users:
        if (user.id == request_id or user.id in already_pending
                or user.id in already_accepted):
            continue
        userinvites.append(
            UserInvite(inviter_id=request_id,
                       invitee_id=user.id,
                       event_id=event_id))
        users_to_process.remove(user.email)

    userinvite_store.add_userinvites(userinvites)

    return users_to_process
Ejemplo n.º 6
0
def propose_friendships(request_id, emails):
    """
    Invite multiple users as friends given their usernames.
    :param request_id: user requesting operation
    :param emails: emails of users to befriend
    :return: usernames which weren't invited successfully
    """
    if len(emails) > MAX_INVITES_PER_REQUEST:
        raise exceptions.InvalidRequestError("Too many invites per request.")

    inv = friend_store.get_pending_invites_sent(request_id)
    already_pending = set(u.requested_id for u in inv) if inv else {}
    friends = friend_store.get_friendships_by_user(request_id)
    already_accepted = set(u.friend_b_id for u in friends) if friends else {}

    # TODO: figure out what to do with already rejected

    users_to_process = set(emails)

    # TODO: also allow to bulk invite by phone numbers and user IDs
    users = user_store.get_users_by_emails(emails)
    friendinvites = []

    for user in users:
        if (user.id == request_id or user.id in already_pending
                or user.id in already_accepted):
            continue
        friendinvites.append(
            FriendInvite(
                requesting_id=request_id,
                requested_id=user.id,
            ))
        users_to_process.remove(user.email)

    friend_store.add_friendinvites(friendinvites)

    return users_to_process