_template.md 1.8 KB

云函数统一设计约定

所有云函数遵循同一套约定(参考 docs/云函数/筷子一键成片.json):

1. 统一表结构

CREATE TABLE "<ResourceName>" (
  "objectId"  VARCHAR(50) PRIMARY KEY,     -- 10位随机ID(云函数生成)
  "bizId"     VARCHAR(255),                -- 业务ID(原 video.id / task.id ...)
  "data"      JSONB NOT NULL DEFAULT '{}', -- 完整业务字段(保留原 JSON 结构)
  "userId"    VARCHAR(255) DEFAULT '',     -- 用户隔离(可选)
  "status"    VARCHAR(50)  DEFAULT '',     -- 常用筛选字段
  "type"      VARCHAR(50)  DEFAULT '',     -- 常用筛选字段
  "createdAt" TIMESTAMPTZ  DEFAULT NOW(),
  "updatedAt" TIMESTAMPTZ  DEFAULT NOW()
)

为常用字段建索引:bizId (UNIQUE)、userIdstatustypecreatedAt

2. 统一调用约定

字段 说明
action 操作类型(list/get/create/update/delete/...)
id 或业务字段 操作目标
其它 透传到 data 字段

3. 统一响应格式

// 成功
{ "code": 200, "success": true, "data": ... }

// 失败
{ "code": 400, "success": false, "error": "..." }

4. 公共工具函数(每个云函数都拷贝一份)

function generateId() {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let s = '';
  for (let i = 0; i < 10; i++) s += chars.charAt(Math.floor(Math.random() * chars.length));
  return s;
}

function pickParam(request, ...names) {
  const sources = [request.params, request.body, request];
  for (const src of sources) {
    if (!src || typeof src !== 'object') continue;
    for (const n of names) {
      if (src[n] !== undefined && src[n] !== null && src[n] !== '') return src[n];
    }
  }
  return null;
}