// 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"
)

// UpdateTaskTasklist 更新清单, 可以更新清单的名字和所有者。
//
// 更新清单时, 将`update_fields`字段中填写所有要修改的清单字段名, 同时在`tasklist`字段中填写要修改的字段的新值即可。更新调用规范详见[功能概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/task-v2/overview)中的“ 关于资源的更新”章节。
// 支持更新的字段包括:
// * `name` - 清单名字
// * `owner` - 清单所有者
// 更新清单所有者（owner）时, 如果该成员已经是清单的“可编辑”或者“可阅读”角色, 则该成员将直接升级为所有者角色, 自动从清单的成员列表中消失。这是因为同一个用户在同一个清单中只能有一个角色。同时, 支持使用`origin_owner_to_role`字段将原有所有者变为可编辑/可阅读角色或者直接退出清单。
// 该接口不能用于更新清单的成员和增删清单中的任务。
// * 如要增删清单中的成员, 可以使用[添加清单成员](/ssl:ttdoc:/uAjLw4CM/ukTMukTMukTM/task-v2/tasklist/add_members)和[移除清单成员](/ssl:ttdoc:/uAjLw4CM/ukTMukTMukTM/task-v2/tasklist/remove_members)接口。
// * 如要增删清单中的任务, 可以使用[任务加入清单](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/task-v2/task/add_tasklist)和[任务移出清单]( /ssl:ttdoc/uAjLw4CM/ukTMukTMukTM/task-v2/task/remove_tasklist)接口。
// 更新清单名字需要清单的编辑权限。
// 更新清单所有人必须由清单的管理权限。
// 详情见[清单功能概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/task-v2/tasklist/overview)中的“清单是如何鉴权的？“章节。
//
// doc: https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/task-v2/tasklist/patch
func (r *TaskService) UpdateTaskTasklist(ctx context.Context, request *UpdateTaskTasklistReq, options ...MethodOptionFunc) (*UpdateTaskTasklistResp, *Response, error) {
	if r.cli.mock.mockTaskUpdateTaskTasklist != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Task#UpdateTaskTasklist mock enable")
		return r.cli.mock.mockTaskUpdateTaskTasklist(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Task",
		API:                   "UpdateTaskTasklist",
		Method:                "PATCH",
		URL:                   r.cli.openBaseURL + "/open-apis/task/v2/tasklists/:tasklist_guid",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
		NeedUserAccessToken:   true,
	}
	resp := new(updateTaskTasklistResp)

	response, err := r.cli.RawRequest(ctx, req, resp)
	return resp.Data, response, err
}

// MockTaskUpdateTaskTasklist mock TaskUpdateTaskTasklist method
func (r *Mock) MockTaskUpdateTaskTasklist(f func(ctx context.Context, request *UpdateTaskTasklistReq, options ...MethodOptionFunc) (*UpdateTaskTasklistResp, *Response, error)) {
	r.mockTaskUpdateTaskTasklist = f
}

// UnMockTaskUpdateTaskTasklist un-mock TaskUpdateTaskTasklist method
func (r *Mock) UnMockTaskUpdateTaskTasklist() {
	r.mockTaskUpdateTaskTasklist = nil
}

// UpdateTaskTasklistReq ...
type UpdateTaskTasklistReq struct {
	TasklistGuid      string                         `path:"tasklist_guid" json:"-"`         // 要更新的清单的全局唯一GUID, 示例值: "d300a75f-c56a-4be9-80d1-e47653028ceb"
	UserIDType        *IDType                        `query:"user_id_type" json:"-"`         // 用户 ID 类型, 示例值: open_id, 默认值: `open_id`
	Tasklist          *UpdateTaskTasklistReqTasklist `json:"tasklist,omitempty"`             // 要更新清单的数据
	UpdateFields      []string                       `json:"update_fields,omitempty"`        // 要更新的字段名, 支持, name: 更新清单名, owner: 更新清单所有者, 示例值: ["owner"], 最小长度: `1`
	OriginOwnerToRole *string                        `json:"origin_owner_to_role,omitempty"` // 该字段表示如果更新了新的所有者, 则将原所有者设为指定的新的角色。仅在更新清单所有者时生效。支持"editor", "viewer"和"none"。默认为"none", 如果不设置或设为"none", 原清单所有者将不具有任何清单的角色。如果没有通过其他渠道（比如通过协作群组间接授权）, 原清单所有者将失去对清单的所有权限, 示例值: "editor", 可选值有: editor: 原所有者变为可编辑角色, viewer: 原所有者变为可阅读角色, none: 原所有者直接退出清单, 默认值: `none`
}

