ldap-1-backend/public/client/feishu/feishu.go

230 lines
6.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package feishu
import (
"context"
"fmt"
"strings"
"github.com/chyroc/lark"
"github.com/eryajf/go-ldap-admin/config"
"github.com/eryajf/go-ldap-admin/public/tools"
)
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/department/children
// GetAllDepts 获取所有部门
func GetAllDepts() (ret []map[string]interface{}, err error) {
var (
fetchChild bool = true
pageSize int64 = 50
pageToken string = ""
// DeptID lark.DepartmentIDType = "department_id"
)
if len(config.Conf.FeiShu.DeptList) == 0 {
req := lark.GetDepartmentListReq{
// DepartmentIDType: &DeptID,
PageToken: &pageToken,
FetchChild: &fetchChild,
PageSize: &pageSize,
DepartmentID: "0",
}
for {
res, _, err := InitFeiShuClient().Contact.GetDepartmentList(context.TODO(), &req)
if err != nil {
return nil, err
}
for _, dept := range res.Items {
ele := make(map[string]interface{})
ele["name"] = dept.Name
ele["custom_name_pinyin"] = tools.ConvertToPinYin(dept.Name)
ele["parent_department_id"] = dept.ParentDepartmentID
ele["department_id"] = dept.DepartmentID
ele["open_department_id"] = dept.OpenDepartmentID
ele["leader_user_id"] = dept.LeaderUserID
ele["unit_ids"] = dept.UnitIDs
ret = append(ret, ele)
}
if !res.HasMore {
break
}
pageToken = res.PageToken
}
} else {
//使用dept-list来一个一个添加部门开头为^的不添加子部门
isInDeptList := func(id string) bool {
for _, v := range config.Conf.FeiShu.DeptList {
if strings.HasPrefix(v, "^") {
v = v[1:]
}
if id == v {
return true
}
}
return false
}
dep_append_norepeat := func(ret []map[string]interface{}, dept map[string]interface{}) []map[string]interface{} {
for _, v := range ret {
if v["open_department_id"] == dept["open_department_id"] {
return ret
}
}
return append(ret, dept)
}
for _, dep_s := range config.Conf.FeiShu.DeptList {
dept_id := dep_s
no_add_children := false
if strings.HasPrefix(dep_s, "^") {
no_add_children = true
dept_id = dep_s[1:]
}
req := lark.GetDepartmentReq{
DepartmentID: dept_id,
}
res, _, err := InitFeiShuClient().Contact.GetDepartment(context.TODO(), &req)
if err != nil {
return nil, err
}
ele := make(map[string]interface{})
ele["name"] = res.Department.Name
ele["custom_name_pinyin"] = tools.ConvertToPinYin(res.Department.Name)
if isInDeptList(res.Department.ParentDepartmentID) {
ele["parent_department_id"] = res.Department.ParentDepartmentID
} else {
ele["parent_department_id"] = "0"
}
ele["department_id"] = res.Department.DepartmentID
ele["open_department_id"] = res.Department.OpenDepartmentID
ele["leader_user_id"] = res.Department.LeaderUserID
ele["unit_ids"] = res.Department.UnitIDs
ret = dep_append_norepeat(ret, ele)
if !no_add_children {
pageToken = ""
req := lark.GetDepartmentListReq{
// DepartmentIDType: &DeptID,
PageToken: &pageToken,
FetchChild: &fetchChild,
PageSize: &pageSize,
DepartmentID: dept_id,
}
for {
res, _, err := InitFeiShuClient().Contact.GetDepartmentList(context.TODO(), &req)
if err != nil {
return nil, err
}
for _, dept := range res.Items {
ele := make(map[string]interface{})
ele["name"] = dept.Name
ele["custom_name_pinyin"] = tools.ConvertToPinYin(dept.Name)
ele["parent_department_id"] = dept.ParentDepartmentID
ele["department_id"] = dept.DepartmentID
ele["open_department_id"] = dept.OpenDepartmentID
ele["leader_user_id"] = dept.LeaderUserID
ele["unit_ids"] = dept.UnitIDs
ret = dep_append_norepeat(ret, ele)
}
if !res.HasMore {
break
}
pageToken = res.PageToken
}
}
}
}
return
}
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/user/find_by_department
// GetAllUsers 获取所有员工信息
func GetAllUsers() (ret []map[string]interface{}, err error) {
var (
pageSize int64 = 50
pageToken string = ""
// deptidtype lark.DepartmentIDType = "department_id"
)
depts, err := GetAllDepts()
if err != nil {
return nil, err
}
deptids := make([]string, 0)
// deptids = append(deptids, "0")
for _, dept := range depts {
deptids = append(deptids, dept["open_department_id"].(string))
}
for _, deptid := range deptids {
req := lark.GetUserListReq{
PageSize: &pageSize,
PageToken: &pageToken,
// DepartmentIDType: &deptidtype,
DepartmentID: deptid,
}
for {
res, _, err := InitFeiShuClient().Contact.GetUserList(context.Background(), &req)
if err != nil {
return nil, err
}
for _, user := range res.Items {
ele := make(map[string]interface{})
ele["name"] = user.Name
ele["custom_name_pinyin"] = tools.ConvertToPinYin(user.Name)
ele["union_id"] = user.UnionID
ele["user_id"] = user.UserID
ele["open_id"] = user.OpenID
ele["en_name"] = user.EnName
ele["nickname"] = user.Nickname
if user.Email != "" {
ele["custom_nickname_email"] = strings.Split(user.Email, "@")[0]
}
if user.EnterpriseEmail != "" {
ele["custom_nickname_enterprise_email"] = strings.Split(user.EnterpriseEmail, "@")[0]
}
ele["email"] = user.Email
ele["mobile"] = user.Mobile
ele["gender"] = user.Gender
ele["avatar"] = user.Avatar.AvatarOrigin
ele["city"] = user.City
ele["country"] = user.Country
ele["work_station"] = user.WorkStation
ele["join_time"] = user.JoinTime
ele["employee_no"] = user.EmployeeNo
ele["enterprise_email"] = user.EnterpriseEmail
ele["job_title"] = user.JobTitle
// 部门ids
var sourceDeptIds []string
for _, deptId := range user.DepartmentIDs {
sourceDeptIds = append(sourceDeptIds, fmt.Sprintf("%s_%s", config.Conf.FeiShu.Flag, deptId))
}
ele["department_ids"] = sourceDeptIds
ret = append(ret, ele)
}
if !res.HasMore {
break
}
pageToken = res.PageToken
}
}
return
}
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/ehr/ehr-v1/employee/list
// GetLeaveUserIds 获取离职人员ID列表
func GetLeaveUserIds() ([]string, error) {
var ids []string
users, _, err := InitFeiShuClient().EHR.GetEHREmployeeList(context.TODO(), &lark.GetEHREmployeeListReq{
Status: []int64{5},
UserIDType: lark.IDTypePtr(lark.IDTypeUnionID), // 只查询unionID
})
if err != nil {
return nil, err
}
for _, user := range users.Items {
ids = append(ids, user.UserID)
}
return ids, nil
}