larksuite / larksuite/cli

[Base] dashboard-block-update 无法更新 UI 复制且返回 type=unknown 的组件,raw PATCH 返回 code 1

Open
#2,137 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug domain/auth domain/base domain/core
Dominant language
Go
Stars
17.3k
Forks
1.4k
Avg merge
2d 4h
Merged PRs (30d)
105

Description

问题描述

在飞书 Base 网页端复制一个已有仪表盘后,lark-cli 可以读取其中的图表组件及完整 data_config,但这些组件的 type 被返回为 "unknown"

尝试修改组件的日期筛选条件时:

  1. base +dashboard-block-update 即使使用 --no-validate,仍会因为 type=unknown 在本地终止;
  2. 改用 lark-cli api PATCH 调用同一个 Base v3 endpoint,则服务端返回通用错误 code: 1
  3. 即使只提交保持原值的 name,不修改 data_config,也会返回相同错误。

因此,目前无法通过 CLI 更新网页端复制的仪表盘组件。

这可能是以下情况之一:

  • Issue #757 的回归;
  • #757 的修复未覆盖 UI 创建或复制后返回 type=unknown 的组件;
  • Base v3 Dashboard API 不支持更新这类组件,但 CLI 没有明确暴露该限制。

相关 Issue:

  • #757
  • #1659

环境

  • lark-cli version 1.0.80
  • macOS / arm64
  • 品牌:Feishu
  • 用户身份和应用身份均已测试
  • 用户 token 已验证有效
  • 已开通:
    • base:dashboard:read
    • base:dashboard:update
    • base:block:read
    • base:block:update
  • 应用已添加为目标 Base 的可编辑协作者

所有 Base token、dashboard ID、block ID、账号和应用标识均已在以下示例中脱敏。

前置条件

  1. 在飞书 Base 网页端创建一个包含图表和日期筛选的仪表盘。
  2. 在网页端复制该仪表盘。
  3. 日期筛选使用 Base 返回的 ExactDate 格式,例如:
{
  "filter": {
    "conditions": [
      {
        "field_name": "Date",
        "operator": "isGreater",
        "value": ["ExactDate", 1704038400000]
      },
      {
        "field_name": "Date",
        "operator": "isLess",
        "value": ["ExactDate", 1706716800000]
      }
    ],
    "conjunction": "and"
  }
}

复现步骤

1. 读取组件

用户身份调用:

lark-cli api GET \
  /open-apis/base/v3/bases/<base_token>/dashboards/<dashboard_id>/blocks/<block_id> \
  --as user

读取成功,返回结果类似:

{
  "ok": true,
  "identity": "user",
  "data": {
    "block_id": "<block_id>",
    "name": "本月示例数据",
    "type": "unknown",
    "data_config": {
      "table_name": "示例数据表",
      "series": [
        {
          "field_name": "Metric",
          "rollup": "SUM"
        }
      ],
      "group_by": [
        {
          "field_name": "Date",
          "mode": "integrated",
          "sort": {
            "type": "group"
          }
        }
      ],
      "filter": {
        "conditions": [
          {
            "field_name": "Date",
            "operator": "isGreater",
            "value": ["ExactDate", 1701360000000]
          },
          {
            "field_name": "Date",
            "operator": "isLess",
            "value": ["ExactDate", 1704038400000]
          }
        ],
        "conjunction": "and"
      }
    }
  }
}
2. 使用 dashboard-block-update 修改日期筛选
lark-cli base +dashboard-block-update \
  --base-token <base_token> \
  --dashboard-id <dashboard_id> \
  --block-id <block_id> \
  --data-config '{
    "filter": {
      "conditions": [
        {
          "field_name": "Date",
          "operator": "isGreater",
          "value": ["ExactDate", 1704038400000]
        },
        {
          "field_name": "Date",
          "operator": "isLess",
          "value": ["ExactDate", 1706716800000]
        }
      ],
      "conjunction": "and"
    }
  }' \
  --no-validate \
  --as user

