Skip to main content

路径

POST /v2/publish
feeds_v2 是新的社交表:一条 feed 可携带多个媒体(image / video 混排)和一段 caption,hashtag 从 caption 中自动抠取。Legacy feed 表(单图/单视频)仍在用,见 POST /publish/

认证

Bearer JWT(supabaseAuth()

请求 Body

{
  medias: Array<
    | { type: "image", data: Image }       // Image 顶层 imageId
    | { type: "video", data: FeedVideo }   // FeedVideo: { videoId, thumbId, prompt?, duration, ratio, width, height }
  >,                                       // 至少 1 个
  caption?: string | null                  // 最长 500 code point,超出截断
}
hashtag 不单独传,全部从 caption 里抠(正则:# + 1–50 个 Unicode 字母数字,含 CJK;小写、保序去重)。

响应

{ "id": "<feed_id>" }

发布流程(三步,非原子)

Supabase JS 不支持事务,三步分别执行,后两步失败仅记日志、feed 已写则保留:
1

INSERT feeds_v2

写入 { owner_id, medias, caption },拿回 id。失败 → 500。
2

UPSERT hashtags

对 caption 抠出的每个 slug UPSERT hashtags (slug) ON CONFLICT slug,收集 hashtag_id。失败仅 appLog.error
3

INSERT feed_hashtags

为每个 hashtag_id 插入 { feed_id, hashtag_id } junction 行。失败仅 appLog.error
最后 PostHog feed_v2_publishedhashtag_count / media_count / media_types)。

错误

状态含义
400Body 不符合 schema(如 medias 为空)
401未授权
500feeds_v2 写入失败

src/hono/feedv2/index.tsPOST /publish)、src/hono/feedv2/normalize.ts(caption / hashtag 解析)

相关