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