Pango AIPango AI Team
Module 01: Chatbot Service (API)1.5 GraphQL API & Code Examples
Module 01 • API Gateway

1.5.5 Chi Tiết Phiên Chat (MyChatSessionDetail)

QUERY Yêu cầu Bearer Token

Truy vấn toàn bộ tin nhắn thuộc về một phiên làm việc cụ thể (chatSessionId). Thường dùng khi ứng dụng có màn hình danh sách các phiên tư vấn cũ và người dùng chọn bấm vào xem lại chi tiết một phiên làm việc độc lập.


💻 Chi Tiết Truy Vấn & Mã Nguồn Mẫu

GraphQL Query & Payload:

GraphQL Query

MyChatSessionDetail.gql
query MyChatSessionDetail($request: ChatSessionDetailRequestDtoInput!) {
  myChatSessionDetail(request: $request) {
    chatSessionId
    channel
    messages {
      id
      chatSessionId
      senderType
      senderId
      senderName
      message
      sentAt
      status
      attachments
    }
  }
}

Variables (JSON)

Variables
{
  "request": {
    "chatSessionId": "6a7d45b5aa2c04f1151bee2b",
    "beforeAt": null,
    "limit": 50,
    "sort": [{ "field": "sentAt", "direction": "desc" }]
  }
}

Phản Hồi Thành Công (JSON Response)

Response 200 OK
{
  "data": {
    "myChatSessionDetail": {
      "chatSessionId": "6a7d45b5aa2c04f1151bee2b",
      "channel": "WEB_APP",
      "messages": [
        {
          "id": "6a8913448201e708713c6e48",
          "chatSessionId": "6a7d45b5aa2c04f1151bee2b",
          "senderType": "ASSISTANT",
          "senderId": "bot-buddy",
          "senderName": "V-Buddy Assistant",
          "message": "Dạ, VUS hiện có các khóa học tiếng Anh mầm non SmartKids...",
          "sentAt": 1740200015000,
          "status": "COMPLETED",
          "attachments": null
        }
      ]
    }
  }
}

TypeScript / Axios:

fetchChatSessionDetail.ts
import axios from 'axios';

export interface ChatSessionMessage {
  id: string;
  chatSessionId: string;
  senderType: 'USER' | 'ASSISTANT' | 'SYSTEM';
  senderId: string;
  senderName: string;
  message: string;
  sentAt: number;
  status: string;
  attachments?: any;
}

/**
 * Tải danh sách tin nhắn theo Session ID chỉ định
 */
export async function fetchChatSessionDetail(
  apiUrl: string = process.env.VITE_API_URL!,
  token: string,
  sessionId: string,
  beforeAt?: number | null,
  limit: number = 50
): Promise<ChatSessionMessage[]> {
  const query = `
    query MyChatSessionDetail($request: ChatSessionDetailRequestDtoInput!) {
      myChatSessionDetail(request: $request) {
        chatSessionId
        channel
        messages {
          id
          chatSessionId
          senderType
          senderId
          senderName
          message
          sentAt
          status
          attachments
        }
      }
    }
  `;

  const response = await axios.post(
    apiUrl,
    {
      query,
      variables: {
        request: {
          chatSessionId: sessionId,
          beforeAt: beforeAt || null,
          limit,
          sort: [{ field: 'sentAt', direction: 'desc' }],
        },
      },
      operationName: 'MyChatSessionDetail',
    },
    {
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`,
        'orgId': process.env.VITE_ORG_ID,
        'x-org-id': process.env.VITE_ORG_ID,
        'x-client-type': 'app',
        'x-external-private-key': process.env.VITE_EXTERNAL_PRIVATE_KEY,
      },
    }
  );

  return response.data?.data?.myChatSessionDetail?.messages || [];
}