def route_update_star_rating(user_id: str, score: int):
    """Endpoint for getting users."""
    uid = request.headers.get("uid", None)
    
    user_from = User.objects.get_or_404(uid=uid)
    user_to = User.objects.get_or_404(id=user_id)
    
    past_star_rating = StarRating.objects(
        user_from=user_from, user_to=user_to).first()
    
    if not past_star_rating:
        StarRating(
            user_from=user_from, user_to=user_to,
            rated_at=pendulum.now().int_timestamp,
            score=score
        ).save()
        if score > 3:
            alert = alerts_blueprint.create_alert(
                user_from=user_from, user_to=user_to,
                push_type="STAR_RATING",
                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("", mimetype="application/json")
Exemple #2
0
def route_update_conversation_available(conversation_id: str, available: bool):
    uid = request.headers.get("uid", None)

    conversation = Conversation.objects.get_or_404(id=conversation_id)
    user_to_open_room: User = next((member for member in conversation.participants if member.uid == uid), None)

    if not user_to_open_room:
        raise Exception("The user who has tried to open conversation, is not belong to the room.")

    if user_to_open_room.is_available_for_free_open_token():
        user_to_open_room.consume_free_open_token()
    else:
        # it will raise exception when remaining point is not enough
        user_to_open_room.consume(5)

    conversation.available = bool(available)
    conversation.available_at = pendulum.now().int_timestamp
    conversation.save()

    embedded_message = EmbeddedMessage(
        conversation_id=conversation_id,
        message=BEGIN_CONVERSATION_MESSAGE,
        category="SYSTEM",
        created_at=pendulum.now().int_timestamp
    )

    conversation.messages.append(embedded_message)
    conversation.save()

    # push opened message
    for user_to in conversation.participants:
        if user_to.uid == user_to_open_room.uid:
            continue
        push = AlarmRecord(
            event=Alarm.Event.CONVERSATION_OPEN,
            user_id=user_to_open_room.id,
            created_at=pendulum.now().int_timestamp,
            conversation_id=conversation.id,
            message="{nickname} 님이 대화방을 열었습니다.".format(
                nickname=user_to_open_room.nickname)
        )
        data = push.as_dict()
        message_service.push(data, user_to, priority="high")

    # push system message as conversation message
    for participant in conversation.participants:
        message_service.push(
            dict(
                event=Alarm.Event.CONVERSATION,
                created_at=str(pendulum.now().int_timestamp),
                conversation_id=str(conversation.id),
                message_id=str(embedded_message.id),
                category="SYSTEM",
                message=BEGIN_CONVERSATION_MESSAGE
            ),
            participant.device_token,
            priority="high"
        )

    return Response("", mimetype="application/json")
Exemple #3
0
def route_create_favorite(post_id: str):
    uid = request.headers.get("uid", None)
    if not uid:
        abort(401)

    user = User.objects.get_or_404(uid=uid)
    post = Post.objects.get_or_404(id=post_id)
    post.update(add_to_set__favorite_users=user,
                add_to_set__favorite_user_ids=user.id)

    user_from = user
    user_to = post.author

    alert = alerts_blueprint.create_alert(
        user_from=user_from,
        user_to=user_to,
        push_type="FAVORITE",
        post=post,
        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(post.to_json(follow_reference=True, max_depth=1),
                    mimetype="application/json")
def route_update_chat_room_available(room_id: str, available: bool):
    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.")

    chat_room = ChatRoom.objects.get_or_404(id=room_id)
    room_open_user = next(
        (member for member in chat_room.members if member.uid == uid), None)
    if not room_open_user:
        raise Exception("If not belong to the chat room, can't open it.")

    chat_room.available = bool(available)
    chat_room.available_at = pendulum.now().int_timestamp
    chat_room.save()

    for user_to in chat_room.members:
        if user_to.uid == room_open_user.uid:
            continue
        push = AlertRecord(push_type="OPENED",
                           user_id=room_open_user.id,
                           created_at=pendulum.now().int_timestamp,
                           chat_room_id=chat_room.id,
                           message="{nick_name} 님이 대화방을 열었습니다.".format(
                               nick_name=room_open_user.nick_name))
        data = alerts_blueprint.dictify_push_item(push)
        message_service.push(data, user_to.r_token)

    return Response("", mimetype="application/json")
def route_create_message(room_id: str, message: str):
    uid = request.headers.get("uid", None)

    user = User.objects.get_or_404(uid=uid)

    message = Message(user_id=str(user.id),
                      message=message,
                      created_at=pendulum.now().int_timestamp)

    chat_room = ChatRoom.objects.get_or_404(id=room_id, members=user)
    chat_room.messages.append(message)
    chat_room.save()

    user_from = user
    user_to_list = [
        member for member in chat_room.members if member.id != user.id
    ]

    for user_to in user_to_list:
        push = AlertRecord(push_type="MESSAGE",
                           user_id=user_from.id,
                           created_at=pendulum.now().int_timestamp,
                           chat_room_id=chat_room.id,
                           message_id=message.id,
                           message=message.message)
        data = alerts_blueprint.dictify_push_item(push)
        message_service.push(data, user_to.r_token)

    return Response(message.to_json(), mimetype="application/json")
def route_create_thumb_up(post_id, comment_id):
    uid = request.headers.get("uid", None)
    if not uid:
        abort(401)

    user = User.objects.get_or_404(uid=uid)
    post = Post.objects.get_or_404(id=post_id)
    comment = next(
        (comment
         for comment in post.comments if str(comment.id) == comment_id), None)

    if not comment:
        abort(404)

    comment.update(add_to_set__thumb_up_user_ids=user.id,
                   pull__thumb_down_user_ids=user.id)
    comment = Comment.objects.get_or_404(id=comment_id)

    if user.id == post.author.id:
        user_from = user
        user_to = User.get(id=comment.user_id)

        alarm = Alarm.create_alarm(
            user_from=user_from,
            user_to=user_to,
            event=Alarm.Event.COMMENT_THUMB_UP,
            post=post,
            comment=comment,
            message="{nickname} 님이 당신의 댓글을 좋아합니다.".format(
                nickname=user_from.nickname))
        alarm_record = alarm.records[-1]
        data = alarm_record.as_dict()
        message_service.push(data, user_to)

    return Response("", mimetype="application/json")
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 route_update_user_status_to_approved(user_id: str):
    """Endpoint for updating user status approved."""
    user = User.objects.get_or_404(id=user_id)

    user.user_images = user.user_images_temp
    user.status = User.Status.APPROVED
    user.available = True
    user.save()

    data = dict(event=Alarm.Event.APPROVED)
    message_service.push(data, user)

    return Response("", mimetype="application/json")
def route_push_look_up(user_id: str):
    """uid is for a current user and user_id is for an user to watch."""
    uid = request.headers.get("uid", None)
    user_from = User.get(uid=uid)
    user_to = User.get(id=user_id)

    message_service.push(dict(
        event=Alarm.Event.LOOK_UP,
        user_id=str(user_from.id),
        nickname=user_from.nickname,
        image_url=user_from.get_first_image(),
        message="{nickname} 님이 당신을 조회 중입니다.".format(nickname=user_from.nickname),
        created_at=str(pendulum.now().int_timestamp)
    ), user_to)

    return Response("", mimetype="application/json")
def route_push_poke(user_id):
    uid = request.headers.get("uid", None)
    user_from = User.get(uid=uid)
    user_to = User.get(id=user_id)

    alarm = Alarm.create_alarm(
        event=Alarm.Event.POKE,
        user_from=user_from,
        user_to=user_to,
        message="{nickname} 님이 당신을 찔렀습니다.".format(nickname=user_from.nickname)
    )
    alarm_record = alarm.records[-1]
    data: dict = alarm_record.as_dict()
    message_service.push(data, user_to)

    return Response("", mimetype="application/json")
Exemple #11
0
def route_block_users(user_id: str):
    """Updates user status BLOCKED."""

    uid = request.headers.get("uid", None)
    admin = Admin.objects.get_or_404(uid=uid)
    if not admin.available:
        abort(401)

    user = User.objects.get_or_404(id=user_id)

    user.status = User.Status.BLOCKED
    user.available = False
    user.save()

    message_service.push(dict(event=Alarm.Event.BLOCKED), user)

    return Response("", mimetype="application/json")
Exemple #12
0
def route_leave_conversation(conversation_id: str, user_id: str):
    uid = request.headers.get("uid", None)
    user = User.objects.get_or_404(uid=uid)

    if str(user.id) != user_id:
        abort(401)

    conversation = Conversation.objects.get_or_404(id=conversation_id)
    leave_message = "{nickname} 님이 대화방을 나갔습니다.".format(nickname=user.nickname)

    embedded_message = EmbeddedMessage(
        conversation_id=conversation_id,
        message=leave_message,
        category="SYSTEM",
        created_at=pendulum.now().int_timestamp
    )

    conversation.update(pull__participants=user, push__messages=embedded_message)
    conversation.reload()

    if not conversation.participants:
        conversation.delete()
        return Response("", mimetype="application/json")

    for participant in conversation.participants:
        message_data = dict(
            event=Alarm.Event.CONVERSATION,
            created_at=str(pendulum.now().int_timestamp),
            conversation_id=str(conversation.id),
            message_id=str(embedded_message.id),
            category="SYSTEM",
            message=END_CONVERSATION_MESSAGE
        )
        message_service.push(message_data, participant, priority="high")

        leave_data = AlarmRecord(
            event=Alarm.Event.CONVERSATION_LEAVE,
            user_id=user_id,
            created_at=pendulum.now().int_timestamp,
            conversation_id=conversation.id,
            message=leave_message
        )
        leave_data = leave_data.as_dict()
        message_service.push(leave_data, participant, priority="high")

    return 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")
Exemple #15
0
def route_create_message(conversation_id: str, message: str):
    uid = request.headers.get("uid", None)

    user = User.objects.get_or_404(uid=uid)
    conversation = Conversation.objects.get_or_404(id=conversation_id, participants=user)
    embedded_message = EmbeddedMessage(
        conversation_id=conversation_id,
        category="MESSAGE",
        user_id=str(user.id),
        message=message,
        created_at=pendulum.now().int_timestamp
    )
    conversation.messages.append(embedded_message)
    conversation.save()

    user_from = user
    user_image = next(iter(user.user_images or []), None)
    image_url = user_image.url if user_image else ""

    user_to_list = [p for p in conversation.participants if p.id != user.id]

    for user_to in user_to_list:
        message_service.push(
            dict(
                event=Alarm.Event.CONVERSATION,
                nickname=user_from.nickname,
                user_id=str(user_from.id),
                image_url=image_url,
                created_at=str(pendulum.now().int_timestamp),
                conversation_id=str(conversation.id),
                message_id=str(embedded_message.id),
                message=str(embedded_message.message),
                category="MESSAGE",
            ),
            user_to,
            priority="high"
        )

    response = encode(embedded_message.to_mongo())
    return Response(response, mimetype="application/json")
def route_create_comment(post_id: str):
    uid = request.headers.get("uid", None)
    if not uid:
        abort(401)

    # if exists, create a comment as a sub comment
    comment_id = request.form.get("comment_id", None)  # parent_comment_id
    comment = request.form.get("comment", "")

    post = Post.objects.get_or_404(id=post_id)
    user = User.objects.get_or_404(uid=uid)

    comment_to_create = Comment(
        post_id=post_id,
        user_id=user.id,
        comment=comment,
        comments=[],  # child comments
        created_at=pendulum.now().int_timestamp,
        is_deleted=False).save()

    post.add_comment(comment_to_create, parent_id=comment_id)

    alarm = Alarm.create_alarm(
        user_from=user,
        user_to=post.author,
        event=Alarm.Event.COMMENT,
        post=post,
        comment=comment_to_create,
        message="{nickname} 님이 당신의 게시물에 댓글을 남겼습니다.".format(
            nickname=user.nickname))

    alarm_record = alarm.records[-1]
    data = alarm_record.as_dict()
    message_service.push(data, post.author)

    comment = comment_to_create.to_mongo()
    comment["commenter"] = User.get(id=user.id).to_mongo()

    response = encode(comment)
    return Response(response, mimetype="application/json")
def route_update_star_rating(user_id: str, score: int):
    """Endpoint for getting users."""
    uid = request.headers.get("uid", None)

    user_from = User.get(uid=uid)
    user_to = User.get(id=user_id)

    is_already_rated = StarRating.objects(user_from=user_from, user_to=user_to).first()

    if not is_already_rated:
        StarRating(
            user_from=user_from,
            user_to=user_to,
            rated_at=pendulum.now().int_timestamp,
            score=score
        ).save()

        if score > 3:
            alarm = Alarm.create_alarm(
                user_from=user_from,
                user_to=user_to,
                event=Alarm.Event.STAR_RATING,
                message="{nickname} 님이 당신을 높게 평가 하였습니다.".format(nickname=user_from.nickname))
            alarm_record = alarm.records[-1]
            data = alarm_record.as_dict()
            message_service.push(data, user_to)

        star_ratings = StarRating.objects(user_to=user_to).all()

        star_rating_sum = 0
        for rating in star_ratings:
            star_rating_sum += rating.score
        star_rating_avg = star_rating_sum / len(star_ratings)

        user_to.update(star_rating_avg=star_rating_avg)

    return Response("", mimetype="application/json")
Exemple #18
0
def route_create_thumb_up(post_id, comment_id):
    uid = request.headers.get("uid", None)
    if not uid:
        abort(401)

    user = User.objects.get_or_404(uid=uid)
    post = Post.objects.get_or_404(id=post_id)
    comment = next(
        (comment
         for comment in post.comments if str(comment.id) == comment_id), None)

    if not comment:
        abort(404)

    comment.update(add_to_set__thumb_up_user_ids=user.id,
                   pull__thumb_down_user_ids=user.id)
    comment = Comment.objects.get_or_404(id=comment_id)

    if user.id == post.author.id:
        user_from = user
        user_to = comment.user

        alert = alerts_blueprint.create_alert(
            user_from=user_from,
            user_to=user_to,
            push_type="THUMB_UP",
            post=post,
            comment=comment,
            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(comment.to_json(follow_reference=True, max_depth=2),
                    mimetype="application/json")
def route_create_favorite(post_id: str):
    uid = request.headers.get("uid", None)
    if not uid:
        abort(401)

    user = User.objects.get_or_404(uid=uid)
    post = Post.objects.get_or_404(id=post_id)
    post.update(add_to_set__favorite_user_ids=user.id)

    user_from = user
    user_to = post.author

    alarm = Alarm.create_alarm(user_from=user_from,
                               user_to=user_to,
                               event=Alarm.Event.POST_FAVORITE,
                               post=post,
                               message="{nickname} 님이 당신의 게시물을 좋아합니다.".format(
                                   nickname=user_from.nickname))

    alarm_record: AlarmRecord = alarm.records[-1]
    data: dict = alarm_record.as_dict()
    message_service.push(data, user_to)

    return Response("", 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")