# 复制粘贴

## 应用场景

Block 复制粘贴支持以下几种场景：

1.  **同宿主复制粘贴**，例如，将文档 A 中的 Block 复制粘贴到文档 B 或者，将文档 A 中的 Block 复制粘贴到 文档A
1.  **副本创建**，例如，文档 A 内部包含 Block，对文档A 创建副本，生成文档 B。

在上述复制粘贴场景中，根据业务需求的不同，可以实现不同的粘贴后效果，即拷贝或引用。如果是拷贝，粘贴会生成新的 Block（产生新 blockID）；如果是引用，粘贴的是原 Block 的引用（使用原 blockID）。

## 业务流程

![image.png](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/ce659c235d3df9b4cf4748db5402880a_dlctNvCYN5.png?lazyload=true&width=1640&height=898)
- 如果期望粘贴后产生新的 Block，则需要业务服务端调用 Block 创建接口，创建新 Block。
- 如果期望粘贴后使用原 Block，则不需要配置 webhook，没有 webhook 地址时，会返回原 Block。

## 业务接入

### 配置请求地址

1. 登录开发者后台，进入 **小组件** 页面。
2. 在 **请求地址配置** 模块，填写 HTTP/HTTPS URL，并点击保存使填写内容生效。
若你在一款应用中启用多了款小组件，均可共用一个请求地址，无需重复配置。

![Snipaste_2022-06-13_17-32-10.png](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/eb3c9029c18ecef198d67edaf22bef1c_Lay0Crb21a.png?lazyload=true&width=2442&height=588)

### 实现接口协议
该功能复用了「事件订阅」模块中的加解密机制，如果在「事件订阅」中配置了Encrypt Key，则发起请求时会对请求体加密，同时也就要求业务方在处理请求时要先解密。具体请参考[订阅事件案例示例](https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/subscription-event-case)。

#### 网址合法性校验协议
该协议实现用于校验 webhook-url 的合法性，必选。<br>
开发者服务端接收到的请求参数：
```JavaScript
{
  head: {
    commandType: "block_webhook_check", // 用于标识命令类型（开发者服务端只需要配一个hook url）
    openID: "xxxx", // 当前粘贴用户 openID
    token: "XXXX", // 鉴权 token（证明是开放平台请求的，而不是其他服务）
  },
  checkID: XXX //检查 ID 值
}
```
开发者服务端响应参数结构:
```javascript
{
  checkID: XXX, //请求参数里面的 checkID 值
  code: 0, //0 表示成功，非 0 表示失败
  msg: "success"
}
```

#### 复制粘贴接口协议
该协议用于实现粘贴功能。<br>
开发者服务端接收到的请求参数:
```javascript
{
  head: {
   commandType: "clone_block", // 用于标识命令类型（三方只需要配一个hook url）
   openID:"xxxx", // 当前粘贴用户 openID
   token:"XXXX", // 鉴权 token（证明是开放平台请求的，而不是其他服务）
  },
  data: {
   blockIDs: [id], // 被复制的 blockID 列表
   context: {
    platform: 'pc/mobile', // 当前平台
    language: string, // zh_CN
    to: hostName, // 被复制来源宿主
    from: hostName, // 粘贴到的宿主
    scene: 'paste/template/pasteFromSameContext/cut', // 场景值
   }
  }
 }
```
开发者服务端响应:
```javascript
{
  data: {
    blocks:{[blockID]:[newBlockID]}
  },
  code:0, //0 表示成功； 10000 表示无上述 command 实现
  msg:"success"
}
```

### 说明

1. 开发者服务端未实现克隆接口，则返回原 blockID（即引用）。
2. 考虑到性能问题，针对创建副本场景，建议开发者服务端并行处理。
3. 考虑到性能问题，开放平台回调开发者服务端超时时间为 1s。