// UpdateTaskTasklistReqTasklist ...
type UpdateTaskTasklistReqTasklist struct {
	Name  *string                             `json:"name,omitempty"`  // 清单名称。如要更新, 不能设为空。最大100个字符, 示例值: "年会工作任务清单"
	Owner *UpdateTaskTasklistReqTasklistOwner `json:"owner,omitempty"` // 更新的清单所有者。
}

// UpdateTaskTasklistReqTasklistOwner ...
type UpdateTaskTasklistReqTasklistOwner struct {
	ID   *string `json:"id,omitempty"`   // 表示member的id, 示例值: "ou_2cefb2f014f8d0c6c2d2eb7bafb0e54f", 最大长度: `100` 字符
	Type *string `json:"type,omitempty"` // 成员的类型, 可以是"user"或者"app"。所有者的类型不可以是"chat", 示例值: "user", 默认值: `user`
	Role *string `json:"role,omitempty"` // 成员角色, 此时必须是"owner", 示例值: "owner", 最大长度: `20` 字符
}

// UpdateTaskTasklistResp ...
type UpdateTaskTasklistResp struct {
	Tasklist *UpdateTaskTasklistRespTasklist `json:"tasklist,omitempty"` // 修改后的任务清单
}

// UpdateTaskTasklistRespTasklist ...
type UpdateTaskTasklistRespTasklist struct {
	Guid      string                                  `json:"guid,omitempty"`       // 清单的全局唯一ID
	Name      string                                  `json:"name,omitempty"`       // 清单名
	Creator   *UpdateTaskTasklistRespTasklistCreator  `json:"creator,omitempty"`    // 清单创建者
	Owner     *UpdateTaskTasklistRespTasklistOwner    `json:"owner,omitempty"`      // 清单所有者
	Members   []*UpdateTaskTasklistRespTasklistMember `json:"members,omitempty"`    // 清单协作人
	URL       string                                  `json:"url,omitempty"`        // 该清单分享的applink
	CreatedAt string                                  `json:"created_at,omitempty"` // 清单创建时间戳(ms)
	UpdatedAt string                                  `json:"updated_at,omitempty"` // 清单最后一次更新时间戳（ms)
}

// UpdateTaskTasklistRespTasklistCreator ...
type UpdateTaskTasklistRespTasklistCreator struct {
	ID   string `json:"id,omitempty"`   // 表示member的id
	Type string `json:"type,omitempty"` // 成员的类型
	Role string `json:"role,omitempty"` // 成员角色
}

// UpdateTaskTasklistRespTasklistMember ...
type UpdateTaskTasklistRespTasklistMember struct {
	ID   string `json:"id,omitempty"`   // 表示member的id
	Type string `json:"type,omitempty"` // 成员的类型
	Role string `json:"role,omitempty"` // 成员类型
}

// UpdateTaskTasklistRespTasklistOwner ...
type UpdateTaskTasklistRespTasklistOwner struct {
	ID   string `json:"id,omitempty"`   // 表示所有者的id
	Type string `json:"type,omitempty"` // 成员的类型
	Role string `json:"role,omitempty"` // 成员角色
}

// updateTaskTasklistResp ...
type updateTaskTasklistResp struct {
	Code  int64                   `json:"code,omitempty"` // 错误码, 非 0 表示失败
	Msg   string                  `json:"msg,omitempty"`  // 错误描述
	Data  *UpdateTaskTasklistResp `json:"data,omitempty"`
	Error *ErrorDetail            `json:"error,omitempty"`
}
