def chat_app()

in chat-client/main.py [0:0]


def chat_app(req: flask.Request) -> Mapping[str, Any]:
    req_json = req.get_json()
    print(f"Received request: {req_json}")
    # Handle chat UI
    if req.method == "POST" and req.path == "/":
        chatEvent = req_json["chat"]
        if "messagePayload" in chatEvent:
            return handleMessage(req_json)
        # Handle app commands
        elif "appCommandPayload" in chatEvent:
            appCommandMetadata = chatEvent["appCommandPayload"]["appCommandMetadata"]
            if appCommandMetadata["appCommandType"] == "SLASH_COMMAND":
                if appCommandMetadata["appCommandId"] == SUBSCRIBE_COMMAND_ID:
                    return openInitialDialog(req_json)
                elif appCommandMetadata["appCommandId"] == SUBSCRIPTIONS_COMMAND_ID:
                    return returnSubscriptions(req_json)
        # Handle added to space
        elif "addedToSpacePayload" in chatEvent:
            return handleMessage(req_json)
        # Handle app removal from space
        elif "removedFromSpacePayload" in chatEvent:
            print("Unsubscribing from space")
            space_id = req_json["chat"]["removedFromSpacePayload"]["space"]["name"]
            subscriptions_ref = DB.collection("product_space_subscriptions")
            product_doc_ref = subscriptions_ref.document(space_id.replace("/", "_"))
            products_doc = product_doc_ref.get()
            if products_doc.exists:
                products = products_doc.to_dict().get("products_subscribed", [])
                categories = products_doc.to_dict().get("categories_subscribed", [])
                with futures.ThreadPoolExecutor() as executor:
                    unsubscribe_space_product_futures = [
                        executor.submit(
                            unsubscribe_space_product,
                            space_id,
                            DB.collection("space_product_subscriptions"),
                            product,
                        )
                        for product in products
                    ]
                    unsubscribe_space_blogs_futures = [
                        executor.submit(
                            unsubscribe_space_blogs,
                            space_id,
                            DB.collection("space_blog_subscriptions"),
                            category,
                        )
                        for category in categories
                    ]
                futures.wait(
                    unsubscribe_space_product_futures + unsubscribe_space_blogs_futures
                )
                product_doc_ref.delete()
                print(
                    f"Unsubscribed space {space_id} from all products and categories."
                )
            return ("Done", 200)
        # Handle button clicks
        elif "buttonClickedPayload" in chatEvent:
            if (
                req_json["commonEventObject"]["parameters"]["actionName"]
                == "openInitialDialog"
            ):
                return openInitialDialog(req_json)
            elif (
                req_json["commonEventObject"]["parameters"]["actionName"]
                == "submitDialog"
            ):
                print(f"Submitting dialog: {submitDialog(req_json)}")
                return submitDialog(req_json)
    # Handle Pub/Sub push messages
    elif req.method == "POST" and req.path == "/messages":
        return handle_pubsub_message(req)
    print("Reached an unexpected state.")