카테고리 없음

cart_show :: cart_id 받는 버전

joo_coding 2025. 6. 20. 10:21
json handle_cart_show(const json& data) {
    json response;
    MYSQL* conn = connect_db();
    MYSQL_RES* res;
    MYSQL_ROW row;

    // 1. 요청/입력 로그
    std::cout << "[handle_cart_show] 받은 데이터: " << data.dump() << std::endl;

    // 2. cart_id 추출 및 체크
    int cart_id = 0;
    try {
        // 데이터에서 cart_id를 추출 (대소문자 혼용 체크)
        if (data.contains("cart_id"))        cart_id = data["cart_id"];
        else if (data.contains("CART_ID"))   cart_id = data["CART_ID"];
        else if (data["data"].contains("cart_id"))      cart_id = data["data"]["cart_id"];
        else if (data["data"].contains("CART_ID"))      cart_id = data["data"]["CART_ID"];
        else {
            std::cout << "[handle_cart_show][ERROR] cart_id가 요청 데이터에 없음" << std::endl;
            response["status"] = "fail";
            response["message"] = "cart_id 없음";
            return response;
        }
    } catch (const std::exception& e) {
        std::cout << "[handle_cart_show][ERROR] cart_id 추출 중 예외: " << e.what() << std::endl;
        response["status"] = "fail";
        response["message"] = "cart_id 추출 에러";
        return response;
    }
    std::cout << "[handle_cart_show] 추출된 cart_id: " << cart_id << std::endl;

    // 3. DB 커넥션 체크
    if (!conn) {
        std::cout << "[handle_cart_show][ERROR] DB 커넥션이 NULL입니다!" << std::endl;
        response["status"] = "fail";
        response["message"] = "DB 커넥션 없음";
        return response;
    }

    // 4. SQL 쿼리 작성 및 로그
    std::string query =
        "SELECT "
        "ci.CART_ID, ci.TOTAL_PRICE, ci.QUANTITY, "
        "ci.MENU_ID, mi.MENU_NAME, mi.ST_ID, si.ST_NAME, "
        "cdi.SMALL_OPT_NAME, cdi.SMALL_OPT_PRICE "
        "FROM CART_INFO ci "
        "JOIN MENU_INFO mi ON ci.MENU_ID = mi.MENU_ID "
        "JOIN ST_INFO si ON mi.ST_ID = si.ST_ID "
        "LEFT JOIN CART_DETAIL_INFO cdi ON ci.CART_ID = cdi.CART_ID "
        "WHERE ci.CART_ID = " + std::to_string(cart_id);
    std::cout << "[handle_cart_show] SQL 실행: " << query << std::endl;

    // 5. 쿼리 실행 및 에러 체크
    if (mysql_query(conn, query.c_str()) != 0) {
        std::cout << "[handle_cart_show][ERROR] DB 쿼리 실패: " << mysql_error(conn) << std::endl;
        response["status"] = "fail";
        response["message"] = "DB 쿼리 실패";
        return response;
    }
    res = mysql_store_result(conn);
    if (!res) {
        std::cout << "[handle_cart_show][ERROR] 쿼리 결과 없음 또는 에러: " << mysql_error(conn) << std::endl;
        response["status"] = "fail";
        response["message"] = "쿼리 결과 없음";
        return response;
    }

    // 6. 결과 파싱 및 row 로그
    json items = json::array();
    int row_count = 0;
    while ((row = mysql_fetch_row(res))) {
        json item;
        try {
            item["CART_ID"]         = row[0] ? atoi(row[0]) : 0;
            item["TOTAL_PRICE"]     = row[1] ? atoi(row[1]) : 0;
            item["QUANTITY"]        = row[2] ? atoi(row[2]) : 0;
            item["MENU_ID"]         = row[3] ? atoi(row[3]) : 0;
            item["MENU_NAME"]       = row[4] ? row[4] : "";
            item["ST_ID"]           = row[5] ? atoi(row[5]) : 0;
            item["ST_NAME"]         = row[6] ? row[6] : "";
            item["SMALL_OPT_NAME"]  = row[7] ? row[7] : "";
            item["SMALL_OPT_PRICE"] = row[8] ? atoi(row[8]) : 0;

            std::cout << "[handle_cart_show] row 파싱: "
                      << "CART_ID=" << item["CART_ID"] << ", "
                      << "TOTAL_PRICE=" << item["TOTAL_PRICE"] << ", "
                      << "QUANTITY=" << item["QUANTITY"] << ", "
                      << "MENU_ID=" << item["MENU_ID"] << ", "
                      << "MENU_NAME=" << item["MENU_NAME"] << ", "
                      << "ST_ID=" << item["ST_ID"] << ", "
                      << "ST_NAME=" << item["ST_NAME"] << ", "
                      << "SMALL_OPT_NAME=" << item["SMALL_OPT_NAME"] << ", "
                      << "SMALL_OPT_PRICE=" << item["SMALL_OPT_PRICE"]
                      << std::endl;

            items.push_back(item);
            row_count++;
        } catch (const std::exception& e) {
            std::cout << "[handle_cart_show][ERROR] row 파싱 중 예외: " << e.what() << std::endl;
        }
    }
    mysql_free_result(res);

    // 7. 결과/응답 체크 및 로그
    if (row_count > 0) {
        response["status"] = "success";
        response["items"] = items;
        std::cout << "[handle_cart_show] 파싱된 row 개수: " << row_count << std::endl;
    } else {
        response["status"] = "fail";
        response["message"] = "장바구니 내역이 없음";
        std::cout << "[handle_cart_show][WARNING] 장바구니 내역이 없음" << std::endl;
    }

    // 8. 최종 응답 JSON 로그
    std::cout << "[handle_cart_show] 최종 응답 JSON: " << response.dump() << std::endl;

    return response;
}