Skip to content

Commit

Permalink
fix: 多级部门同步的问题 (eryajf#79)
Browse files Browse the repository at this point in the history
* fix: dockerfile调整初始化方式
* fix: 多级部门同步的问题
  • Loading branch information
eryajf committed Jul 13, 2022
1 parent 22f12d8 commit 1d0df89
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 102 deletions.
7 changes: 4 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ FROM golang:1.17.10 AS builder
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN go build -o go-ldap-admin .
RUN sed -i 's@localhost:389@openldap:389@g' /app/config.yml \
&& sed -i 's@host: localhost@host: mysql@g' /app/config.yml && go build -o go-ldap-admin .

FROM centos:centos7
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/ .
RUN chmod +x wait go-ldap-admin docker-start.sh && yum -y install vim net-tools telnet wget curl && yum clean all
RUN chmod +x wait go-ldap-admin && yum -y install vim net-tools telnet wget curl && yum clean all

CMD [ "sh", "-c", "/app/docker-start.sh" ]
CMD ./wait && ./go-ldap-admin
11 changes: 0 additions & 11 deletions docker-start.sh

This file was deleted.

1 change: 0 additions & 1 deletion docs/docker-compose/config/config.yml

This file was deleted.

2 changes: 1 addition & 1 deletion docs/docker-compose/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ services:
WAIT_HOSTS: mysql:3306, openldap:389
ports:
- 8888:8888
# volumes: # 可按需打开此配置,将配置文件挂载到本地,如果挂载,需要注意修改本地配置中MySQL与ldap的连接信息
# volumes: # 可按需打开此配置,将配置文件挂载到本地 可在服务运行之后,执行 docker cp go-ldap-admin-server:/app/config.yml ./config 然后再取消改行注释
# - ./config/config.yml:/app/config.yml
depends_on:
- mysql
Expand Down
38 changes: 19 additions & 19 deletions logic/feishu_logic.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,31 +27,31 @@ func (d *FeiShuLogic) SyncFeiShuDepts(c *gin.Context, req interface{}) (data int
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("转换飞书部门数据失败:%s", err.Error()))
}
// 2.将部门这个数组进行拆分,一组是父ID为根的,一组是父ID不为根的
var firstDepts []*model.Group // 父ID为根的部门
var otherDepts []*model.Group // 父ID不为根的部门

// 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 {
if dept.SourceDeptParentId == fmt.Sprintf("%s_0", config.Conf.FeiShu.Flag) {
firstDepts = append(firstDepts, dept)
} else {
otherDepts = append(otherDepts, dept)
}
}
// 3.先写父ID为根的,再写父ID不为根的
for _, dept := range firstDepts {
err := d.AddDepts(dept)
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("SyncFeiShuDepts添加根部门失败:%s", err.Error()))
return tools.NewOperationError(fmt.Errorf("DsyncFeiShuDepts添加部门失败: %s", err.Error()))
}
}

for _, dept := range otherDepts {
err := d.AddDepts(dept)
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("SyncFeiShuDepts添加其他部门失败:%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, nil
return nil
}

// AddGroup 添加部门数据
Expand Down
72 changes: 33 additions & 39 deletions logic/openldap_logic.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,69 +21,63 @@ func (d *OpenLdapLogic) SyncOpenLdapDepts(c *gin.Context, req interface{}) (data
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("获取ldap部门列表失败:%s", err.Error()))
}
// 2.将部门这个数组进行拆分,一组是父ID为根的,一组是父ID不为根的
var firstDepts []*openldap.Dept // 父ID为根的部门
var otherDepts []*openldap.Dept // 父ID不为根的部门
groups := make([]*model.Group, 0)
for _, dept := range depts {
if dept.ParentId == "openldap_0" {
firstDepts = append(firstDepts, dept)
} else {
otherDepts = append(otherDepts, dept)
}
}
// 3.先写父ID为根的,再写父ID不为根的
for _, dept := range firstDepts {
err := d.AddDepts(&model.Group{
groups = append(groups, &model.Group{
GroupName: dept.Name,
Remark: dept.Remark,
Creator: "system",
GroupType: "cn",
SourceDeptId: dept.Id,
Source: "openldap",
SourceDeptParentId: dept.ParentId,
ParentId: 0,
GroupDN: dept.DN,
})
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("SyncOpenLdapDepts添加根部门失败:%s", err.Error()))
}
}
// 2.将远程数据转换成树
deptTree := GroupListToTree("0", groups)

// 3.根据树进行创建
err = d.addDepts(deptTree.Children)

for _, dept := range otherDepts {
// 判断部门名称是否存在
parentGroup := new(model.Group)
err := isql.Group.Find(tools.H{"source_dept_id": dept.ParentId}, parentGroup)
return nil, err
}

// 添加部门
func (d OpenLdapLogic) addDepts(depts []*model.Group) error {
for _, dept := range depts {
err := d.AddDepts(dept)
if err != nil {
return nil, tools.NewMySqlError(fmt.Errorf("查询父级部门失败:%s", err.Error()))
return tools.NewOperationError(fmt.Errorf("DsyncOpenLdapDepts添加部门失败: %s", err.Error()))
}
err = d.AddDepts(&model.Group{
GroupName: dept.Name,
Remark: dept.Remark,
Creator: "system",
GroupType: "cn",
SourceDeptId: dept.Id,
Source: "openldap",
SourceDeptParentId: dept.ParentId,
GroupDN: dept.DN,
ParentId: parentGroup.ID,
})
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("SyncOpenLdapDepts添加其他部门失败:%s", err.Error()))
if len(dept.Children) != 0 {
err = d.addDepts(dept.Children)
if err != nil {
return tools.NewOperationError(fmt.Errorf("DsyncOpenLdapDepts添加部门失败: %s", err.Error()))
}
}
}
return nil, nil
return nil
}

