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