def get_session():
    uid = request.headers.get("uid", None)
    """Endpoint for getting user session."""
    user_session = User.objects.get_or_404(uid=uid)
    
    star_rating = StarRating.objects(user_from=user_session).all()
    
    received = Request.objects(user_to=user_session).all()
    sent = Request.objects(user_from=user_session).all()
    
    user_ids_matched = [str(s.user_to.id) for s in sent if s.response == 1] + [
        str(r.user_from.id) for r in received if r.response == 1]
    user_ids_i_sent_request = [str(s.user_to.id) for s in sent if s.response != 1]
    user_ids_sent_me_request = [str(r.user_from.id) for r in received if r.response != 1]
    user_ids_i_rated = [
        dict(user_id=str(rate.user_to.id), score=rate.score) for rate in star_rating]
    
    user_session = json.loads(user_session.to_json())
    user_session["user_ids_matched"] = user_ids_matched
    user_session["user_ids_i_sent_request"] = user_ids_i_sent_request
    user_session["user_ids_sent_me_request"] = user_ids_sent_me_request
    user_session["star_ratings_i_rated"] = user_ids_i_rated
    
    return Response(
        json.dumps(user_session),
        mimetype="application/json")
Ejemplo n.º 2
0
 def test_recommend(self):
     random_users = User.objects.aggregate([{'$sample': {'size': 1000}}])
     user = User.objects.get_or_404(id="5f89b9b12d83e5da90ae6993")
     for random_user in random_users:
         if not Request.objects(user_from=random_user.get("_id")).first():
             Request(user_from=random_user.get("_id"),
                     user_to=str(user.id),
                     requested_at=pendulum.now().int_timestamp).save(
                     )  # .save()  # .save()
Ejemplo n.º 3
0
 def test_create_requests2(self):
     user = User.objects(id="5fceb2824192080326d089fb").first()
     random_users = User.objects.aggregate([{'$sample': {'size': 10}}])
     for random_user in random_users:
         Request(user_from=random_user.get("_id"),
                 user_to=user.id,
                 requested_at=1602139074).save()
Ejemplo n.º 4
0
 def test_create_random_request_and_conversation(self):
     user = User.objects.get_or_404(id="603c103511062bc70dfd99f7")
     while True:
         random_result = User.objects.aggregate([{'$sample': {'size': 2}}])
         random_ids = [str(user.get("_id")) for user in random_result]
         users = User.objects(id__in=random_ids)
         Request(user_from=users[0],
                 user_to=user,
                 requested_at=pendulum.now().int_timestamp).save()
Ejemplo n.º 5
0
 def test_update_geo_location(self):
     user = User.objects.all()[1]
     
     alerts = Alert.objects.all()
     for alert in alerts:
         alert.delete()
     
     requests = Request.objects(user_from=user).all()
     for r in requests:
         r.delete()
     
     requests = Request.objects(user_to=user).all()
     for r in requests:
         r.delete()
     
     chat_rooms = ChatRoom.objects.all()
     for c in chat_rooms:
         c.delete()
def route_create_request(user_id: str, r_type: int):
    """Endpoint to request like."""
    id_token = request.headers.get("id_token", None)
    decoded_token = auth.verify_id_token(id_token)
    uid_to_verify = decoded_token["uid"]
    uid = request.headers.get("uid", None)
    
    if uid_to_verify != uid:
        raise Exception("Illegal verify_id_token found.")
    
    user_from = User.objects.get_or_404(uid=uid)  # me
    user_to = User.objects.get_or_404(id=user_id)  # target
    
    # checks if there is a one I have already sent
    request_i_sent = Request.objects(
        user_to=user_to,  # target
        user_from=user_from  # me
    ).first()
    
    if request_i_sent:
        raise ValueError(
            "a duplicate request already exists.")
    
    # checks if there is a one I have received.
    request_i_received = Request.objects(
        user_to=user_from, user_from=user_to).first()
    
    if request_i_received:
        if request_i_received.response == None:
            return route_update_response_of_request(
                request_i_received.id, 1)
        else:
            raise ValueError(
                "a duplicate request already exists.")
    
    _request = Request(
        user_from=user_from, user_to=user_to,
        request_type_id=r_type,
        requested_at=pendulum.now().int_timestamp,
        response=None, responded_at=None)
    _request.save()
    
    alert = alerts_blueprint.create_alert(
        user_from=user_from, user_to=user_to,
        push_type="REQUEST", _request=_request,
        message="{nick_name} 님이 당신에게 친구 신청을 보냈습니다.".format(
            nick_name=user_from.nick_name))
    push_item = alert.records[-1]
    data = alerts_blueprint.dictify_push_item(push_item)
    message_service.push(data, user_to.r_token)
    
    return Response(
        _request.to_json(follow_reference=True, max_depth=1),
        mimetype="application/json")
