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()
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
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()
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
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
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