[Base] dashboard-block-update 无法更新 UI 复制且返回 type=unknown 的组件,raw PATCH 返回 code 1
Nobody has claimed this yet.
- 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"。
尝试修改组件的日期筛选条件时:
base +dashboard-block-update即使使用--no-validate,仍会因为type=unknown在本地终止;- 改用
lark-cli api PATCH调用同一个 Base v3 endpoint,则服务端返回通用错误code: 1; - 即使只提交保持原值的
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:readbase:dashboard:updatebase:block:readbase:block:update
- 应用已添加为目标 Base 的可编辑协作者
所有 Base token、dashboard ID、block ID、账号和应用标识均已在以下示例中脱敏。
前置条件
- 在飞书 Base 网页端创建一个包含图表和日期筛选的仪表盘。
- 在网页端复制该仪表盘。
- 日期筛选使用 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 协作者权限。
预期行为
至少满足以下一种行为:
- UI 创建或复制的图表组件应返回 CLI 支持的 canonical block type,而不是
unknown; - 即使 block type 暂时无法识别,
+dashboard-block-update --no-validate也应允许更新name或已有的data_config.filter; - 从
+dashboard-block-get得到的data_config应能够在仅修改日期值后提交给+dashboard-block-update,与 #757 的修复结论一致; - 如果上游 API 确实不支持更新该类组件,应返回明确、可操作的错误,而不是通用
code: 1。
实际影响
- 网页端复制的仪表盘无法通过 CLI 滚动日期范围;
- 无法将仪表盘配置纳入可重复执行的自动化流程;
- 只能依赖网页端手动修改或 UI 自动化;
--no-validate无法作为未知组件类型的 raw passthrough;- 通用
code: 1无法判断是组件类型、服务端兼容性还是其他请求限制。
建议
- 检查 UI 创建或复制的 Dashboard block 到 CLI type 枚举的映射;
- 让
--no-validate真正跳过本地 block type 限制; - 为
code: 1保留并显示上游返回的详细错误信息; - 增加以下回归测试:
- UI copied block;
type=unknown;ExactDatefilter round-trip;- name-only PATCH;
- 如果属于 OpenAPI 能力限制,请在 Dashboard 支持矩阵和 CLI help 中明确说明。
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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