Ejemplo n.º 7
0
 def test_insert_request(self):
     for batch in range(0, 100):
         requests = []
         print(batch)
         for i in range(0, 10000):
             result = list(User.objects.aggregate([{'$sample': {'size': 2}}]))
             user_1 = User.objects.get_or_404(id=str(result[0]["_id"]))
             user_2 = User.objects.get_or_404(id=str(result[1]["_id"]))
             requests.append(Request(
                 user_from=user_1,
                 user_to=user_2,
                 requested_at=pendulum.now().int_timestamp))
         
         Request.objects.insert(requests)
Ejemplo n.º 8
0
def route_get_session():
    """Endpoint for getting user session."""
    uid = request.headers.get("uid", None)
    user = User.objects.get_or_404(uid=uid)
    user_id = user.id

    point = user.get_current_amount_of_point()
    user = user.to_mongo()

    star_rating = StarRating.objects(user_from=user_id).as_pymongo()
    received = Request.objects(user_to=user_id).as_pymongo()
    sent = Request.objects(user_from=user_id).as_pymongo()

    # 이미 성사 된 상대
    matched_request_sent = [str(req["user_to"]) for req in sent if req.get("response") == 1]
    matched_request_received = [str(req["user_from"]) for req in received if req.get("response") == 1]
    user_ids_matched = matched_request_received + matched_request_sent
    # 성사 되지 않은 상대
    unmatched_request_sent = [str(req["user_to"]) for req in sent if req.get("response") == 0]
    unmatched_request_received = [str(req["user_from"]) for req in received if req.get("response") == 0]
    user_ids_unmatched = unmatched_request_sent + unmatched_request_received
    # 이미 좋아요를 보냄
    user_ids_i_sent_request = [str(req["user_to"]) for req in sent if req.get("response") != 1]
    # 내게 좋아요를 보냄 and 미수락
    user_ids_sent_me_request = [str(req["user_from"]) for req in received if req.get("response") != 1]
    # 내가 평가 한 사람들
    star_ratings_i_rated = [dict(user_id=str(x["user_to"]), score=x["score"]) for x in star_rating]

    user["user_ids_matched"] = user_ids_matched
    user["user_ids_unmatched"] = user_ids_unmatched
    user["user_ids_i_sent_request"] = user_ids_i_sent_request
    user["user_ids_sent_me_request"] = user_ids_sent_me_request
    user["star_ratings_i_rated"] = star_ratings_i_rated
    user["point"] = point

    response = encode(user)
    return Response(response, mimetype="application/json")
Ejemplo n.º 9
0
def route_update_response_of_request(request_id: str, result: int):
    """Updates a received like request. ACCEPT: 1 DECLINE: 0 """

    uid = request.headers.get("uid", None)
    me = User.objects.get_or_404(uid=uid)

    _request = Request.objects.get_or_404(id=request_id)

    if _request.user_to.id != me.id:
        abort(400)

    # update request table.
    _request.response = result
    _request.responded_at = pendulum.now().int_timestamp
    _request.save()
    _request.reload()

    if int(result) == 1:
        _request.user_to.remove_user_from_recommendation(_request.user_from)

        # create chat room
        conversation = Conversation(
            title=None,
            participants=[_request.user_from, _request.user_to],
            references=[_request.user_from, _request.user_to],
            created_at=pendulum.now().int_timestamp)
        conversation.save()
        conversation.reload()

        # alarm by push below
        user_alarm_from = _request.user_to
        user_alarm_to = _request.user_from

        alarm = Alarm.create_alarm(user_from=user_alarm_from,
                                   user_to=user_alarm_to,
                                   event=Alarm.Event.MATCHED,
                                   request=_request,
                                   conversation=conversation,
                                   message="{nickname} 님과 연결 되었습니다.".format(
                                       nickname=_request.user_to.nickname))
        alarm_record = alarm.records[-1]
        data = alarm_record.as_dict()
        message_service.push(data, user_alarm_to)

    response = encode(Request.get(id=_request.id))
    return Response(response, mimetype="application/json")
