fix(*): 资源与技能 - 精简列表载荷并禁止对象存储静默降级
This commit is contained in:
@@ -46,6 +46,51 @@ func ClientAssetPayload(asset model.Asset) json.RawMessage {
|
||||
return encoded
|
||||
}
|
||||
|
||||
// ClientAssetListPayload is the list variant used by the paginated asset
|
||||
// library. The list only needs enough metadata to render cards and perform
|
||||
// an action; generation prompts and other verbose metadata belong to the
|
||||
// asset detail/snapshot paths. Keeping them out of every page also avoids
|
||||
// repeatedly parsing and copying the same prompt strings in the browser.
|
||||
func ClientAssetListPayload(asset model.Asset) json.RawMessage {
|
||||
raw := ClientAssetPayload(asset)
|
||||
if len(raw) == 0 {
|
||||
return nil
|
||||
}
|
||||
var payload map[string]any
|
||||
if err := json.Unmarshal(raw, &payload); err != nil || payload == nil {
|
||||
return raw
|
||||
}
|
||||
if metadata, ok := payload["metadata"].(map[string]any); ok {
|
||||
// 列表只需要项目归属提示。canvasId 仍保留,避免列表卡片把画布素材
|
||||
// 错显示成“未关联项目”;节点 ID、生成提示和其他同步上下文在详情路径读取。
|
||||
for key := range metadata {
|
||||
if key != "projectName" && key != "projectIds" && key != "canvasId" {
|
||||
delete(metadata, key)
|
||||
}
|
||||
}
|
||||
if len(metadata) == 0 {
|
||||
delete(payload, "metadata")
|
||||
}
|
||||
}
|
||||
// 图片封面和 dataUrl、视频封面和 url 通常是同一个地址;列表保留
|
||||
// coverUrl 字段以满足前端合同,但不再重复传输这段长 URL。
|
||||
if cover, ok := payload["coverUrl"].(string); ok {
|
||||
if data, ok := payload["data"].(map[string]any); ok {
|
||||
for _, key := range []string{"dataUrl", "url"} {
|
||||
if value, ok := data[key].(string); ok && value == cover {
|
||||
payload["coverUrl"] = ""
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
encoded, err := json.Marshal(payload)
|
||||
if err != nil {
|
||||
return raw
|
||||
}
|
||||
return encoded
|
||||
}
|
||||
|
||||
func deriveAssetCoverURL(payload map[string]any) string {
|
||||
if value, ok := payload["coverUrl"].(string); ok && strings.TrimSpace(value) != "" {
|
||||
return value
|
||||
|
||||
@@ -60,3 +60,24 @@ func TestClientAssetPayloadPreservesCompleteDocument(t *testing.T) {
|
||||
t.Fatalf("payload changed: %s", raw)
|
||||
}
|
||||
}
|
||||
|
||||
func TestClientAssetListPayloadDropsVerboseMetadata(t *testing.T) {
|
||||
asset := model.Asset{PayloadJSON: `{"id":"asset-1","kind":"image","title":"列表","coverUrl":"https://example.com/a.png","tags":[],"data":{"dataUrl":"https://example.com/a.png","width":2,"height":3,"bytes":1,"mimeType":"image/png"},"metadata":{"prompt":"很长的生成提示词","nodeId":"node-1","projectIds":["project-1"]}}`}
|
||||
var payload map[string]any
|
||||
if err := json.Unmarshal(ClientAssetListPayload(asset), &payload); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
metadata := payload["metadata"].(map[string]any)
|
||||
if _, found := metadata["prompt"]; found {
|
||||
t.Fatalf("list payload still contains prompt: %#v", metadata)
|
||||
}
|
||||
if _, found := metadata["nodeId"]; found {
|
||||
t.Fatalf("list payload still contains node metadata: %#v", metadata)
|
||||
}
|
||||
if metadata["projectIds"].([]any)[0] != "project-1" {
|
||||
t.Fatalf("list payload dropped useful metadata: %#v", metadata)
|
||||
}
|
||||
if payload["coverUrl"] != "" {
|
||||
t.Fatalf("duplicate cover URL was not removed: %#v", payload["coverUrl"])
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user