package logic import ( "fmt" "github.com/eryajf/go-ldap-admin/config" "github.com/eryajf/go-ldap-admin/model" "github.com/eryajf/go-ldap-admin/public/client/feishu" "github.com/eryajf/go-ldap-admin/public/tools" "github.com/eryajf/go-ldap-admin/service/ildap" "github.com/eryajf/go-ldap-admin/service/isql" "github.com/gin-gonic/gin" ) type FeiShuLogic struct { } //通过飞书获取部门信息 func (d *FeiShuLogic) SyncFeiShuDepts(c *gin.Context, req interface{}) (data interface{}, rspError interface{}) { // 1.获取所有部门 deptSource, err := feishu.GetAllDepts() if err != nil { return nil, tools.NewOperationError(fmt.Errorf("获取飞书部门列表失败:%s", err.Error())) } depts, err := ConvertDeptData(config.Conf.FeiShu.Flag, deptSource) if err != nil { return nil, tools.NewOperationError(fmt.Errorf("转换飞书部门数据失败:%s", err.Error())) } // 2.将远程数据转换成树 deptTree := GroupListToTree(fmt.Sprintf("%s_0", config.Conf.FeiShu.Flag), depts) // 3.根据树进行创建 err = d.addDepts(deptTree.Children) return nil, err } // 添加部门 func (d FeiShuLogic) addDepts(depts []*model.Group) error { for _, dept := range depts { err := d.AddDepts(dept) if err != nil { return tools.NewOperationError(fmt.Errorf("DsyncFeiShuDepts添加部门失败: %s", err.Error())) } if len(dept.Children) != 0 { err = d.addDepts(dept.Children) if err != nil { return tools.NewOperationError(fmt.Errorf("DsyncFeiShuDepts添加部门失败: %s", err.Error())) } } } return nil } // AddGroup 添加部门数据 func (d FeiShuLogic) AddDepts(group *model.Group) error { // 判断部门名称是否存在 parentGroup := new(model.Group) err := isql.Group.Find(tools.H{"source_dept_id": group.SourceDeptParentId}, parentGroup) if err != nil { return tools.NewMySqlError(fmt.Errorf("查询父级部门失败:%s", err.Error())) } if !isql.Group.Exist(tools.H{"source_dept_id": group.SourceDeptId}) { // 此时的 group 已经附带了Build后动态关联好的字段,接下来将一些确定性的其他字段值添加上,就可以创建这个分组了 group.Creator = "system" group.GroupType = "cn" group.ParentId = parentGroup.ID group.Source = config.Conf.FeiShu.Flag group.GroupDN = fmt.Sprintf("cn=%s,%s", group.GroupName, parentGroup.GroupDN) err = CommonAddGroup(group) if err != nil { return tools.NewOperationError(fmt.Errorf("添加部门失败:%s", err.Error())) } } return nil } //根据现有数据库同步到的部门信息,开启用户同步 func (d FeiShuLogic) SyncFeiShuUsers(c *gin.Context, req interface{}) (data interface{}, rspError interface{}) { // 1.获取飞书用户列表 staffSource, err := feishu.GetAllUsers() if err != nil { return nil, tools.NewOperationError(fmt.Errorf("获取飞书用户列表失败:%s", err.Error())) } staffs, err := ConvertUserData(config.Conf.FeiShu.Flag, staffSource) if err != nil { return nil, tools.NewOperationError(fmt.Errorf("转换飞书用户数据失败:%s", err.Error())) } // 2.遍历用户,开始写入 for _, staff := range staffs { // 入库 err = d.AddUsers(staff) if err != nil { return nil, tools.NewOperationError(fmt.Errorf("SyncFeiShuUsers写入用户失败:%s", err.Error())) } } // 3.获取飞书已离职用户id列表 userIds, err := feishu.GetLeaveUserIds() if err != nil { return nil, tools.NewOperationError(fmt.Errorf("SyncFeiShuUsers获取飞书离职用户列表失败:%s", err.Error())) } // 4.遍历id,开始处理 for _, uid := range userIds { if isql.User.Exist(tools.H{"source_user_id": fmt.Sprintf("%s_%s", config.Conf.FeiShu.Flag, uid)}) { user := new(model.User) err = isql.User.Find(tools.H{"source_union_id": fmt.Sprintf("%s_%s", config.Conf.FeiShu.Flag, uid)}, user) if err != nil { return nil, tools.NewMySqlError(fmt.Errorf("在MySQL查询用户失败: " + err.Error())) } // 先从ldap删除用户 err = ildap.User.Delete(user.UserDN) if err != nil { return nil, tools.NewLdapError(fmt.Errorf("在LDAP删除用户失败" + err.Error())) } // 然后更新MySQL中用户状态 err = isql.User.ChangeStatus(int(user.ID), 2) if err != nil { return nil, tools.NewMySqlError(fmt.Errorf("在MySQL更新用户状态失败: " + err.Error())) } } } return nil, nil } // AddUser 添加用户数据 func (d FeiShuLogic) AddUsers(user *model.User) error { // 根据 unionid 查询用户,不存在则创建 if !isql.User.Exist(tools.H{"source_union_id": user.SourceUnionId}) { // 根据角色id获取角色 roles, err := isql.Role.GetRolesByIds([]uint{2}) if err != nil { return tools.NewValidatorError(fmt.Errorf("根据角色ID获取角色信息失败:%s", err.Error())) } user.Creator = "system" user.Roles = roles user.Password = config.Conf.Ldap.UserInitPassword user.Source = config.Conf.FeiShu.Flag user.UserDN = fmt.Sprintf("uid=%s,%s", user.Username, config.Conf.Ldap.UserDN) err = CommonAddUser(user, tools.StringToSlice(user.DepartmentId, ",")) if err != nil { return err } } return nil }