def route_update_response_of_request(rid: str, result: int):
    """Updates a received like request.
       ACCEPT: 1
       DECLINE: 0
    """
    
    uid = request.headers.get("uid", None)
    me = User.objects.get_or_404(uid=uid)
    
    _request = Request.objects(id=rid).get_or_404()
    
    if _request.user_to.id != me.id:
        abort(400)
    
    # update request table.
    _request.response = result
    _request.responded_at = pendulum.now().int_timestamp
    _request.save()
    
    if int(result) == 1:
        # create chat room
        chat_room = ChatRoom(
            title=None,
            members=[_request.user_from, _request.user_to],
            members_history=[_request.user_from, _request.user_to],
            created_at=pendulum.now().int_timestamp)
        chat_room.save()
        
        # watch out here..
        user_from = _request.user_to
        user_to = _request.user_from
        
        alert = alerts_blueprint.create_alert(
            user_from=user_from, user_to=user_to,
            push_type="MATCHED", _request=_request, chat_room=chat_room,
            message="{nick_name} 님과 연결 되었습니다.".format(
                nick_name=_request.user_to.nick_name))
        push_item = alert.records[-1]
        data = alerts_blueprint.dictify_push_item(push_item)
        message_service.push(data, user_to.r_token)
    
    return Response(
        _request.to_json(follow_reference=True, max_depth=1),
        mimetype="application/json")
Ejemplo n.º 11
0
def route_create_request(user_id: str, r_type: int):
    """Endpoint to request like."""

    uid = request.headers.get("uid", None)  # already verified uid.
    user = User.objects.get_or_404(uid=uid)

    user_from = user  # me
    user_to = User.objects.get_or_404(id=user_id)  # target

    # checks if there is a one I have already sent
    request_i_sent = Request.objects(user_to=user_to,
                                     user_from=user_from).first()

    if request_i_sent:
        raise ValueError("a duplicate request already exists.")

    # checks if there is a one I have already received.
    request_i_received = Request.objects(user_to=user_from,
                                         user_from=user_to).first()

    if request_i_received:
        if request_i_received.response is None:
            return route_update_response_of_request(request_i_received.id, 1)
        else:
            raise ValueError("a duplicate request already exists.")

    is_available_for_free = user_from.is_available_for_free_pass_token()
    amount_remaining = user_from.get_current_amount_of_point()

    if not is_available_for_free and amount_remaining <= 0:
        raise Exception("Unavailable for the request.")

    _request = Request(user_from=user_from,
                       user_to=user_to,
                       request_type_id=r_type,
                       requested_at=pendulum.now().int_timestamp,
                       response=None,
                       responded_at=None)
    _request.save()
    _request.reload()

    # if the target exists in recommendation, remove them.
    user_from.remove_user_from_recommendation(user_to)

    if is_available_for_free:
        user_from.consume_free_pass_token()
    else:
        user_from.consume(5)

    alarm = Alarm.create_alarm(
        user_from=user_from,
        user_to=user_to,
        event=Alarm.Event.REQUEST,
        request=_request,
        message="{nickname} 님이 당신에게 친구 신청을 보냈습니다.".format(
            nickname=user_from.nickname))
    alarm_record = alarm.records[-1]
    data = alarm_record.as_dict()
    message_service.push(data, user_to)

    response = encode(Request.get(id=_request.id))
    return Response(response, mimetype="application/json")
Ejemplo n.º 12
0
def route_get_request(request_id: str):
    """Endpoint for like request list."""
    _request = Request.get(id=request_id)
    response = encode(_request)
    return Response(response, mimetype="application/json")