diff --git a/README.md b/README.md index 319a2ce7..34f1277d 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ https://godoc.org/github.com/chyroc/lark ## Support APIs -API Count: 1098, Event Count: 149 +API Count: 1098, Event Count: 152
@@ -498,6 +498,7 @@ API Count: 1098, Event Count: 149 - GetCoreHRDepartment - SearchCoreHRDepartment - QueryCoreHRDepartmentTimeline + - BatchQueryCoreHRDepartmentTimeline - GetCoreHRDepartmentParentList - CreateCoreHRDepartment - DeleteCoreHRDepartment @@ -577,7 +578,6 @@ API Count: 1098, Event Count: 149 - GetCoreHRSecurityGroupBp - SearchCoreHRAssignedUser - GetCoreHRAuthorization - - GetCoreHRAuthorizationList - GetCoreHRSecurityGroupList - GetCoreHRProcessList - GetCoreHRProcess @@ -753,6 +753,9 @@ API Count: 1098, Event Count: 149 - Event - GetEventOutboundIpList - EventCallback + - EventV2CorehrOffboardingUpdatedV2 + - EventV2CorehrOffboardingStatusUpdatedV2 + - EventV2CorehrOffboardingChecklistUpdatedV2 - EventV2CardActionTrigger - EventV2ElearningCourseRegistrationCreatedV2 - EventV2ElearningCourseRegistrationUpdatedV2 diff --git a/README_CN.md b/README_CN.md index 35aa2502..de94d0d0 100644 --- a/README_CN.md +++ b/README_CN.md @@ -38,7 +38,7 @@ https://godoc.org/github.com/chyroc/lark ## 支持的接口 -API 总数: 1098, 事件总数: 149 +API 总数: 1098, 事件总数: 152
@@ -498,6 +498,7 @@ API 总数: 1098, 事件总数: 149 - GetCoreHRDepartment - SearchCoreHRDepartment - QueryCoreHRDepartmentTimeline + - BatchQueryCoreHRDepartmentTimeline - GetCoreHRDepartmentParentList - CreateCoreHRDepartment - DeleteCoreHRDepartment @@ -577,7 +578,6 @@ API 总数: 1098, 事件总数: 149 - GetCoreHRSecurityGroupBp - SearchCoreHRAssignedUser - GetCoreHRAuthorization - - GetCoreHRAuthorizationList - GetCoreHRSecurityGroupList - GetCoreHRProcessList - GetCoreHRProcess @@ -753,6 +753,9 @@ API 总数: 1098, 事件总数: 149 - Event - GetEventOutboundIpList - EventCallback + - EventV2CorehrOffboardingUpdatedV2 + - EventV2CorehrOffboardingStatusUpdatedV2 + - EventV2CorehrOffboardingChecklistUpdatedV2 - EventV2CardActionTrigger - EventV2ElearningCourseRegistrationCreatedV2 - EventV2ElearningCourseRegistrationUpdatedV2 diff --git a/api_chat_create.go b/api_chat_create.go index 3b00f65e..5bdb60ba 100644 --- a/api_chat_create.go +++ b/api_chat_create.go @@ -26,8 +26,7 @@ import ( // 注意事项: // - 应用需要开启[机器人能力](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-enable-bot-ability) // - 本接口支持在创建群的同时拉用户或机器人进群;如果仅需要拉用户或者机器人入群参考 [将用户或机器人拉入群聊](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat-members/create)接口 -// - 商店应用无法使用 user_id。因此使用商店应用调用本接口时用户 ID 类型请选择 open_id 或者 union_id -// - 本接口仅支持创建普通群, 即对话消息形式的群。如果你需要创建话题群, 可以先调用本接口创建群, 然后调用[更新群信息](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat/update)接口, 将群更新为话题群(group_message_type 取值 thread)。 +// - 商店应用无法使用 user_id。因此使用商店应用调用本接口时用户 ID 类型请选择 open_id 或者 union_id。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat/create // new doc: https://open.feishu.cn/document/server-docs/group/chat/create diff --git a/api_corehr_authorization_get.go b/api_corehr_authorization_get.go index 51a626f4..d86b5d14 100644 --- a/api_corehr_authorization_get.go +++ b/api_corehr_authorization_get.go @@ -23,8 +23,7 @@ import ( // GetCoreHRAuthorization 查询「飞书人事」-「权限设置」中的单个用户授权信息。 // -// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/authorization/query-user-authorization -// new doc: https://open.feishu.cn/document/server-docs/corehr-v1/authorization/query-user-authorization +// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/authorization/get_by_param func (r *CoreHRService) GetCoreHRAuthorization(ctx context.Context, request *GetCoreHRAuthorizationReq, options ...MethodOptionFunc) (*GetCoreHRAuthorizationResp, *Response, error) { if r.cli.mock.mockCoreHRGetCoreHRAuthorization != nil { r.cli.Log(ctx, LogLevelDebug, "[lark] CoreHR#GetCoreHRAuthorization mock enable") diff --git a/api_corehr_authorization_list.go b/api_corehr_authorization_list.go deleted file mode 100644 index e952806a..00000000 --- a/api_corehr_authorization_list.go +++ /dev/null @@ -1,172 +0,0 @@ -// Code generated by lark_sdk_gen. DO NOT EDIT. -/** - * Copyright 2022 chyroc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package lark - -import ( - "context" -) - -// GetCoreHRAuthorizationList 批量查询「飞书人事」-「权限设置」中的用户授权信息。 -// -// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/authorization/batch-query-user-authorization -// new doc: https://open.feishu.cn/document/server-docs/corehr-v1/authorization/batch-query-user-authorization -func (r *CoreHRService) GetCoreHRAuthorizationList(ctx context.Context, request *GetCoreHRAuthorizationListReq, options ...MethodOptionFunc) (*GetCoreHRAuthorizationListResp, *Response, error) { - if r.cli.mock.mockCoreHRGetCoreHRAuthorizationList != nil { - r.cli.Log(ctx, LogLevelDebug, "[lark] CoreHR#GetCoreHRAuthorizationList mock enable") - return r.cli.mock.mockCoreHRGetCoreHRAuthorizationList(ctx, request, options...) - } - - req := &RawRequestReq{ - Scope: "CoreHR", - API: "GetCoreHRAuthorizationList", - Method: "GET", - URL: r.cli.openBaseURL + "/open-apis/corehr/v1/authorizations/query", - Body: request, - MethodOption: newMethodOption(options), - NeedTenantAccessToken: true, - } - resp := new(getCoreHRAuthorizationListResp) - - response, err := r.cli.RawRequest(ctx, req, resp) - return resp.Data, response, err -} - -// MockCoreHRGetCoreHRAuthorizationList mock CoreHRGetCoreHRAuthorizationList method -func (r *Mock) MockCoreHRGetCoreHRAuthorizationList(f func(ctx context.Context, request *GetCoreHRAuthorizationListReq, options ...MethodOptionFunc) (*GetCoreHRAuthorizationListResp, *Response, error)) { - r.mockCoreHRGetCoreHRAuthorizationList = f -} - -// UnMockCoreHRGetCoreHRAuthorizationList un-mock CoreHRGetCoreHRAuthorizationList method -func (r *Mock) UnMockCoreHRGetCoreHRAuthorizationList() { - r.mockCoreHRGetCoreHRAuthorizationList = nil -} - -// GetCoreHRAuthorizationListReq ... -type GetCoreHRAuthorizationListReq struct { - EmploymentIDList []string `query:"employment_id_list" json:"-"` // 员工ID列表, 最大100个(不传则默认查询全部员工), 示例值: 2144464184272078374 - RoleIDList []string `query:"role_id_list" json:"-"` // 角色 ID 列表, 最大 100 个, 示例值: 4344464184272078374 - PageToken *string `query:"page_token" json:"-"` // 分页标记, 第一次请求不填, 表示从头开始遍历;分页查询结果还有更多项时会同时返回新的 page_token, 下次遍历可采用该 page_token 获取查询结果, 示例值: 6969864184272078374 - PageSize *int64 `query:"page_size" json:"-"` // 每页获取记录数量, 最大100, 示例值: 100 - UserIDType *IDType `query:"user_id_type" json:"-"` // 用户 ID 类型, 示例值: people_corehr_id, 可选值有: open_id: 标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。[了解更多: 如何获取 Open ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-openid), union_id: 标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的, 在不同开发商下的应用中的 Union ID 是不同的。通过 Union ID, 应用开发商可以把同个用户在多个应用中的身份关联起来。[了解更多: 如何获取 Union ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-union-id), user_id: 标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内, 一个用户的 User ID 在所有应用(包括商店应用)中都保持一致。User ID 主要用于在不同的应用间打通用户数据。[了解更多: 如何获取 User ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id), people_corehr_id: 以飞书人事的 ID 来识别用户, 默认值: `people_corehr_id`, 当值为 `user_id`, 字段权限要求: 获取用户 user ID -} - -// GetCoreHRAuthorizationListResp ... -type GetCoreHRAuthorizationListResp struct { - Items []*GetCoreHRAuthorizationListRespItem `json:"items,omitempty"` // 查询的用户授权信息 - HasMore bool `json:"has_more,omitempty"` // 是否还有更多项 - PageToken string `json:"page_token,omitempty"` // 分页标记, 当 has_more 为 true 时, 会同时返回新的 page_token, 否则不返回 page_token -} - -// GetCoreHRAuthorizationListRespItem ... -type GetCoreHRAuthorizationListRespItem struct { - EmploymentID string `json:"employment_id,omitempty"` // 雇员 ID - PermissionDetailList []*GetCoreHRAuthorizationListRespItemPermissionDetail `json:"permission_detail_list,omitempty"` // 授权列表 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetail ... -type GetCoreHRAuthorizationListRespItemPermissionDetail struct { - Role *GetCoreHRAuthorizationListRespItemPermissionDetailRole `json:"role,omitempty"` // 角色 - AssignedOrganizationList [][]*GetCoreHRAuthorizationListRespItemPermissionDetailAssignedOrganization `json:"assigned_organization_list,omitempty"` // 指定管理对象列表, 如果该值为null, 则使用设置数据权限 - GrantorRuleList []*GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRule `json:"grantor_rule_list,omitempty"` // 设置数据权限, 如果该值为null, 则使用指定管理对象列表 - UpdateTime string `json:"update_time,omitempty"` // 更新时间 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRule ... -type GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRule struct { - RuleDimension *GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleRuleDimension `json:"rule_dimension,omitempty"` // 管理维度 - RuleType int64 `json:"rule_type,omitempty"` // 管理类型 - Expression *GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpression `json:"expression,omitempty"` // 规则 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpression ... -type GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpression struct { - Conditions []*GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionCondition `json:"conditions,omitempty"` // 规则 - Expression string `json:"expression,omitempty"` // 表达式 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionCondition ... -type GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionCondition struct { - Left *GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionConditionLeft `json:"left,omitempty"` // 左值 - Right *GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionConditionRight `json:"right,omitempty"` // 右值 - Operator int64 `json:"operator,omitempty"` // 操作符 - RightValueType int64 `json:"right_value_type,omitempty"` // 右值类型 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionConditionLeft ... -type GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionConditionLeft struct { - Type int64 `json:"type,omitempty"` // 规则值类型 - Value string `json:"value,omitempty"` // 规则值 - LookupValue string `json:"lookup_value,omitempty"` // 下钻值 - LookupType string `json:"lookup_type,omitempty"` // 下钻类型 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionConditionRight ... -type GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleExpressionConditionRight struct { - Type int64 `json:"type,omitempty"` // 规则值类型 - Value string `json:"value,omitempty"` // 规则值 - LookupValue string `json:"lookup_value,omitempty"` // 下钻值 - LookupType string `json:"lookup_type,omitempty"` // 下钻类型 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleRuleDimension ... -type GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleRuleDimension struct { - EntityKey string `json:"entity_key,omitempty"` // 维度的key - EntityName *GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleRuleDimensionEntityName `json:"entity_name,omitempty"` // 维度名称 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleRuleDimensionEntityName ... -type GetCoreHRAuthorizationListRespItemPermissionDetailGrantorRuleRuleDimensionEntityName struct { - ZhCn string `json:"zh_cn,omitempty"` // 中文 - EnUs string `json:"en_us,omitempty"` // 英文 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailRole ... -type GetCoreHRAuthorizationListRespItemPermissionDetailRole struct { - ID string `json:"id,omitempty"` // 角色ID - Code string `json:"code,omitempty"` // 角色code - Name *GetCoreHRAuthorizationListRespItemPermissionDetailRoleName `json:"name,omitempty"` // 角色名称 - Description *GetCoreHRAuthorizationListRespItemPermissionDetailRoleDescription `json:"description,omitempty"` // 角色描述 - OrgTruncation []*GetCoreHRAuthorizationListRespItemPermissionDetailRoleOrgTruncation `json:"org_truncation,omitempty"` // 组织管理维度 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailRoleDescription ... -type GetCoreHRAuthorizationListRespItemPermissionDetailRoleDescription struct { - ZhCn string `json:"zh_cn,omitempty"` // 中文 - EnUs string `json:"en_us,omitempty"` // 英文 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailRoleName ... -type GetCoreHRAuthorizationListRespItemPermissionDetailRoleName struct { - ZhCn string `json:"zh_cn,omitempty"` // 中文 - EnUs string `json:"en_us,omitempty"` // 英文 -} - -// GetCoreHRAuthorizationListRespItemPermissionDetailRoleOrgTruncation ... -type GetCoreHRAuthorizationListRespItemPermissionDetailRoleOrgTruncation struct { - OrgKey string `json:"org_key,omitempty"` // 组织名称 - Type int64 `json:"type,omitempty"` // 下钻类型 - Depth int64 `json:"depth,omitempty"` // 下钻深度 -} - -// getCoreHRAuthorizationListResp ... -type getCoreHRAuthorizationListResp struct { - Code int64 `json:"code,omitempty"` // 错误码, 非 0 表示失败 - Msg string `json:"msg,omitempty"` // 错误描述 - Data *GetCoreHRAuthorizationListResp `json:"data,omitempty"` - Error *ErrorDetail `json:"error,omitempty"` -} diff --git a/api_drive_file_create.go b/api_drive_file_create.go index d118ac14..ec33561a 100644 --- a/api_drive_file_create.go +++ b/api_drive_file_create.go @@ -21,13 +21,14 @@ import ( "context" ) -// CreateDriveFile 在用户云空间指定文件夹中创建旧版文档、电子表格或者多维表格。如果目标文件夹是「我的空间」, 则新建的文档会在「我的空间」的「归我所有」列表里。 +// CreateDriveFile 该接口用于在云空间指定文件夹中创建电子表格或者多维表格。 // -// - 云空间中文件夹单层节点上限是 1500 个, 超过此限制接口将会返回失败。如有创建大量节点的需求, 可以考虑将文档新建到不同文件夹下; -// - 我们对创建类接口进行了更细粒度的拆分和升级: -// --本接口不支持创建[新版文档](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/document-docx/docx-overview), 如需创建新版文档, 请调用[创建新版文档](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/document-docx/docx-v1/document/create)接口; -// --如需创建电子表格, 也可以调用[创建表格](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/sheets-v3/spreadsheet/create)接口。 -// 该接口不支持并发创建, 且调用频率上限为 5QPS 且 10000次/天 +// 推荐你使用[创建表格](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/sheets-v3/spreadsheet/create)或[创建多维表格](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/bitable-v1/app/create)接口, 能力和权限拆分力度更细。 +// 使用限制: +// - 云空间中根目录或文件夹的单层节点上限为 1500 个。超过此限制时, 接口将返回 1062507 错误码。可通过将文件新建到不同文件夹中解决。 +// - 云空间中所有层级的节点总和的上限为 40 万个。 +// - 该接口不支持并发调用, 且调用频率上限为 5QPS 且 10000次/天。否则会返回 1061045 错误码, 可通过稍后重试解决。 +// - 该接口不支持创建[文档](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/document-docx/docx-overview)(文档类型为 `docx`), 如需创建文档, 请调用[创建文档](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/document-docx/docx-v1/document/create)接口。 // // doc: https://open.feishu.cn/document/ukTMukTMukTM/uQTNzUjL0UzM14CN1MTN // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/file/create-online-document @@ -65,22 +66,21 @@ func (r *Mock) UnMockDriveCreateDriveFile() { // CreateDriveFileReq ... type CreateDriveFileReq struct { - FolderToken string `path:"folderToken" json:"-"` // 文件夹 token, 用于在此文件夹下新建文档, 获取方式见[如何获取云文档资源相关 token](https://open.feishu.cn/document/ukTMukTMukTM/uczNzUjL3czM14yN3MTN#08bb5df6) - Title string `json:"title,omitempty"` // 创建文档的标题。注: type 为 "doc" 时不可用(非必填, 请求会被过滤), 有创建带标题doc文档需求可用 [创建文档](https://open.feishu.cn/document/ukTMukTMukTM/ugDM2YjL4AjN24COwYjN) 接口 - Type string `json:"type,omitempty"` // 需要创建文档的类型 "doc" 、 "sheet" or "bitable" + FolderToken string `path:"folderToken" json:"-"` // 指定新建文件所属的文件夹或云空间根目录的 token。了解如何获取文件夹 token, 参考[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview)。 + Title string `json:"title,omitempty"` // 创建的文件的标题。 + Type string `json:"type,omitempty"` // 需要创建的文件的类型, 可选值: sheet: 电子表格, bitable: 多维表格 } // CreateDriveFileResp ... type CreateDriveFileResp struct { - URL string `json:"url,omitempty"` // 新创建文档的 url - Token string `json:"token,omitempty"` // 新创建文档的 token - Revision int64 `json:"revision,omitempty"` // 新创建文档的版本号 + URL string `json:"url,omitempty"` // 新创建文件的访问链接 + Token string `json:"token,omitempty"` // 新创建文件的 token + Revision int64 `json:"revision,omitempty"` // 新创建文件的版本号 } // createDriveFileResp ... type createDriveFileResp struct { - Code int64 `json:"code,omitempty"` - Msg string `json:"msg,omitempty"` - Data *CreateDriveFileResp `json:"data,omitempty"` - Error *ErrorDetail `json:"error,omitempty"` + Code int64 `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + Data *CreateDriveFileResp `json:"data,omitempty"` } diff --git a/api_drive_file_download.go b/api_drive_file_download.go index aa3dea41..f4735d33 100644 --- a/api_drive_file_download.go +++ b/api_drive_file_download.go @@ -22,11 +22,14 @@ import ( "io" ) -// DownloadDriveFile 下载云空间中的文件, 如 PDF 文件。不包含飞书文档、电子表格以及多维表格等在线文档。该接口支持通过在请求头添加`Range` 参数分片下载部分文件。 +// DownloadDriveFile 下载云空间中的文件, 如 PDF 文件。不包含飞书文档、电子表格以及多维表格等在线文档。该接口支持通过在请求头添加 `Range` 参数分片下载部分文件。 // -// * 调用此接口之前, 你需确保应用已拥有文件的下载权限。否则接口将返回 403 的 HTTP 状态码。参考[云空间常见问题](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/faq)第五点了解如何分享文件的下载权限给应用。 -// * 本接口仅支持下载云空间中的资源文件。要下载云文档中的素材(如图片、附件等), 需调用[下载素材](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/media/download)接口。 -// 该接口支持调用频率上限为 5 QPS。 +// 前提条件: +// 调用此接口之前, 你需确保应用已拥有文件的下载权限。否则接口将返回 403 的 HTTP 状态码。参考[云空间常见问题](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/faq)第五点了解如何分享文件的下载权限给应用。更多云文档接口权限问题, 参考[云文档常见问题](https://open.feishu.cn/document/ukTMukTMukTM/uczNzUjL3czM14yN3MTN)。 +// 注意事项: +// 本接口仅支持下载云空间中的资源文件。要下载云文档中的素材(如图片、附件等), 需调用[下载素材](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/media/download)接口。 +// 使用限制: +// 该接口调用频率上限为 5 QPS, 10000 次/天。否则会返回 1061045 错误码, 可通过稍后重试解决。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/download // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/download/download @@ -64,7 +67,7 @@ func (r *Mock) UnMockDriveDownloadDriveFile() { // DownloadDriveFileReq ... type DownloadDriveFileReq struct { - FileToken string `path:"file_token" json:"-"` // 文件的 token, 获取方式见 [云文档常见问题](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/docs-faq), 示例值: "boxcnabCdefgabcef" + FileToken string `path:"file_token" json:"-"` // 文件的 token, 获取方式见[文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/file-overview), 示例值: "boxcnabCdefgabcef" } // downloadDriveFileResp ... diff --git a/api_drive_file_file_delete.go b/api_drive_file_file_delete.go index 339153c1..78c83706 100644 --- a/api_drive_file_file_delete.go +++ b/api_drive_file_file_delete.go @@ -21,12 +21,15 @@ import ( "context" ) -// DeleteDriveFile 删除用户在云空间内的文件或者文件夹。文件或者文件夹被删除后, 会进入用户回收站里。 +// DeleteDriveFile 删除用户在云空间内的文件或者文件夹。文件或文件夹被删除后, 会进入回收站中。 // -// 要删除文件需要确保应用具有下述两种权限之一: -// - 该应用是文件所有者并且具有该文件所在父文件夹的编辑权限。 -// - 该应用并非文件所有者, 但是是该文件所在父文件夹的所有者或者拥有该父文件夹的所有权限(full access)。 -// 该接口不支持并发调用, 且调用频率上限为5QPS。删除文件夹会异步执行并返回一个task_id, 可以使用[task_check](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/task_check)接口查询任务执行状态。 +// 如果你删除的是文件夹, 该接口将异步执行, 同时返回该异步任务的 ID。你可使用[查询异步任务状态](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/task_check)接口查询任务执行的状态。 +// 前提条件: +// 要删除文件, 需要确保应用或用户具有以下两种权限之一: +// - 该应用或用户是文件所有者并且具有该文件所在父文件夹的编辑权限。 +// - 该应用或用户并非文件所有者, 但是该文件所在父文件夹的所有者或者拥有该父文件夹的所有权限(full access)。 +// 使用限制: +// 该接口不支持并发调用, 且调用频率上限为 5 QPS, 10000 次/天。否则会返回 1061045 错误码, 可通过稍后重试解决。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/delete // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/file/delete @@ -64,13 +67,13 @@ func (r *Mock) UnMockDriveDeleteDriveFile() { // DeleteDriveFileReq ... type DeleteDriveFileReq struct { - FileToken string `path:"file_token" json:"-"` // 需要删除的文件token, 示例值: "boxcnrHpsg1QDqXAAAyachabcef" + FileToken string `path:"file_token" json:"-"` // 需要删除的文件或文件夹 token, 了解如何获取文件 token, 参考[文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/file-overview), 了解如何获取文件夹 token, 参考[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview), 示例值: "boxcnrHpsg1QDqXAAAyachabcef" Type string `query:"type" json:"-"` // 被删除文件的类型, 示例值: file, 可选值有: file: 文件类型, docx: 新版文档类型, bitable: 多维表格类型, folder: 文件夹类型, doc: 文档类型, sheet: 电子表格类型, mindnote: 思维笔记类型, shortcut: 快捷方式类型, slides: 幻灯片 } // DeleteDriveFileResp ... type DeleteDriveFileResp struct { - TaskID string `json:"task_id,omitempty"` // 异步任务id, 删除文件夹时返回 + TaskID string `json:"task_id,omitempty"` // 异步任务 ID, 删除文件夹时返回。你可继续使用[查询异步任务状态](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/task_check)接口查询任务执行状态 } // deleteDriveFileResp ... diff --git a/api_drive_file_list.go b/api_drive_file_list.go index 42a4b716..3b512d92 100644 --- a/api_drive_file_list.go +++ b/api_drive_file_list.go @@ -21,10 +21,12 @@ import ( "context" ) -// GetDriveFileList 获取用户云空间中指定文件夹下的文件清单。清单类型包括文件、各种在线文档(文档、电子表格、多维表格、思维笔记)、文件夹和快捷方式。该接口支持分页, 但是不会递归获取子文件夹的清单。 +// GetDriveFileList 该接口用于获取用户云空间指定文件夹中文件信息清单。文件的信息包括名称、类型、token、创建时间、所有者 ID 等。 // -// - 让应用(tenant_access_token)访问个人云空间中的文件夹请参阅[常见问题](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/faq)第三点。 -// - 暂不支持返回我的空间下的快捷方式。 +// 了解如何让应用(tenant_access_token)访问个人云空间中的文件夹, 参考[云空间常见问题](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/faq)。 +// 使用限制: +// - 本接口暂不支持返回快捷方式(shortcut)类型的文件。 +// - 本接口仅支持获取当前层级的文件信息, 不支持递归获取子文件夹中的文件信息清单。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/list // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/folder/list @@ -62,18 +64,18 @@ func (r *Mock) UnMockDriveGetDriveFileList() { // GetDriveFileListReq ... type GetDriveFileListReq struct { - PageSize *int64 `query:"page_size" json:"-"` // 分页大小, 示例值: 50, 最大值: `200` + PageSize *int64 `query:"page_size" json:"-"` // 指定每页显示的数据项的数量。若获取根目录下的清单, 将返回全部数据, 不支持分页, 示例值: 50, 最大值: `200` PageToken *string `query:"page_token" json:"-"` // 分页标记, 第一次请求不填, 表示从头开始遍历;分页查询结果还有更多项时会同时返回新的 page_token, 下次遍历可采用该 page_token 获取查询结果, 示例值: MTY1NTA3MTA1OXw3MTA4NDc2MDc1NzkyOTI0Nabcef - FolderToken *string `query:"folder_token" json:"-"` // 文件夹的token(若不填写该参数或填写空字符串, 则默认获取用户云空间下的清单, 且不支持分页), 示例值: fldbcO1UuPz8VwnpPx5a9abcef - OrderBy *string `query:"order_by" json:"-"` // 排序规则, 示例值: EditedTime, 可选值有: EditedTime: 编辑时间排序, CreatedTime: 创建时间排序, 默认值: `EditedTime` - Direction *string `query:"direction" json:"-"` // 升序降序, 示例值: DESC, 可选值有: ASC: 升序, DESC: 降序, 默认值: `DESC` + FolderToken *string `query:"folder_token" json:"-"` // 文件夹的 token。不填写或填空字符串, 将获取用户云空间根目录下的清单, 且不支持分页。了解如何获取文件夹 token, 参考[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview), 示例值: fldbcO1UuPz8VwnpPx5a9abcef + OrderBy *string `query:"order_by" json:"-"` // 定义清单中文件的排序方式, 示例值: EditedTime, 可选值有: EditedTime: 按编辑时间排序, CreatedTime: 按创建时间排序, 默认值: `EditedTime` + Direction *string `query:"direction" json:"-"` // 定义清单中文件的排序规则, 示例值: DESC, 可选值有: ASC: 按升序排序, DESC: 按降序排序, 默认值: `DESC` UserIDType *IDType `query:"user_id_type" json:"-"` // 用户 ID 类型, 示例值: open_id, 可选值有: open_id: 标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。[了解更多: 如何获取 Open ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-openid), union_id: 标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的, 在不同开发商下的应用中的 Union ID 是不同的。通过 Union ID, 应用开发商可以把同个用户在多个应用中的身份关联起来。[了解更多: 如何获取 Union ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-union-id), user_id: 标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内, 一个用户的 User ID 在所有应用(包括商店应用)中都保持一致。User ID 主要用于在不同的应用间打通用户数据。[了解更多: 如何获取 User ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id), 默认值: `open_id`, 当值为 `user_id`, 字段权限要求: 获取用户 user ID } // GetDriveFileListResp ... type GetDriveFileListResp struct { - Files []*GetDriveFileListRespFile `json:"files,omitempty"` // 文件夹清单列表 - NextPageToken string `json:"next_page_token,omitempty"` // 分页标记, 当 has_more 为 true 时, 会同时返回下一次遍历的page_token, 否则则不返回 + Files []*GetDriveFileListRespFile `json:"files,omitempty"` // 文件夹中的文件清单列表 + NextPageToken string `json:"next_page_token,omitempty"` // 分页标记, 当 has_more 为 true 时, 会同时返回下一次遍历的 page_token, 否则不返回。 HasMore bool `json:"has_more,omitempty"` // 是否还有更多项 } @@ -81,19 +83,19 @@ type GetDriveFileListResp struct { type GetDriveFileListRespFile struct { Token string `json:"token,omitempty"` // 文件标识 Name string `json:"name,omitempty"` // 文件名 - Type string `json:"type,omitempty"` // 文件类型, 可选值有: `doc`: 旧版文档, `sheet`: 表格, `mindnote`: 思维导图, `bitable`: 多维表格, `file`: 文件, `docx`: 新版文档, `folder`: 文件夹, `shortcut`: 快捷方式 + Type string `json:"type,omitempty"` // 文件类型。可选值有: `doc`: 旧版文档, `sheet`: 表格, `mindnote`: 思维导图, `bitable`: 多维表格, `file`: 文件, `docx`: 新版文档, `folder`: 文件夹, `shortcut`: 快捷方式(暂不支持) ParentToken string `json:"parent_token,omitempty"` // 父文件夹标识 - URL string `json:"url,omitempty"` // 在浏览器中查看的链接 - ShortcutInfo *GetDriveFileListRespFileShortcutInfo `json:"shortcut_info,omitempty"` // 快捷方式文件信息 - CreatedTime string `json:"created_time,omitempty"` // 文件创建时间 - ModifiedTime string `json:"modified_time,omitempty"` // 文件最近修改时间 - OwnerID string `json:"owner_id,omitempty"` // 文件所有者 + URL string `json:"url,omitempty"` // 文件在浏览器中的 URL 链接 + ShortcutInfo *GetDriveFileListRespFileShortcutInfo `json:"shortcut_info,omitempty"` // 快捷方式类型文件的信息(暂不支持) + CreatedTime string `json:"created_time,omitempty"` // 文件创建时间, 秒级时间戳 + ModifiedTime string `json:"modified_time,omitempty"` // 文件最近修改时间, 秒级时间戳 + OwnerID string `json:"owner_id,omitempty"` // 文件所有者的 ID。ID 类型由查询参数中的 `user_id_type` 决定 } // GetDriveFileListRespFileShortcutInfo ... type GetDriveFileListRespFileShortcutInfo struct { - TargetType string `json:"target_type,omitempty"` // 快捷方式指向的原文件类型, 可选值有: `doc`: 旧版文档, `sheet`: 表格, `mindnote`: 思维导图, `bitable`: 多维表格, `file`: 文件, `docx`: 新版文档 - TargetToken string `json:"target_token,omitempty"` // 快捷方式指向的原文件token + TargetType string `json:"target_type,omitempty"` // 快捷方式指向的原文件类型, 包括: `doc`: 旧版文档, `sheet`: 表格, `mindnote`: 思维导图, `bitable`: 多维表格, `file`: 文件, `docx`: 新版文档 + TargetToken string `json:"target_token,omitempty"` // 快捷方式指向的原文件 token } // getDriveFileListResp ... diff --git a/api_drive_file_meta_get.go b/api_drive_file_meta_get.go index 67d4c7a3..ed5dc7a9 100644 --- a/api_drive_file_meta_get.go +++ b/api_drive_file_meta_get.go @@ -21,7 +21,7 @@ import ( "context" ) -// GetDriveFileMeta 根据 Token 获取各类文档的元数据。 +// GetDriveFileMeta 该接口用于根据文件 token 获取其元数据, 包括标题、所有者、创建时间、密级、访问链接等数据。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/meta/batch_query // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/file/batch_query @@ -60,38 +60,38 @@ func (r *Mock) UnMockDriveGetDriveFileMeta() { // GetDriveFileMetaReq ... type GetDriveFileMetaReq struct { UserIDType *IDType `query:"user_id_type" json:"-"` // 用户 ID 类型, 示例值: open_id, 可选值有: open_id: 标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。[了解更多: 如何获取 Open ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-openid), union_id: 标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的, 在不同开发商下的应用中的 Union ID 是不同的。通过 Union ID, 应用开发商可以把同个用户在多个应用中的身份关联起来。[了解更多: 如何获取 Union ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-union-id), user_id: 标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内, 一个用户的 User ID 在所有应用(包括商店应用)中都保持一致。User ID 主要用于在不同的应用间打通用户数据。[了解更多: 如何获取 User ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id), 默认值: `open_id`, 当值为 `user_id`, 字段权限要求: 获取用户 user ID - RequestDocs []*GetDriveFileMetaReqRequestDocs `json:"request_docs,omitempty"` // 请求文档, 一次不超过200个, 长度范围: `1` ~ `200` - WithURL *bool `json:"with_url,omitempty"` // 是否获取文档链接, 示例值: false + RequestDocs []*GetDriveFileMetaReqRequestDocs `json:"request_docs,omitempty"` // 请求的文件的 token 和类型。一次请求中不可超过 200 个, 长度范围: `1` ~ `200` + WithURL *bool `json:"with_url,omitempty"` // 是否获取文件的访问链接, 示例值: false } // GetDriveFileMetaReqRequestDocs ... type GetDriveFileMetaReqRequestDocs struct { - DocToken string `json:"doc_token,omitempty"` // 文件的 token, 获取方式见[如何获取云文档资源相关 token](https://open.feishu.cn/document/ukTMukTMukTM/uczNzUjL3czM14yN3MTN#08bb5df6), 示例值: "doccnfYZzTlvXqZIGTdAHKabcef" - DocType string `json:"doc_type,omitempty"` // 文件类型, 示例值: "doc", 可选值有: doc: 飞书文档, sheet: 飞书电子表格, bitable: 飞书多维表格, mindnote: 飞书思维笔记, file: 飞书文件, wiki: 飞书wiki, docx: 飞书新版文档, folder: 飞书文件夹 + DocToken string `json:"doc_token,omitempty"` // 文件的 token, 获取方式见[文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/file-overview), 示例值: "doccnfYZzTlvXqZIGTdAHKabcef" + DocType string `json:"doc_type,omitempty"` // 文件的类型, 示例值: "doc", 可选值有: doc: 飞书文档, sheet: 飞书电子表格, bitable: 飞书多维表格, mindnote: 飞书思维笔记, file: 飞书文件, wiki: 飞书知识库, docx: 飞书新版文档, folder: 飞书文件夹, synced_block: 文档同步块(灰度中) } // GetDriveFileMetaResp ... type GetDriveFileMetaResp struct { - Metas []*GetDriveFileMetaRespMeta `json:"metas,omitempty"` // 文档元数据列表 - FailedList []*GetDriveFileMetaRespFailed `json:"failed_list,omitempty"` // 无法获取元数据的文档列表 + Metas []*GetDriveFileMetaRespMeta `json:"metas,omitempty"` // 文件的元数据列表 + FailedList []*GetDriveFileMetaRespFailed `json:"failed_list,omitempty"` // 获取元数据失败的文档 token 列表 } // GetDriveFileMetaRespFailed ... type GetDriveFileMetaRespFailed struct { Token string `json:"token,omitempty"` // 获取元数据失败的文档token - Code int64 `json:"code,omitempty"` // 获取元数据失败的错误码, 可选值有: 970002: Unsupported doc-type, 970003: No permission to access meta, 970005: Record not found (不存在或者已被删除) + Code int64 `json:"code,omitempty"` // 获取元数据失败的错误码, 可选值有: 970002: 文档类型不支持, 970003: 当前应用或用户没有获取该文件元数据的权限, 970005: 文件 token 和 doc_type 不匹配或该文件不存在 } // GetDriveFileMetaRespMeta ... type GetDriveFileMetaRespMeta struct { - DocToken string `json:"doc_token,omitempty"` // 文件token - DocType string `json:"doc_type,omitempty"` // 文件类型 + DocToken string `json:"doc_token,omitempty"` // 文件的 token + DocType string `json:"doc_type,omitempty"` // 文件的类型 Title string `json:"title,omitempty"` // 标题 - OwnerID string `json:"owner_id,omitempty"` // 文件所有者 - CreateTime string `json:"create_time,omitempty"` // 创建时间(Unix时间戳) + OwnerID string `json:"owner_id,omitempty"` // 文件的所有者 + CreateTime string `json:"create_time,omitempty"` // 创建时间。UNIX 时间戳, 单位为秒 LatestModifyUser string `json:"latest_modify_user,omitempty"` // 最后编辑者 - LatestModifyTime string `json:"latest_modify_time,omitempty"` // 最后编辑时间(Unix时间戳) - URL string `json:"url,omitempty"` // 文档链接 + LatestModifyTime string `json:"latest_modify_time,omitempty"` // 最后编辑时间。UNIX 时间戳, 单位为秒 + URL string `json:"url,omitempty"` // 文档访问链接 SecLabelName string `json:"sec_label_name,omitempty"` // 文档密级标签名称, 字段权限要求: 获取文档密级标签名称 } diff --git a/api_drive_file_move.go b/api_drive_file_move.go index 8ab775e4..a2575af0 100644 --- a/api_drive_file_move.go +++ b/api_drive_file_move.go @@ -23,6 +23,10 @@ import ( // MoveDriveFile 将文件或者文件夹移动到用户云空间的其他位置。 // +// 如果你移动的是文件夹, 该接口将异步执行, 同时返回该异步任务的 ID。你可使用[查询异步任务状态](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/task_check)接口查询任务执行的状态。 +// 使用限制: +// 该接口不支持并发调用, 且调用频率上限为 5 QPS 且 10000次/天。否则会返回 1061045 错误码, 可通过稍后重试解决。 +// // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/move // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/file/move func (r *DriveService) MoveDriveFile(ctx context.Context, request *MoveDriveFileReq, options ...MethodOptionFunc) (*MoveDriveFileResp, *Response, error) { @@ -59,14 +63,14 @@ func (r *Mock) UnMockDriveMoveDriveFile() { // MoveDriveFileReq ... type MoveDriveFileReq struct { - FileToken string `path:"file_token" json:"-"` // 需要移动的文件token, 示例值: "boxcnrHpsg1QDqXAAAyachabcef" - Type *string `json:"type,omitempty"` // 文件类型, 如果该值为空或者与文件实际类型不匹配, 接口会返回失败, 示例值: "file", 可选值有: file: 普通文件类型, docx: 新版文档类型, bitable: 多维表格类型, doc: 文档类型, sheet: 电子表格类型, mindnote: 思维笔记类型, folder: 文件夹类型, slides: 幻灯片类型 - FolderToken *string `json:"folder_token,omitempty"` // 目标文件夹token, 示例值: "fldbcO1UuPz8VwnpPx5a92abcef" + FileToken string `path:"file_token" json:"-"` // 需要移动的文件或文件夹 token, 了解如何获取文件 token, 参考[文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/file-overview), 了解如何获取文件夹 token, 参考[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview), 示例值: "boxcnrHpsg1QDqXAAAyachabcef" + Type *string `json:"type,omitempty"` // 文件类型。该参数为必填, 请忽略左侧必填列的“否”。如果该值为空或者与文件实际类型不匹配, 接口会返回失败, 示例值: "file", 可选值有: file: 普通文件类型, docx: 新版文档类型, bitable: 多维表格类型, doc: 文档类型, sheet: 电子表格类型, mindnote: 思维笔记类型, folder: 文件夹类型, slides: 幻灯片类型 + FolderToken *string `json:"folder_token,omitempty"` // 目标文件夹的 token。了解如何获取文件夹 token, 参考[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview), 示例值: "fldbcO1UuPz8VwnpPx5a92abcef" } // MoveDriveFileResp ... type MoveDriveFileResp struct { - TaskID string `json:"task_id,omitempty"` // 异步任务id, 移动文件夹时返回 + TaskID string `json:"task_id,omitempty"` // 异步任务 ID, 移动文件夹时返回。你可继续使用[查询异步任务状态](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/task_check)接口查询任务执行状态 } // moveDriveFileResp ... diff --git a/api_drive_file_search.go b/api_drive_file_search.go index c72d8472..6c8837c6 100644 --- a/api_drive_file_search.go +++ b/api_drive_file_search.go @@ -21,7 +21,7 @@ import ( "context" ) -// SearchDriveFile 该接口用于根据搜索条件进行文档搜索。 +// SearchDriveFile 该接口用于根据搜索关键词(search_key)对当前用户可见的文件进行搜索。 // // doc: https://open.feishu.cn/document/ukTMukTMukTM/ugDM4UjL4ADO14COwgTN // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/search/document-search @@ -32,13 +32,14 @@ func (r *DriveService) SearchDriveFile(ctx context.Context, request *SearchDrive } req := &RawRequestReq{ - Scope: "Drive", - API: "SearchDriveFile", - Method: "POST", - URL: r.cli.openBaseURL + "/open-apis/suite/docs-api/search/object", - Body: request, - MethodOption: newMethodOption(options), - NeedUserAccessToken: true, + Scope: "Drive", + API: "SearchDriveFile", + Method: "POST", + URL: r.cli.openBaseURL + "/open-apis/suite/docs-api/search/object", + Body: request, + MethodOption: newMethodOption(options), + NeedTenantAccessToken: true, + NeedUserAccessToken: true, } resp := new(searchDriveFileResp) @@ -58,33 +59,32 @@ func (r *Mock) UnMockDriveSearchDriveFile() { // SearchDriveFileReq ... type SearchDriveFileReq struct { - SearchKey string `json:"search_key,omitempty"` // 搜索关键字 - Count *int64 `json:"count,omitempty"` // 搜索返回数量, 0 <= count <= 50 - Offset *int64 `json:"offset,omitempty"` // 搜索偏移位, offset >= 0, offset + count < 200 - OwnerIDs []string `json:"owner_ids,omitempty"` // 文档所有者的userid - ChatIDs []string `json:"chat_ids,omitempty"` // 文档所在群的chatid - DocsTypes []string `json:"docs_types,omitempty"` // 文档类型, 支持: "doc", "sheet", "slide", "bitable", "mindnote", "file" + SearchKey string `json:"search_key,omitempty"` // 指定搜索的关键字 + Count *int64 `json:"count,omitempty"` // 指定搜索返回的文件数量。取值范围为 [0, 50]。 + Offset *int64 `json:"offset,omitempty"` // 指定搜索的偏移量, 该参数最小为 0, 即不偏移。该参数的值与返回的文件数量之和不得小于或等于 200(即 offset + count < 200)。 + OwnerIDs []string `json:"owner_ids,omitempty"` // 文件所有者的用户 ID。了解更多, 参考[如何获取 User ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id)。 + ChatIDs []string `json:"chat_ids,omitempty"` // 文件所在群的 ID。了解更多, 参考[群 ID 说明](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat-id-description)。 + DocsTypes []string `json:"docs_types,omitempty"` // 文件类型, 支持以下枚举: `doc`: 旧版文档, `sheet`: 电子表格, `slide`: 幻灯片, `bitable`: 多维表格, `mindnote`: 思维笔记, `file`: 文件 } // SearchDriveFileResp ... type SearchDriveFileResp struct { - DocsEntities []*SearchDriveFileRespDocsEntity `json:"docs_entities,omitempty"` // 搜索匹配文档列表 - HasMore bool `json:"has_more,omitempty"` // 搜索偏移位结果列表后是否还有数据 - Total int64 `json:"total,omitempty"` // 搜索匹配文档总数量 + DocsEntities []*SearchDriveFileRespDocsEntity `json:"docs_entities,omitempty"` // 包含搜索关键词的文件列表。 + HasMore bool `json:"has_more,omitempty"` // 结果列表后是否还有数据。 + Total int64 `json:"total,omitempty"` // 包含搜索关键词的文件总数量。 } // SearchDriveFileRespDocsEntity ... type SearchDriveFileRespDocsEntity struct { - DocsToken string `json:"docs_token,omitempty"` // 文档token - DocsType string `json:"docs_type,omitempty"` // 文档类型 - Title string `json:"title,omitempty"` // 标题 - OwnerID string `json:"owner_id,omitempty"` // 文件所有者 + DocsToken string `json:"docs_token,omitempty"` // 文件的 token。 + DocsType string `json:"docs_type,omitempty"` // 文件的类型。 + Title string `json:"title,omitempty"` // 文件的标题。 + OwnerID []string `json:"owner_id,omitempty"` // 文件的所有者。 } // searchDriveFileResp ... type searchDriveFileResp struct { - Code int64 `json:"code,omitempty"` - Msg string `json:"msg,omitempty"` - Data *SearchDriveFileResp `json:"data,omitempty"` - Error *ErrorDetail `json:"error,omitempty"` + Code int64 `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + Data *SearchDriveFileResp `json:"data,omitempty"` } diff --git a/api_drive_file_shortcut_create.go b/api_drive_file_shortcut_create.go index 3d27f7e4..1756e5a6 100644 --- a/api_drive_file_shortcut_create.go +++ b/api_drive_file_shortcut_create.go @@ -21,7 +21,10 @@ import ( "context" ) -// CreateDriveFileShortcut 创建指定文件的快捷方式到云空间的其它文件夹中。此接口不支持在同一个文件夹下并发创建多个快捷方式。 +// CreateDriveFileShortcut 创建指定文件的快捷方式到云空间的其它文件夹中。 +// +// 使用限制: +// 该接口不支持并发调用, 且调用频率上限为 5 QPS, 10000 次/天。否则会返回 1061045 错误码, 可通过稍后重试解决。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/create_shortcut // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/file/create_shortcut @@ -60,14 +63,14 @@ func (r *Mock) UnMockDriveCreateDriveFileShortcut() { // CreateDriveFileShortcutReq ... type CreateDriveFileShortcutReq struct { UserIDType *IDType `query:"user_id_type" json:"-"` // 用户 ID 类型, 示例值: open_id, 可选值有: open_id: 标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。[了解更多: 如何获取 Open ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-openid), union_id: 标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的, 在不同开发商下的应用中的 Union ID 是不同的。通过 Union ID, 应用开发商可以把同个用户在多个应用中的身份关联起来。[了解更多: 如何获取 Union ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-union-id), user_id: 标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内, 一个用户的 User ID 在所有应用(包括商店应用)中都保持一致。User ID 主要用于在不同的应用间打通用户数据。[了解更多: 如何获取 User ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id), 默认值: `open_id`, 当值为 `user_id`, 字段权限要求: 获取用户 user ID - ParentToken string `json:"parent_token,omitempty"` // 目标父文件夹`Token`, 获取方式见[如何获取云文档资源相关 token](https://open.feishu.cn/document/ukTMukTMukTM/uczNzUjL3czM14yN3MTN#08bb5df6), 示例值: "fldbc5qgwyQnO0uedNllWuF3fAd" - ReferEntity *CreateDriveFileShortcutReqReferEntity `json:"refer_entity,omitempty"` // 源文档的信息 + ParentToken string `json:"parent_token,omitempty"` // 目标父文件夹的 token, 获取方式见[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview), 示例值: "fldbc5qgwyQnO0uedNllWuabcef" + ReferEntity *CreateDriveFileShortcutReqReferEntity `json:"refer_entity,omitempty"` // 源文件的信息 } // CreateDriveFileShortcutReqReferEntity ... type CreateDriveFileShortcutReqReferEntity struct { - ReferToken string `json:"refer_token,omitempty"` // 源文档的`Token`, 示例值: "doxbcGvhSVN0R6octqPwAEYNfFb" - ReferType string `json:"refer_type,omitempty"` // 源文档的类型, 示例值: "docx", 可选值有: file: 文件, docx: 新版文档, bitable: 多维表格, doc: 旧版文档, sheet: 电子表格, mindnote: 思维笔记, slides: 幻灯片类型 + ReferToken string `json:"refer_token,omitempty"` // 源文件的 token。获取方式见[文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/file-overview), 示例值: "doxbcGvhSVN0R6octqPwAEabcef" + ReferType string `json:"refer_type,omitempty"` // 源文件的类型, 示例值: "docx", 可选值有: file: 文件, docx: 新版文档, bitable: 多维表格, doc: 旧版文档, sheet: 电子表格, mindnote: 思维笔记, slides: 幻灯片类型 } // CreateDriveFileShortcutResp ... @@ -77,12 +80,12 @@ type CreateDriveFileShortcutResp struct { // CreateDriveFileShortcutRespSuccShortcutNode ... type CreateDriveFileShortcutRespSuccShortcutNode struct { - Token string `json:"token,omitempty"` // 文件`Token` + Token string `json:"token,omitempty"` // 文件的 token Name string `json:"name,omitempty"` // 文件名 Type string `json:"type,omitempty"` // 文件类型, 可选值参照请求体的`refer_type` - ParentToken string `json:"parent_token,omitempty"` // 父文件夹`Token` + ParentToken string `json:"parent_token,omitempty"` // 父文件夹的 token URL string `json:"url,omitempty"` // 访问链接 - ShortcutInfo *CreateDriveFileShortcutRespSuccShortcutNodeShortcutInfo `json:"shortcut_info,omitempty"` // 快捷方式源文件信息 + ShortcutInfo *CreateDriveFileShortcutRespSuccShortcutNodeShortcutInfo `json:"shortcut_info,omitempty"` // 快捷方式的源文件信息 CreatedTime string `json:"created_time,omitempty"` // 文件创建时间 ModifiedTime string `json:"modified_time,omitempty"` // 文件最近修改时间 OwnerID string `json:"owner_id,omitempty"` // 文件所有者 @@ -90,8 +93,8 @@ type CreateDriveFileShortcutRespSuccShortcutNode struct { // CreateDriveFileShortcutRespSuccShortcutNodeShortcutInfo ... type CreateDriveFileShortcutRespSuccShortcutNodeShortcutInfo struct { - TargetType string `json:"target_type,omitempty"` // 快捷方式指向的源文件类型, 可选值参照请求体的`refer_type` - TargetToken string `json:"target_token,omitempty"` // 快捷方式指向的源文件`Token` + TargetType string `json:"target_type,omitempty"` // 快捷方式对应的源文件类型, 可选值参照请求体的 `refer_type` + TargetToken string `json:"target_token,omitempty"` // 快捷方式指向的源文件 token } // createDriveFileShortcutResp ... diff --git a/api_drive_file_statistics_get.go b/api_drive_file_statistics_get.go index 0729ea5d..88db689c 100644 --- a/api_drive_file_statistics_get.go +++ b/api_drive_file_statistics_get.go @@ -21,7 +21,7 @@ import ( "context" ) -// GetDriveFileStatistics 此接口用于获取文档统计信息, 包括文档阅读人数、次数和点赞数。 +// GetDriveFileStatistics 此接口用于获取各类文件的流量统计信息和互动信息, 包括阅读人数、阅读次数和点赞数。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file-statistics/get // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/file/get @@ -59,8 +59,8 @@ func (r *Mock) UnMockDriveGetDriveFileStatistics() { // GetDriveFileStatisticsReq ... type GetDriveFileStatisticsReq struct { - FileToken string `path:"file_token" json:"-"` // 文档 token, 示例值: "doccnfYZzTlvXqZIGTdAHKabcef" - FileType FileType `query:"file_type" json:"-"` // 文档类型, 示例值: doc, 可选值有: doc: 旧版文档, sheet: 电子表格, mindnote: 思维笔记, bitable: 多维表格, wiki: 知识库文档, file: 文件, docx: 新版文档 + FileToken string `path:"file_token" json:"-"` // 文件 token。了解如何获取文件 token, 参考[文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/file-overview), 示例值: "doccnfYZzTlvXqZIGTdAHKabcef" + FileType FileType `query:"file_type" json:"-"` // 文件类型, 示例值: doc, 可选值有: doc: 旧版文档, sheet: 电子表格, mindnote: 思维笔记, bitable: 多维表格, wiki: 知识库文档, file: 文件, docx: 新版文档 } // GetDriveFileStatisticsResp ... @@ -73,9 +73,9 @@ type GetDriveFileStatisticsResp struct { // GetDriveFileStatisticsRespStatistics ... type GetDriveFileStatisticsRespStatistics struct { Uv int64 `json:"uv,omitempty"` // 文档历史访问人数, 同一用户(user_id)多次访问按一次计算。 - Pv int64 `json:"pv,omitempty"` // 文档历史访问次数, 同一用户(user_id)多次访问按多次计算。(注: 同一用户相邻两次访问间隔在半小时内视为一次访问) - LikeCount int64 `json:"like_count,omitempty"` // 文档历史点赞总数, 若对应的文档类型不支持点赞, 返回 -1 - Timestamp int64 `json:"timestamp,omitempty"` // 时间戳(秒) + Pv int64 `json:"pv,omitempty"` // 文档历史访问次数, 同一用户(user_id)多次访问按多次计算, 但同一用户在间隔在半小时内访问两次视为一次访问 + LikeCount int64 `json:"like_count,omitempty"` // 文档历史点赞总数。`-1` 表示对应的文档类型不支持点赞 + Timestamp int64 `json:"timestamp,omitempty"` // 时间戳(单位: 秒) UvToday int64 `json:"uv_today,omitempty"` // 今日新增文档访问人数 PvToday int64 `json:"pv_today,omitempty"` // 今日新增文档访问次数 LikeCountToday int64 `json:"like_count_today,omitempty"` // 今日新增文档点赞数 diff --git a/api_drive_file_task_get.go b/api_drive_file_task_get.go index 458cbec2..31b2262a 100644 --- a/api_drive_file_task_get.go +++ b/api_drive_file_task_get.go @@ -21,7 +21,7 @@ import ( "context" ) -// GetDriveFileTask 查询删除文件夹等异步任务的状态信息。 +// GetDriveFileTask 查询异步任务的状态信息。目前支持查询删除文件夹和移动文件夹的异步任务。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/task_check // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/file/async-task/task_check @@ -59,12 +59,12 @@ func (r *Mock) UnMockDriveGetDriveFileTask() { // GetDriveFileTaskReq ... type GetDriveFileTaskReq struct { - TaskID string `query:"task_id" json:"-"` // 文件相关异步任务id, 示例值: 12345 + TaskID string `query:"task_id" json:"-"` // 异步任务的 ID。目前支持查询删除文件夹和移动文件夹的异步任务。可通过调用[删除文件夹](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/delete)或[移动文件夹](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/move)获取任务 ID, 示例值: 7360595374803812356 } // GetDriveFileTaskResp ... type GetDriveFileTaskResp struct { - Status string `json:"status,omitempty"` // 异步任务的执行状态, 如果任务执行成功则返回success, 如果任务执行失败则返回fail, 如果任务还在执行中则返回process。 + Status string `json:"status,omitempty"` // 异步任务的执行状态。枚举值有: success: 任务执行成功, fail: 任务执行失败, process: 任务还在执行中 } // getDriveFileTaskResp ... diff --git a/api_drive_file_upload_finish.go b/api_drive_file_upload_finish.go index 32067ab7..caf0b032 100644 --- a/api_drive_file_upload_finish.go +++ b/api_drive_file_upload_finish.go @@ -21,9 +21,10 @@ import ( "context" ) -// FinishUploadDriveFile 触发完成上传。 +// FinishUploadDriveFile 调用[上传分片](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/upload_part)接口将分片全部上传完毕后, 你需调用本接口触发完成上传。否则将上传失败。了解完整的上传文件流程, 参考[上传文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/multipart-upload-file-/introduction)。 // -// 该接口不支持太高的并发, 且调用频率上限为5QPS +// 使用限制: +// 该接口不支持并发调用, 且调用频率上限为 5 QPS, 10000 次/天。否则会返回 1061045 错误码, 可通过稍后重试解决。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/upload_finish // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/upload/multipart-upload-file-/upload_finish @@ -61,8 +62,8 @@ func (r *Mock) UnMockDriveFinishUploadDriveFile() { // FinishUploadDriveFileReq ... type FinishUploadDriveFileReq struct { - UploadID string `json:"upload_id,omitempty"` // 分片上传事务ID, 示例值: "7111211691345512356" - BlockNum int64 `json:"block_num,omitempty"` // 分片数量, 示例值: 1 + UploadID string `json:"upload_id,omitempty"` // 分片上传事务 ID。通过调用[分片上传文件-预上传](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/upload_prepare)接口获取, 示例值: "7111211691345512356" + BlockNum int64 `json:"block_num,omitempty"` // 分片的数量。通过调用[分片上传文件-预上传](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/upload_prepare)接口获取, 示例值: 1 } // FinishUploadDriveFileResp ... diff --git a/api_drive_file_upload_prepare.go b/api_drive_file_upload_prepare.go index 51785f9a..0c896b0a 100644 --- a/api_drive_file_upload_prepare.go +++ b/api_drive_file_upload_prepare.go @@ -21,10 +21,12 @@ import ( "context" ) -// PrepareUploadDriveFile 发送初始化请求获取上传事务ID和分块策略, 目前是以4MB大小进行定长分片。 +// PrepareUploadDriveFile 发送初始化请求, 以获取上传事务 ID 和分片策略, 为[上传分片](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/upload_part)做准备。平台固定以 4MB 的大小对文件进行分片。了解完整的上传文件流程, 参考[上传文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/multipart-upload-file-/introduction)。 // -// 你在24小时内可保存上传事务ID和上传进度, 以便可以恢复上传 -// 该接口不支持太高的并发, 且调用频率上限为5QPS +// 注意事项: +// 上传事务 ID 和上传进度在 24 小时内有效。请及时保存和恢复上传。 +// 使用限制: +// 该接口不支持并发调用, 且调用频率上限为 5 QPS, 10000 次/天。否则会返回 1061045 错误码, 可通过稍后重试解决。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/upload_prepare // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/upload/multipart-upload-file-/upload_prepare @@ -62,17 +64,17 @@ func (r *Mock) UnMockDrivePrepareUploadDriveFile() { // PrepareUploadDriveFileReq ... type PrepareUploadDriveFileReq struct { - FileName string `json:"file_name,omitempty"` // 文件名, 示例值: "test.txt", 最大长度: `250` 字符 - ParentType string `json:"parent_type,omitempty"` // 上传点类型, 示例值: "explorer", 可选值有: explorer: 云空间。 - ParentNode string `json:"parent_node,omitempty"` // 文件夹的token, 示例值: "fldbcO1UuPz8VwnpPx5a92abcef" - Size int64 `json:"size,omitempty"` // 文件大小, 示例值: 1024, 最小值: `0` + FileName string `json:"file_name,omitempty"` // 文件的名称, 示例值: "test.txt", 最大长度: `250` 字符 + ParentType string `json:"parent_type,omitempty"` // 上传点的类型。取固定值 explorer, 表示将文件上传至云空间中, 示例值: "explorer", 可选值有: explorer: 云空间 + ParentNode string `json:"parent_node,omitempty"` // 云空间中文件夹的 token。了解如何获取文件夹 token, 参考[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview), 示例值: "fldbcO1UuPz8VwnpPx5a92abcef" + Size int64 `json:"size,omitempty"` // 文件的大小, 单位为字节, 示例值: 1024, 最小值: `0` } // PrepareUploadDriveFileResp ... type PrepareUploadDriveFileResp struct { - UploadID string `json:"upload_id,omitempty"` // 分片上传事务ID + UploadID string `json:"upload_id,omitempty"` // 分片上传事务 ID BlockSize int64 `json:"block_size,omitempty"` // 分片大小策略 - BlockNum int64 `json:"block_num,omitempty"` // 分片数量 + BlockNum int64 `json:"block_num,omitempty"` // 分片的数量 } // prepareUploadDriveFileResp ... diff --git a/api_drive_file_view_record_list.go b/api_drive_file_view_record_list.go index 58e11127..90283a14 100644 --- a/api_drive_file_view_record_list.go +++ b/api_drive_file_view_record_list.go @@ -21,7 +21,7 @@ import ( "context" ) -// GetDriveFileViewRecordList 获取文档的历史访问记录 +// GetDriveFileViewRecordList 获取文档、电子表格、多维表格等文件的历史访问记录, 包括访问者的 ID、姓名、头像和最近访问时间。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file-view_record/list // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/file-view_record/list @@ -59,11 +59,11 @@ func (r *Mock) UnMockDriveGetDriveFileViewRecordList() { // GetDriveFileViewRecordListReq ... type GetDriveFileViewRecordListReq struct { - FileToken string `path:"file_token" json:"-"` // 文档 token, 示例值: "XIHSdYSI7oMEU1xrsnxc8fabcef" + FileToken string `path:"file_token" json:"-"` // 文件 token。获取方式参考[文件概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/file-overview), 示例值: "XIHSdYSI7oMEU1xrsnxc8fabcef" PageSize int64 `query:"page_size" json:"-"` // 分页大小, 示例值: 10, 取值范围: `1` ~ `50` PageToken *string `query:"page_token" json:"-"` // 分页标记, 第一次请求不填, 表示从头开始遍历;分页查询结果还有更多项时会同时返回新的 page_token, 下次遍历可采用该 page_token 获取查询结果, 示例值: 1674037112--7189934631754563585 - FileType FileType `query:"file_type" json:"-"` // 文档类型, 示例值: docx, 可选值有: doc: 旧版文档, docx: 新版文档, sheet: 电子表格, bitable: 多维表格, mindnote: 思维笔记, wiki: 知识库文档, file: 文件 - ViewerIDType *IDType `query:"viewer_id_type" json:"-"` // 此次调用中使用的访问者 ID 的类型, 当值为`user_id`时, 字段权限要求: 获取用户 user ID, 示例值: open_id, 可选值有: user_id: 标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内, 一个用户的 User ID 在所有应用(包括商店应用)中都保持一致。User ID 主要用于在不同的应用间打通用户数据。[了解更多: 如何获取 User ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id), union_id: 标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的, 在不同开发商下的应用中的 Union ID 是不同的。通过 Union ID, 应用开发商可以把同个用户在多个应用中的身份关联起来。[了解更多: 如何获取 Union ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-union-id), open_id: 标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。[了解更多: 如何获取 Open ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-openid), 默认值: `open_id` + FileType FileType `query:"file_type" json:"-"` // 文件类型, 示例值: docx, 可选值有: doc: 旧版文档, docx: 新版文档, sheet: 电子表格, bitable: 多维表格, mindnote: 思维笔记, wiki: 知识库文档, file: 文件 + ViewerIDType *IDType `query:"viewer_id_type" json:"-"` // 返回的访问者 ID 的类型, 当值为`user_id`时, 字段权限要求: 获取用户 user ID, 示例值: open_id, 可选值有: user_id: 标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内, 一个用户的 User ID 在所有应用(包括商店应用)中都保持一致。User ID 主要用于在不同的应用间打通用户数据。[了解更多: 如何获取 User ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id), union_id: 标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的, 在不同开发商下的应用中的 Union ID 是不同的。通过 Union ID, 应用开发商可以把同个用户在多个应用中的身份关联起来。[了解更多: 如何获取 Union ID?](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-union-id), open_id: 标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。[了解更多: 如何获取 Open ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-openid), 默认值: `open_id` } // GetDriveFileViewRecordListResp ... @@ -76,9 +76,9 @@ type GetDriveFileViewRecordListResp struct { // GetDriveFileViewRecordListRespItem ... type GetDriveFileViewRecordListRespItem struct { ViewerID string `json:"viewer_id,omitempty"` // 访问者 ID - Name string `json:"name,omitempty"` // 访问者名称 - AvatarURL string `json:"avatar_url,omitempty"` // 访问者头像 URL - LastViewTime string `json:"last_view_time,omitempty"` // 最近访问时间, 秒级时间戳 + Name string `json:"name,omitempty"` // 访问者姓名 + AvatarURL string `json:"avatar_url,omitempty"` // 访问者头像的 URL + LastViewTime string `json:"last_view_time,omitempty"` // 最近访问时间。Unix 时间戳, 单位为秒。 } // getDriveFileViewRecordListResp ... diff --git a/api_drive_folder_create.go b/api_drive_folder_create.go index 05838958..3bdf8dbc 100644 --- a/api_drive_folder_create.go +++ b/api_drive_folder_create.go @@ -21,9 +21,12 @@ import ( "context" ) -// CreateDriveFolder 在用户云空间的指定文件夹中创建一个新的空文件夹。 +// CreateDriveFolder 该接口用于在用户云空间指定文件夹中创建一个空文件夹。 // -// 该接口不支持并发创建, 且调用频率上限为 5QPS 以及 10000次/天 +// 使用限制: +// - 该接口不支持并发创建, 且调用频率上限为 5QPS 以及 10000次/天。否则会返回 1061045 错误码, 可通过稍后重试解决。 +// - 云空间中根目录或文件夹的单层节点上限为 1500 个。超过此限制时, 接口将返回 1062507 错误码。可通过新建节点到其它节点中解决。 +// - 云空间中所有层级的节点总和的上限为 40 万个。 // // doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/create_folder // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/folder/create_folder @@ -61,14 +64,14 @@ func (r *Mock) UnMockDriveCreateDriveFolder() { // CreateDriveFolderReq ... type CreateDriveFolderReq struct { - Name string `json:"name,omitempty"` // 文件夹名称, 示例值: "New Folder" - FolderToken string `json:"folder_token,omitempty"` // 父文件夹token。如果需要创建到「我的空间」作为顶级文件夹, 请传入我的空间token[获取方式](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/get-root-folder-meta), 示例值: "fldbcO1UuPz8VwnpPx5a92abcef" + Name string `json:"name,omitempty"` // 文件夹名称, 示例值: "产品优化项目" + FolderToken string `json:"folder_token,omitempty"` // 父文件夹的 token。该参数非必填。参数为空时, 表示在根目录下创建文件夹。你可参考[获取文件夹中的文件清单](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file/list)获取某个文件夹的 token。了解更多, 参考[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview), 示例值: "fldbcO1UuPz8VwnpPx5a92abcef" } // CreateDriveFolderResp ... type CreateDriveFolderResp struct { - Token string `json:"token,omitempty"` // 创建文件夹的token - URL string `json:"url,omitempty"` // 创建文件夹的访问url + Token string `json:"token,omitempty"` // 新建的文件夹的 token + URL string `json:"url,omitempty"` // 新建的文件夹的 URL 链接 } // createDriveFolderResp ... diff --git a/api_drive_folder_meta.go b/api_drive_folder_meta.go index 0804be68..49a958a0 100644 --- a/api_drive_folder_meta.go +++ b/api_drive_folder_meta.go @@ -21,7 +21,7 @@ import ( "context" ) -// GetDriveFolderMeta 该接口用于根据 folderToken 获取该文件夹的元信息。 +// GetDriveFolderMeta 该接口用于根据文件夹 token 获取该文件夹的元数据, 包括文件夹的 ID、名称、创建者 ID 等。 // // doc: https://open.feishu.cn/document/ukTMukTMukTM/uAjNzUjLwYzM14CM2MTN // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/folder/get-folder-meta @@ -59,24 +59,23 @@ func (r *Mock) UnMockDriveGetDriveFolderMeta() { // GetDriveFolderMetaReq ... type GetDriveFolderMetaReq struct { - FolderToken string `path:"folderToken" json:"-"` // 文件夹 token, 获取方式见[如何获取云文档资源相关 token](https://open.feishu.cn/document/ukTMukTMukTM/uczNzUjL3czM14yN3MTN#08bb5df6) + FolderToken string `path:"folderToken" json:"-"` // 文件夹 token。了解如何获取文件夹 token, 参考[文件夹概述](https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/folder-overview)。 } // GetDriveFolderMetaResp ... type GetDriveFolderMetaResp struct { - ID string `json:"id,omitempty"` // 文件夹的 id + ID string `json:"id,omitempty"` // 文件夹的 ID Name string `json:"name,omitempty"` // 文件夹的标题 Token string `json:"token,omitempty"` // 文件夹的 token - CreateUid string `json:"createUid,omitempty"` // 文件夹的创建者 id - EditUid string `json:"editUid,omitempty"` // 文件夹的最后编辑者 id - ParentID string `json:"parentId,omitempty"` // 文件夹的上级目录 id - OwnUid string `json:"ownUid,omitempty"` // 文件夹为个人文件夹时, 为文件夹的所有者 id;文件夹为共享文件夹时, 为文件夹树id + CreateUid string `json:"createUid,omitempty"` // 文件夹的创建者 ID + EditUid string `json:"editUid,omitempty"` // 文件夹的最后编辑者 ID + ParentID string `json:"parentId,omitempty"` // 文件夹的上级目录 ID。“0” 表示当前文件夹无上级目录 + OwnUid string `json:"ownUid,omitempty"` // 文件夹为个人文件夹时, 为文件夹的所有者 ID;文件夹为共享文件夹时, 为文件夹树 ID } // getDriveFolderMetaResp ... type getDriveFolderMetaResp struct { - Code int64 `json:"code,omitempty"` - Msg string `json:"msg,omitempty"` - Data *GetDriveFolderMetaResp `json:"data,omitempty"` - Error *ErrorDetail `json:"error,omitempty"` + Code int64 `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + Data *GetDriveFolderMetaResp `json:"data,omitempty"` } diff --git a/api_drive_folder_root_meta.go b/api_drive_folder_root_meta.go index f0dfb0ab..2c6161cd 100644 --- a/api_drive_folder_root_meta.go +++ b/api_drive_folder_root_meta.go @@ -21,7 +21,7 @@ import ( "context" ) -// GetDriveRootFolderMeta 该接口用于获取 "我的空间" 的元信息 +// GetDriveRootFolderMeta 该接口用于获取用户“我的空间”(root folder)的元数据, 包括文件夹的 token、ID 和文件夹所有者的 ID。 // // doc: https://open.feishu.cn/document/ukTMukTMukTM/ugTNzUjL4UzM14CO1MTN/get-root-folder-meta // new doc: https://open.feishu.cn/document/server-docs/docs/drive-v1/folder/get-root-folder-meta @@ -64,14 +64,13 @@ type GetDriveRootFolderMetaReq struct { // GetDriveRootFolderMetaResp ... type GetDriveRootFolderMetaResp struct { Token string `json:"token,omitempty"` // 文件夹的 token - ID string `json:"id,omitempty"` // 文件夹的 id - UserID string `json:"user_id,omitempty"` // 文件夹的所有者 id + ID string `json:"id,omitempty"` // 文件夹的 ID + UserID string `json:"user_id,omitempty"` // 文件夹所有者的 ID } // getDriveRootFolderMetaResp ... type getDriveRootFolderMetaResp struct { - Code int64 `json:"code,omitempty"` - Msg string `json:"msg,omitempty"` - Data *GetDriveRootFolderMetaResp `json:"data,omitempty"` - Error *ErrorDetail `json:"error,omitempty"` + Code int64 `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + Data *GetDriveRootFolderMetaResp `json:"data,omitempty"` } diff --git a/api_drive_permission_member_list.go b/api_drive_permission_member_list.go index 51fc7145..508db705 100644 --- a/api_drive_permission_member_list.go +++ b/api_drive_permission_member_list.go @@ -78,8 +78,8 @@ type GetDriveMemberPermissionListRespItem struct { MemberID string `json:"member_id,omitempty"` // 协作者 ID, 与协作者 ID 类型需要对应 Perm string `json:"perm,omitempty"` // 协作者对应的权限角色, 可选值有: view: 可阅读角色, edit: 可编辑角色, full_access: 可管理角色 Type string `json:"type,omitempty"` // 协作者的类型, 可选值有: user: 用户, chat: 群组, department: 组织架构, group: 用户组, wiki_space_member: 知识库成员, 注意: 在知识库启用了成员分组功能后不支持该参数, wiki_space_viewer: 知识库可阅读成员, 注意: 仅在知识库启用了成员分组功能后才支持该参数, wiki_space_editor: 知识库可编辑成员, 注意: 仅在知识库启用了成员分组功能后才支持该参数 - Name string `json:"name,omitempty"` // 协作者的名字, 字段权限要求(满足任一): 以应用身份读取通讯录, 获取用户基本信息, 以应用身份访问通讯录, 读取通讯录 - Avatar string `json:"avatar,omitempty"` // 协作者的头像, 字段权限要求(满足任一): 以应用身份读取通讯录, 获取用户基本信息, 以应用身份访问通讯录, 读取通讯录 + Name string `json:"name,omitempty"` // 协作者的名字, 字段权限要求(满足任一): 获取用户基本信息, 以应用身份访问通讯录, 读取通讯录, 以应用身份读取通讯录 + Avatar string `json:"avatar,omitempty"` // 协作者的头像, 字段权限要求(满足任一): 获取用户基本信息, 以应用身份访问通讯录, 读取通讯录, 以应用身份读取通讯录 ExternalLabel bool `json:"external_label,omitempty"` // 协作者的外部标签 } diff --git a/api_event_callback_module.go b/api_event_callback_module.go index d2124254..3e0cdbe1 100644 --- a/api_event_callback_module.go +++ b/api_event_callback_module.go @@ -100,7 +100,10 @@ const ( EventTypeV2CorehrJobDataEmployedV1 EventType = "corehr.job_data.employed_v1" EventTypeV2CorehrJobDeletedV1 EventType = "corehr.job.deleted_v1" EventTypeV2CorehrJobUpdatedV1 EventType = "corehr.job.updated_v1" + EventTypeV2CorehrOffboardingChecklistUpdatedV2 EventType = "corehr.offboarding.checklist_updated_v2" + EventTypeV2CorehrOffboardingStatusUpdatedV2 EventType = "corehr.offboarding.status_updated_v2" EventTypeV2CorehrOffboardingUpdatedV1 EventType = "corehr.offboarding.updated_v1" + EventTypeV2CorehrOffboardingUpdatedV2 EventType = "corehr.offboarding.updated_v2" EventTypeV2CorehrOrgRoleAuthorizationUpdatedV1 EventType = "corehr.org_role_authorization.updated_v1" EventTypeV2CorehrPersonCreatedV1 EventType = "corehr.person.created_v1" EventTypeV2CorehrPersonDeletedV1 EventType = "corehr.person.deleted_v1" @@ -253,7 +256,10 @@ type eventHandler struct { eventV2CorehrJobDataEmployedV1Handler EventV2CorehrJobDataEmployedV1Handler eventV2CorehrJobDeletedV1Handler EventV2CorehrJobDeletedV1Handler eventV2CorehrJobUpdatedV1Handler EventV2CorehrJobUpdatedV1Handler + eventV2CorehrOffboardingChecklistUpdatedV2Handler EventV2CorehrOffboardingChecklistUpdatedV2Handler + eventV2CorehrOffboardingStatusUpdatedV2Handler EventV2CorehrOffboardingStatusUpdatedV2Handler eventV2CorehrOffboardingUpdatedV1Handler EventV2CorehrOffboardingUpdatedV1Handler + eventV2CorehrOffboardingUpdatedV2Handler EventV2CorehrOffboardingUpdatedV2Handler eventV2CorehrOrgRoleAuthorizationUpdatedV1Handler EventV2CorehrOrgRoleAuthorizationUpdatedV1Handler eventV2CorehrPersonCreatedV1Handler EventV2CorehrPersonCreatedV1Handler eventV2CorehrPersonDeletedV1Handler EventV2CorehrPersonDeletedV1Handler @@ -407,7 +413,10 @@ func (r *eventHandler) clone() *eventHandler { eventV2CorehrJobDataEmployedV1Handler: r.eventV2CorehrJobDataEmployedV1Handler, eventV2CorehrJobDeletedV1Handler: r.eventV2CorehrJobDeletedV1Handler, eventV2CorehrJobUpdatedV1Handler: r.eventV2CorehrJobUpdatedV1Handler, + eventV2CorehrOffboardingChecklistUpdatedV2Handler: r.eventV2CorehrOffboardingChecklistUpdatedV2Handler, + eventV2CorehrOffboardingStatusUpdatedV2Handler: r.eventV2CorehrOffboardingStatusUpdatedV2Handler, eventV2CorehrOffboardingUpdatedV1Handler: r.eventV2CorehrOffboardingUpdatedV1Handler, + eventV2CorehrOffboardingUpdatedV2Handler: r.eventV2CorehrOffboardingUpdatedV2Handler, eventV2CorehrOrgRoleAuthorizationUpdatedV1Handler: r.eventV2CorehrOrgRoleAuthorizationUpdatedV1Handler, eventV2CorehrPersonCreatedV1Handler: r.eventV2CorehrPersonCreatedV1Handler, eventV2CorehrPersonDeletedV1Handler: r.eventV2CorehrPersonDeletedV1Handler, @@ -560,7 +569,10 @@ type eventBody struct { eventV2CorehrJobDataEmployedV1 *EventV2CorehrJobDataEmployedV1 eventV2CorehrJobDeletedV1 *EventV2CorehrJobDeletedV1 eventV2CorehrJobUpdatedV1 *EventV2CorehrJobUpdatedV1 + eventV2CorehrOffboardingChecklistUpdatedV2 *EventV2CorehrOffboardingChecklistUpdatedV2 + eventV2CorehrOffboardingStatusUpdatedV2 *EventV2CorehrOffboardingStatusUpdatedV2 eventV2CorehrOffboardingUpdatedV1 *EventV2CorehrOffboardingUpdatedV1 + eventV2CorehrOffboardingUpdatedV2 *EventV2CorehrOffboardingUpdatedV2 eventV2CorehrOrgRoleAuthorizationUpdatedV1 *EventV2CorehrOrgRoleAuthorizationUpdatedV1 eventV2CorehrPersonCreatedV1 *EventV2CorehrPersonCreatedV1 eventV2CorehrPersonDeletedV1 *EventV2CorehrPersonDeletedV1 @@ -933,12 +945,30 @@ func (r *EventCallbackService) parserEventV2(req *eventReq) error { return err } req.eventV2CorehrJobUpdatedV1 = event + case EventTypeV2CorehrOffboardingChecklistUpdatedV2: + event := new(EventV2CorehrOffboardingChecklistUpdatedV2) + if err := req.unmarshalEvent(event); err != nil { + return err + } + req.eventV2CorehrOffboardingChecklistUpdatedV2 = event + case EventTypeV2CorehrOffboardingStatusUpdatedV2: + event := new(EventV2CorehrOffboardingStatusUpdatedV2) + if err := req.unmarshalEvent(event); err != nil { + return err + } + req.eventV2CorehrOffboardingStatusUpdatedV2 = event case EventTypeV2CorehrOffboardingUpdatedV1: event := new(EventV2CorehrOffboardingUpdatedV1) if err := req.unmarshalEvent(event); err != nil { return err } req.eventV2CorehrOffboardingUpdatedV1 = event + case EventTypeV2CorehrOffboardingUpdatedV2: + event := new(EventV2CorehrOffboardingUpdatedV2) + if err := req.unmarshalEvent(event); err != nil { + return err + } + req.eventV2CorehrOffboardingUpdatedV2 = event case EventTypeV2CorehrOrgRoleAuthorizationUpdatedV1: event := new(EventV2CorehrOrgRoleAuthorizationUpdatedV1) if err := req.unmarshalEvent(event); err != nil { @@ -2231,6 +2261,24 @@ func (r *EventCallbackService) handlerEvent(ctx context.Context, req *eventReq) } } return true, s, err + case req.eventV2CorehrOffboardingChecklistUpdatedV2 != nil: + if r.cli.eventHandler.eventV2CorehrOffboardingChecklistUpdatedV2Handler != nil { + if r.cli.noBlocking { + go r.cli.eventHandler.eventV2CorehrOffboardingChecklistUpdatedV2Handler(ctx, r.cli, req.Schema, req.Header, req.eventV2CorehrOffboardingChecklistUpdatedV2) + } else { + s, err = r.cli.eventHandler.eventV2CorehrOffboardingChecklistUpdatedV2Handler(ctx, r.cli, req.Schema, req.Header, req.eventV2CorehrOffboardingChecklistUpdatedV2) + } + } + return true, s, err + case req.eventV2CorehrOffboardingStatusUpdatedV2 != nil: + if r.cli.eventHandler.eventV2CorehrOffboardingStatusUpdatedV2Handler != nil { + if r.cli.noBlocking { + go r.cli.eventHandler.eventV2CorehrOffboardingStatusUpdatedV2Handler(ctx, r.cli, req.Schema, req.Header, req.eventV2CorehrOffboardingStatusUpdatedV2) + } else { + s, err = r.cli.eventHandler.eventV2CorehrOffboardingStatusUpdatedV2Handler(ctx, r.cli, req.Schema, req.Header, req.eventV2CorehrOffboardingStatusUpdatedV2) + } + } + return true, s, err case req.eventV2CorehrOffboardingUpdatedV1 != nil: if r.cli.eventHandler.eventV2CorehrOffboardingUpdatedV1Handler != nil { if r.cli.noBlocking { @@ -2240,6 +2288,15 @@ func (r *EventCallbackService) handlerEvent(ctx context.Context, req *eventReq) } } return true, s, err + case req.eventV2CorehrOffboardingUpdatedV2 != nil: + if r.cli.eventHandler.eventV2CorehrOffboardingUpdatedV2Handler != nil { + if r.cli.noBlocking { + go r.cli.eventHandler.eventV2CorehrOffboardingUpdatedV2Handler(ctx, r.cli, req.Schema, req.Header, req.eventV2CorehrOffboardingUpdatedV2) + } else { + s, err = r.cli.eventHandler.eventV2CorehrOffboardingUpdatedV2Handler(ctx, r.cli, req.Schema, req.Header, req.eventV2CorehrOffboardingUpdatedV2) + } + } + return true, s, err case req.eventV2CorehrOrgRoleAuthorizationUpdatedV1 != nil: if r.cli.eventHandler.eventV2CorehrOrgRoleAuthorizationUpdatedV1Handler != nil { if r.cli.noBlocking { diff --git a/api_event_callback_v2_corehr_offboarding_status_updated_v2.go b/api_event_callback_v2_corehr_offboarding_status_updated_v2.go new file mode 100644 index 00000000..77257b75 --- /dev/null +++ b/api_event_callback_v2_corehr_offboarding_status_updated_v2.go @@ -0,0 +1,51 @@ +// Code generated by lark_sdk_gen. DO NOT EDIT. +/** + * Copyright 2022 chyroc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package lark + +import ( + "context" +) + +// EventV2CorehrOffboardingStatusUpdatedV2 发起离职或离职状态更新时, 触发该事件。 +// +// 注: 发起「离职(无审批)」时, 会同时触发「离职发起」和「无需审批」两个状态变更的事件 +// 与原事件[离职状态变更](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/corehr-v1/offboarding/events/updated)相比, 该事件更全且支持行鉴权。 +// +// doc: https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/corehr-v2/offboarding/events/status_updated +func (r *EventCallbackService) HandlerEventV2CorehrOffboardingStatusUpdatedV2(f EventV2CorehrOffboardingStatusUpdatedV2Handler) { + r.cli.eventHandler.eventV2CorehrOffboardingStatusUpdatedV2Handler = f +} + +// EventV2CorehrOffboardingStatusUpdatedV2Handler event EventV2CorehrOffboardingStatusUpdatedV2 handler +type EventV2CorehrOffboardingStatusUpdatedV2Handler func(ctx context.Context, cli *Lark, schema string, header *EventHeaderV2, event *EventV2CorehrOffboardingStatusUpdatedV2) (string, error) + +// EventV2CorehrOffboardingStatusUpdatedV2 ... +type EventV2CorehrOffboardingStatusUpdatedV2 struct { + EmploymentID string `json:"employment_id,omitempty"` // 员工 ID + TargetUserID *EventV2CorehrOffboardingStatusUpdatedV2TargetUserID `json:"target_user_id,omitempty"` // 用户 ID + OffboardingID string `json:"offboarding_id,omitempty"` // 离职记录 ID + ProcessID string `json:"process_id,omitempty"` // 离职发起后的审批流程实例 ID + Status int64 `json:"status,omitempty"` // 离职状态, 可选值有: 1: 离职发起/审批中, 2: 审批通过, 3: 已生效(生效日期后自动生效), 4: 已拒绝, 5: 已撤销, 6: 无需审批 +} + +// EventV2CorehrOffboardingStatusUpdatedV2TargetUserID ... +type EventV2CorehrOffboardingStatusUpdatedV2TargetUserID struct { + UnionID string `json:"union_id,omitempty"` // 用户的 union id + UserID string `json:"user_id,omitempty"` // 用户的 user id, 字段权限要求: 获取用户 user ID + OpenID string `json:"open_id,omitempty"` // 用户的 open id +} diff --git a/api_event_callback_v2_corehr_offboarding_updated_v2.go b/api_event_callback_v2_corehr_offboarding_updated_v2.go new file mode 100644 index 00000000..7ce904fe --- /dev/null +++ b/api_event_callback_v2_corehr_offboarding_updated_v2.go @@ -0,0 +1,54 @@ +// Code generated by lark_sdk_gen. DO NOT EDIT. +/** + * Copyright 2022 chyroc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package lark + +import ( + "context" +) + +// EventV2CorehrOffboardingUpdatedV2 员工的离职信息变更会发送消息, 支持行鉴权 +// +// doc: https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/corehr-v2/offboarding/events/updated +func (r *EventCallbackService) HandlerEventV2CorehrOffboardingUpdatedV2(f EventV2CorehrOffboardingUpdatedV2Handler) { + r.cli.eventHandler.eventV2CorehrOffboardingUpdatedV2Handler = f +} + +// EventV2CorehrOffboardingUpdatedV2Handler event EventV2CorehrOffboardingUpdatedV2 handler +type EventV2CorehrOffboardingUpdatedV2Handler func(ctx context.Context, cli *Lark, schema string, header *EventHeaderV2, event *EventV2CorehrOffboardingUpdatedV2) (string, error) + +// EventV2CorehrOffboardingUpdatedV2 ... +type EventV2CorehrOffboardingUpdatedV2 struct { + TenantID string `json:"tenant_id,omitempty"` // Saas租户ID + OffboardingInfoID string `json:"offboarding_info_id,omitempty"` // 离职记录ID + ProcessID string `json:"process_id,omitempty"` // 离职流程ID + ChecklistProcessID string `json:"checklist_process_id,omitempty"` // 离职手续办了流程ID + EmploymentID string `json:"employment_id,omitempty"` // 离职员工雇佣ID + Operator string `json:"operator,omitempty"` // 操作人雇佣ID + Status int64 `json:"status,omitempty"` // 变更后的离职状态, 可选值有: 1: 离职发起 = 审批中状态, 2: 审批通过, 3: 已离职, 4: 已拒绝, 5: 已撤销, 6: 无需审批 + ChecklistStatus int64 `json:"checklist_status,omitempty"` // 变更后的离职手续办理状态, 可选值有: 1: 未发起, 2: 进行中, 3: 已完成, 4: 已拒绝, 5: 已撤销 + UpdatedTime string `json:"updated_time,omitempty"` // 更新时间毫秒时间戳 + UpdatedFields []string `json:"updated_fields,omitempty"` // 所有变更的离职信息字段, 长度范围: `0` ~ `200` + TargetUserID *EventV2CorehrOffboardingUpdatedV2TargetUserID `json:"target_user_id,omitempty"` // 用户 ID +} + +// EventV2CorehrOffboardingUpdatedV2TargetUserID ... +type EventV2CorehrOffboardingUpdatedV2TargetUserID struct { + UnionID string `json:"union_id,omitempty"` // 用户的 union id + UserID string `json:"user_id,omitempty"` // 用户的 user id, 字段权限要求: 获取用户 user ID + OpenID string `json:"open_id,omitempty"` // 用户的 open id +} diff --git a/impl.go b/impl.go index 8281b5be..d1fcbd65 100644 --- a/impl.go +++ b/impl.go @@ -39,6 +39,7 @@ type Lark struct { wwwBaseURL string isEnableLogID bool noBlocking bool + disableErrorLog bool apiMiddlewares []ApiMiddleware httpClient HttpClient @@ -172,6 +173,7 @@ func (r *Lark) clone(tenantKey string) *Lark { wwwBaseURL: r.wwwBaseURL, isEnableLogID: r.isEnableLogID, noBlocking: r.noBlocking, + disableErrorLog: r.disableErrorLog, httpClient: r.httpClient, logger: r.logger, logLevel: r.logLevel, diff --git a/mock.go b/mock.go index 7d1d095c..f83728d0 100644 --- a/mock.go +++ b/mock.go @@ -444,6 +444,7 @@ type Mock struct { mockCoreHRGetCoreHRDepartment func(ctx context.Context, request *GetCoreHRDepartmentReq, options ...MethodOptionFunc) (*GetCoreHRDepartmentResp, *Response, error) mockCoreHRSearchCoreHRDepartment func(ctx context.Context, request *SearchCoreHRDepartmentReq, options ...MethodOptionFunc) (*SearchCoreHRDepartmentResp, *Response, error) mockCoreHRQueryCoreHRDepartmentTimeline func(ctx context.Context, request *QueryCoreHRDepartmentTimelineReq, options ...MethodOptionFunc) (*QueryCoreHRDepartmentTimelineResp, *Response, error) + mockCoreHRBatchQueryCoreHRDepartmentTimeline func(ctx context.Context, request *BatchQueryCoreHRDepartmentTimelineReq, options ...MethodOptionFunc) (*BatchQueryCoreHRDepartmentTimelineResp, *Response, error) mockCoreHRGetCoreHRDepartmentParentList func(ctx context.Context, request *GetCoreHRDepartmentParentListReq, options ...MethodOptionFunc) (*GetCoreHRDepartmentParentListResp, *Response, error) mockCoreHRCreateCoreHRDepartment func(ctx context.Context, request *CreateCoreHRDepartmentReq, options ...MethodOptionFunc) (*CreateCoreHRDepartmentResp, *Response, error) mockCoreHRDeleteCoreHRDepartment func(ctx context.Context, request *DeleteCoreHRDepartmentReq, options ...MethodOptionFunc) (*DeleteCoreHRDepartmentResp, *Response, error) @@ -523,7 +524,6 @@ type Mock struct { mockCoreHRGetCoreHRSecurityGroupBp func(ctx context.Context, request *GetCoreHRSecurityGroupBpReq, options ...MethodOptionFunc) (*GetCoreHRSecurityGroupBpResp, *Response, error) mockCoreHRSearchCoreHRAssignedUser func(ctx context.Context, request *SearchCoreHRAssignedUserReq, options ...MethodOptionFunc) (*SearchCoreHRAssignedUserResp, *Response, error) mockCoreHRGetCoreHRAuthorization func(ctx context.Context, request *GetCoreHRAuthorizationReq, options ...MethodOptionFunc) (*GetCoreHRAuthorizationResp, *Response, error) - mockCoreHRGetCoreHRAuthorizationList func(ctx context.Context, request *GetCoreHRAuthorizationListReq, options ...MethodOptionFunc) (*GetCoreHRAuthorizationListResp, *Response, error) mockCoreHRGetCoreHRSecurityGroupList func(ctx context.Context, request *GetCoreHRSecurityGroupListReq, options ...MethodOptionFunc) (*GetCoreHRSecurityGroupListResp, *Response, error) mockCoreHRGetCoreHRProcessList func(ctx context.Context, request *GetCoreHRProcessListReq, options ...MethodOptionFunc) (*GetCoreHRProcessListResp, *Response, error) mockCoreHRGetCoreHRProcess func(ctx context.Context, request *GetCoreHRProcessReq, options ...MethodOptionFunc) (*GetCoreHRProcessResp, *Response, error) diff --git a/test/CoreHR_sample_test.go b/test/CoreHR_sample_test.go index 1be02dab..db8a939f 100644 --- a/test/CoreHR_sample_test.go +++ b/test/CoreHR_sample_test.go @@ -709,6 +709,18 @@ func Test_CoreHR_Sample_Failed(t *testing.T) { as.Equal(err.Error(), "mock-failed") }) + t.Run("", func(t *testing.T) { + + cli.Mock().MockCoreHRBatchQueryCoreHRDepartmentTimeline(func(ctx context.Context, request *lark.BatchQueryCoreHRDepartmentTimelineReq, options ...lark.MethodOptionFunc) (*lark.BatchQueryCoreHRDepartmentTimelineResp, *lark.Response, error) { + return nil, nil, fmt.Errorf("mock-failed") + }) + defer cli.Mock().UnMockCoreHRBatchQueryCoreHRDepartmentTimeline() + + _, _, err := moduleCli.BatchQueryCoreHRDepartmentTimeline(ctx, &lark.BatchQueryCoreHRDepartmentTimelineReq{}) + as.NotNil(err) + as.Equal(err.Error(), "mock-failed") + }) + t.Run("", func(t *testing.T) { cli.Mock().MockCoreHRGetCoreHRDepartmentParentList(func(ctx context.Context, request *lark.GetCoreHRDepartmentParentListReq, options ...lark.MethodOptionFunc) (*lark.GetCoreHRDepartmentParentListResp, *lark.Response, error) { @@ -1657,18 +1669,6 @@ func Test_CoreHR_Sample_Failed(t *testing.T) { as.Equal(err.Error(), "mock-failed") }) - t.Run("", func(t *testing.T) { - - cli.Mock().MockCoreHRGetCoreHRAuthorizationList(func(ctx context.Context, request *lark.GetCoreHRAuthorizationListReq, options ...lark.MethodOptionFunc) (*lark.GetCoreHRAuthorizationListResp, *lark.Response, error) { - return nil, nil, fmt.Errorf("mock-failed") - }) - defer cli.Mock().UnMockCoreHRGetCoreHRAuthorizationList() - - _, _, err := moduleCli.GetCoreHRAuthorizationList(ctx, &lark.GetCoreHRAuthorizationListReq{}) - as.NotNil(err) - as.Equal(err.Error(), "mock-failed") - }) - t.Run("", func(t *testing.T) { cli.Mock().MockCoreHRGetCoreHRSecurityGroupList(func(ctx context.Context, request *lark.GetCoreHRSecurityGroupListReq, options ...lark.MethodOptionFunc) (*lark.GetCoreHRSecurityGroupListResp, *lark.Response, error) { @@ -2238,6 +2238,13 @@ func Test_CoreHR_Sample_Failed(t *testing.T) { as.True(lark.GetErrorCode(err) > 0, fmt.Sprintf("need get lark err, but get %s", err)) }) + t.Run("", func(t *testing.T) { + + _, _, err := moduleCli.BatchQueryCoreHRDepartmentTimeline(ctx, &lark.BatchQueryCoreHRDepartmentTimelineReq{}) + as.NotNil(err) + as.True(lark.GetErrorCode(err) > 0, fmt.Sprintf("need get lark err, but get %s", err)) + }) + t.Run("", func(t *testing.T) { _, _, err := moduleCli.GetCoreHRDepartmentParentList(ctx, &lark.GetCoreHRDepartmentParentListReq{}) @@ -2855,13 +2862,6 @@ func Test_CoreHR_Sample_Failed(t *testing.T) { as.True(lark.GetErrorCode(err) > 0, fmt.Sprintf("need get lark err, but get %s", err)) }) - t.Run("", func(t *testing.T) { - - _, _, err := moduleCli.GetCoreHRAuthorizationList(ctx, &lark.GetCoreHRAuthorizationListReq{}) - as.NotNil(err) - as.True(lark.GetErrorCode(err) > 0, fmt.Sprintf("need get lark err, but get %s", err)) - }) - t.Run("", func(t *testing.T) { _, _, err := moduleCli.GetCoreHRSecurityGroupList(ctx, &lark.GetCoreHRSecurityGroupListReq{}) @@ -3383,6 +3383,13 @@ func Test_CoreHR_Sample_Failed(t *testing.T) { as.Equal("fake raw request", err.Error()) }) + t.Run("", func(t *testing.T) { + + _, _, err := moduleCli.BatchQueryCoreHRDepartmentTimeline(ctx, &lark.BatchQueryCoreHRDepartmentTimelineReq{}) + as.NotNil(err) + as.Equal("fake raw request", err.Error()) + }) + t.Run("", func(t *testing.T) { _, _, err := moduleCli.GetCoreHRDepartmentParentList(ctx, &lark.GetCoreHRDepartmentParentListReq{}) @@ -4000,13 +4007,6 @@ func Test_CoreHR_Sample_Failed(t *testing.T) { as.Equal("fake raw request", err.Error()) }) - t.Run("", func(t *testing.T) { - - _, _, err := moduleCli.GetCoreHRAuthorizationList(ctx, &lark.GetCoreHRAuthorizationListReq{}) - as.NotNil(err) - as.Equal("fake raw request", err.Error()) - }) - t.Run("", func(t *testing.T) { _, _, err := moduleCli.GetCoreHRSecurityGroupList(ctx, &lark.GetCoreHRSecurityGroupListReq{})