Example #1
0
    def edit_offer_status(self, chat_room_id, offer_id, user_id, offer_status):
        with session_scope() as session:
            OfferService._check_deal_status(session=session,
                                            chat_room_id=chat_room_id,
                                            user_id=user_id)

            offer = session.query(Offer).get(offer_id)

            if offer.offer_status != "PENDING":
                raise InvalidRequestException("Offer is closed")
            if offer_status == "CANCELED" and offer.author_id != user_id:
                raise InvalidRequestException("You can only cancel your offer")
            if offer_status in ["ACCEPTED", "REJECTED"
                                ] and offer.author_id == user_id:
                raise InvalidRequestException(
                    "You can not accept/reject your own offer")

            chat_room = session.query(ChatRoom).get(chat_room_id)
            chat_room.updated_at = offer.created_at
            chat_room.is_deal_closed = offer_status == "ACCEPTED"
            offer.offer_status = offer_status
            session.add(offer)
            session.flush()

            offer_response = OfferResponse(offer_id=str(offer.id))
            session.add(offer_response)
            session.flush()

            return OfferService._serialize_chat_offer(
                offer=offer.asdict(),
                is_deal_closed=chat_room.is_deal_closed,
                offer_response=offer_response.asdict(),
                author_id=user_id,
            )
Example #2
0
        def decorated_func(*args, **kwargs):
            validator = Validator(schema, require_all=True)
            res = validator.validate(kwargs)
            if not res:
                raise InvalidRequestException(validator.errors)

            return func(*args, **kwargs)
Example #3
0
 def reject_offer(self, chat_room_id, offer_id, user_id, user_type):
     with session_scope() as session:
         OfferService._check_deal_status(
             session=session,
             chat_room_id=chat_room_id,
             user_id=user_id,
             user_type=user_type,
         )
         chat_room = session.query(ChatRoom).get(chat_room_id)
         offer = session.query(Offer).filter_by(id=offer_id).one()
         if offer.offer_status != "PENDING":
             raise InvalidRequestException("Offer is closed")
         OfferService._update_offer_status(
             session=session,
             chat_room=chat_room,
             offer=offer,
             offer_status="REJECTED",
         )
         offer = OfferService._get_current_offer(session=session, offer=offer)
         OfferService._update_chatroom_datetime(
             session=session, chat_room=chat_room, offer=offer
         )
         return OfferService._serialize_chat_offer(
             chat_room_id=chat_room_id,
             offer=offer,
             is_deal_closed=chat_room.is_deal_closed,
         )
Example #4
0
    def create_new_offer(self, chat_room_id, author_id, price,
                         number_of_shares):
        with session_scope() as session:
            OfferService._check_deal_status(session=session,
                                            chat_room_id=chat_room_id,
                                            user_id=author_id)

            offers = session.query(Offer).filter_by(chat_room_id=chat_room_id,
                                                    offer_status="PENDING")
            if offers.count() > 0:
                raise InvalidRequestException("There are still pending offers")

            chat_room = session.query(ChatRoom).get(chat_room_id)
            if ChatRoomService.is_disbanded(chat_room):
                raise ResourceNotFoundException("Chat room is disbanded")

            offer = Offer(
                chat_room_id=str(chat_room_id),
                price=price,
                number_of_shares=number_of_shares,
                author_id=str(author_id),
            )
            session.add(offer)
            session.flush()
            chat_room.updated_at = offer.created_at

            offer_dict = offer.asdict()
            return OfferService._serialize_chat_offer(
                offer=offer_dict, is_deal_closed=chat_room.is_deal_closed)
Example #5
0
 def _check_deal_status(session, chat_room_id, user_id, user_type):
     chat_room = session.query(ChatRoom).get(chat_room_id)
     if chat_room is None:
         raise ResourceNotFoundException("Chat room not found")
     if chat_room.is_deal_closed:
         raise InvalidRequestException("Deal is closed")
     OfferService._verify_user(
         chat_room=chat_room, user_id=user_id, user_type=user_type
     )
Example #6
0
    def _check_deal_status(session, chat_room_id, user_id):
        chat_room = session.query(ChatRoom).get(chat_room_id)
        if chat_room is None:
            raise ResourceNotFoundException("Chat room not found")
        if chat_room.is_deal_closed:
            raise InvalidRequestException("Deal is closed")

        if (session.query(UserChatRoomAssociation).filter_by(
                user_id=user_id, chat_room_id=chat_room_id).count() == 0):
            raise ResourceNotOwnedException("User is not in this chat room")
Example #7
0
    def disband_chatroom(self, user_id, chat_room_id):
        with session_scope() as session:
            chat_room = session.query(ChatRoom).get(chat_room_id)
            assoc = [
                a.asdict()
                for a in session.query(UserChatRoomAssociation).filter_by(
                    chat_room_id=chat_room_id).all()
            ]
            if user_id not in [a["user_id"] for a in assoc]:
                raise InvalidRequestException("Not in chat room")
            chat_room.disband_by_user_id = user_id
            chat_room.disband_time = datetime.now(timezone.utc)

        BannedPairService(self.config)._ban_user(
            my_user_id=assoc[0]["user_id"], other_user_id=assoc[1]["user_id"])

        with session_scope() as session:
            chat_room = session.query(ChatRoom).get(chat_room_id)
            return ChatRoomService._chat_room_dict_with_disband_info(chat_room)
Example #8
0
    async def decorated_func(request, *args, **kwargs):
        if not isinstance(request.json, Mapping):
            raise InvalidRequestException("Request body must be an object")

        return await func(request, *args, **kwargs)