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