// AddGroup 添加部门数据
func (d OpenLdapLogic) 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 = "openldap"
err := isql.Group.Add(group)
if err != nil {
return err
}
}
return nil

}

//根据现有数据库同步到的部门信息,开启用户同步
Expand Down
41 changes: 19 additions & 22 deletions logic/wecom_logic.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,34 +28,31 @@ func (d *WeComLogic) SyncWeComDepts(c *gin.Context, req interface{}) (data inter
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("转换企业微信部门数据失败:%s", err.Error()))
}
// 2.将部门这个数组进行拆分,一组是父ID为1的,一组是父ID不为1的
var firstDepts []*model.Group // 父ID为1的部门
var otherDepts []*model.Group // 父ID不为1的部门

// 2.将远程数据转换成树
deptTree := GroupListToTree(fmt.Sprintf("%s_1", config.Conf.WeCom.Flag), depts)

// 3.根据树进行创建
err = d.addDepts(deptTree.Children)

return nil, err
}

// 添加部门
func (d WeComLogic) addDepts(depts []*model.Group) error {
for _, dept := range depts {
if dept.SourceDeptId == fmt.Sprintf("%s_1", config.Conf.WeCom.Flag) { // 跳过ID为1的根部门,由系统配置的根部门进行占位
continue
}
if dept.SourceDeptParentId == fmt.Sprintf("%s_1", config.Conf.WeCom.Flag) {
firstDepts = append(firstDepts, dept)
} else {
otherDepts = append(otherDepts, dept)
}
}
// 3.先写父ID为1的,再写父ID不为1的
for _, dept := range firstDepts {
err := d.AddDepts(dept)
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("SyncWeComDepts添加根部门失败:%s", err.Error()))
return tools.NewOperationError(fmt.Errorf("DsyncWeComDepts添加部门失败: %s", err.Error()))
}
}

for _, dept := range otherDepts {
err := d.AddDepts(dept)
if err != nil {
return nil, tools.NewOperationError(fmt.Errorf("SyncWeComDepts添加其他部门失败:%s", err.Error()))
if len(dept.Children) != 0 {
err = d.addDepts(dept.Children)
if err != nil {
return tools.NewOperationError(fmt.Errorf("DsyncWeComDepts添加部门失败: %s", err.Error()))
}
}
}
return nil, nil
return nil
}

// AddGroup 添加部门数据
Expand Down
2 changes: 1 addition & 1 deletion public/client/openldap/openldap.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func GetAllDepts() (ret []*Dept, err error) {
ele.Id = strings.Split(strings.Split(v.DN, ",")[0], "=")[1]
ele.Remark = v.GetAttributeValue("description")
if len(strings.Split(v.DN, ","))-len(strings.Split(config.Conf.Ldap.BaseDN, ",")) == 1 {
ele.ParentId = "openldap_0"
ele.ParentId = "0"
} else {
ele.ParentId = strings.Split(strings.Split(v.DN, ",")[1], "=")[1]
}
Expand Down
22 changes: 17 additions & 5 deletions public/common/init_mysql_data.go
Original file line number Diff line number Diff line change
Expand Up @@ -702,35 +702,47 @@ func InitData() {
groups := []model.Group{
{
Model: gorm.Model{ID: 1},
GroupName: "root",
Remark: "Base",
Creator: "system",
GroupType: "ou",
ParentId: 0,
SourceDeptId: "0",
Source: "openldap",
SourceDeptParentId: "0",
GroupDN: config.Conf.Ldap.BaseDN,
},
{
Model: gorm.Model{ID: 2},
GroupName: config.Conf.DingTalk.Flag + "root",
Remark: "钉钉根部门",
Creator: "system",
GroupType: "ou",
ParentId: 0,
ParentId: 1,
SourceDeptId: fmt.Sprintf("%s_%d", config.Conf.DingTalk.Flag, 1),
Source: config.Conf.DingTalk.Flag,
SourceDeptParentId: fmt.Sprintf("%s_%d", config.Conf.DingTalk.Flag, 0),
GroupDN: fmt.Sprintf("ou=%s,%s", config.Conf.DingTalk.Flag+"root", config.Conf.Ldap.BaseDN),
},
{
Model: gorm.Model{ID: 2},
Model: gorm.Model{ID: 3},
GroupName: "wecomroot",
Remark: "企业微信根部门",
Creator: "system",
GroupType: "ou",
ParentId: 0,
ParentId: 1,
SourceDeptId: fmt.Sprintf("%s_%d", config.Conf.WeCom.Flag, 1),
Source: config.Conf.WeCom.Flag,
SourceDeptParentId: fmt.Sprintf("%s_%d", config.Conf.WeCom.Flag, 0),
GroupDN: fmt.Sprintf("ou=%s,%s", config.Conf.WeCom.Flag+"root", config.Conf.Ldap.BaseDN),
},
{
Model: gorm.Model{ID: 3},
Model: gorm.Model{ID: 4},
GroupName: config.Conf.FeiShu.Flag + "root",
Remark: "飞书根部门",
Creator: "system",
GroupType: "ou",
ParentId: 0,
ParentId: 1,
SourceDeptId: fmt.Sprintf("%s_%d", config.Conf.FeiShu.Flag, 0),
Source: config.Conf.FeiShu.Flag,
SourceDeptParentId: fmt.Sprintf("%s_%d", config.Conf.FeiShu.Flag, 0),
Expand Down

0 comments on commit 1d0df89

Please sign in to comment.