实际结果:

unsupported block type "unknown", supported types: column, bar, line, pie, ring, scatter, funnel, wordCloud, area, combo, radar, statistics, text

--no-validate 没有绕过这个 block type 检查,请求没有发送到服务端。

3. 使用 raw API PATCH 绕过本地类型检查
lark-cli api PATCH \
  /open-apis/base/v3/bases/<base_token>/dashboards/<dashboard_id>/blocks/<block_id> \
  --data '{
    "data_config": {
      "filter": {
        "conditions": [
          {
            "field_name": "Date",
            "operator": "isGreater",
            "value": ["ExactDate", 1704038400000]
          },
          {
            "field_name": "Date",
            "operator": "isLess",
            "value": ["ExactDate", 1706716800000]
          }
        ],
        "conjunction": "and"
      }
    }
  }' \
  --as user

实际结果:

{
  "ok": false,
  "identity": "user",
  "error": {
    "type": "api",
    "subtype": "unknown",
    "code": 1,
    "message": "API error: [1]"
  }
}
4. 排除日期 filter 格式问题

只提交保持原值的组件名称:

lark-cli api PATCH \
  /open-apis/base/v3/bases/<base_token>/dashboards/<dashboard_id>/blocks/<block_id> \
  --data '{"name":"本月示例数据"}' \
  --as user

仍然返回:

{
  "ok": false,
  "identity": "user",
  "error": {
    "type": "api",
    "subtype": "unknown",
    "code": 1,
    "message": "API error: [1]"
  }
}

因此错误并非由 ExactDate value 或筛选 JSON 引起。

身份与权限排查

为了排除授权问题,还进行了以下验证:

身份 操作 结果
user GET block 成功,可读取完整 data_config
user PATCH block filter code: 1
user PATCH block,名称保持原值 code: 1
bot,未添加协作者前 PATCH block 91403
bot,添加为可编辑协作者并开通 read/update 后 GET/PATCH block scope 和 91403 消失,但返回 code: 1

所以当前问题不是缺少 OAuth scope 或 Base 协作者权限。

预期行为

至少满足以下一种行为:

  1. UI 创建或复制的图表组件应返回 CLI 支持的 canonical block type,而不是 unknown
  2. 即使 block type 暂时无法识别,+dashboard-block-update --no-validate 也应允许更新 name 或已有的 data_config.filter
  3. +dashboard-block-get 得到的 data_config 应能够在仅修改日期值后提交给 +dashboard-block-update,与 #757 的修复结论一致;
  4. 如果上游 API 确实不支持更新该类组件,应返回明确、可操作的错误,而不是通用 code: 1

实际影响

  • 网页端复制的仪表盘无法通过 CLI 滚动日期范围;
  • 无法将仪表盘配置纳入可重复执行的自动化流程;
  • 只能依赖网页端手动修改或 UI 自动化;
  • --no-validate 无法作为未知组件类型的 raw passthrough;
  • 通用 code: 1 无法判断是组件类型、服务端兼容性还是其他请求限制。

建议

  1. 检查 UI 创建或复制的 Dashboard block 到 CLI type 枚举的映射;
  2. --no-validate 真正跳过本地 block type 限制;
  3. code: 1 保留并显示上游返回的详细错误信息;
  4. 增加以下回归测试:
    • UI copied block;
    • type=unknown
    • ExactDate filter round-trip;
    • name-only PATCH;
  5. 如果属于 OpenAPI 能力限制,请在 Dashboard 支持矩阵和 CLI help 中明确说明。

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the base +dashboard-block-update entry point and the raw api PATCH path, reproducing the type=unknown validation and upstream code: 1 cases described here. Review the proposed regression coverage for UI-copied blocks, ExactDate round trips, and name-only PATCH requests; done means the behavior is either supported with tests or reported with a clear documented limitation.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
api, cli
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.