diff --git a/go.mod b/go.mod index 4fdede54..d19566e4 100644 --- a/go.mod +++ b/go.mod @@ -65,3 +65,5 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gorm.io/driver/mysql v1.5.2 // indirect ) + +replace github.com/eolinker/ap-account => ../../eolinker/ap-account diff --git a/go.sum b/go.sum index ec096922..e5f82c34 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,6 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eolinker/ap-account v1.0.8 h1:HDU7WdxWu7HU8zBJc8z2itbfh89KrFfXwJHP/WtGG3Q= -github.com/eolinker/ap-account v1.0.8/go.mod h1:5lsZwkQfnHO5YJ3Cu6X1PZwZ0gbmJBUcix0hxG8aEsY= github.com/eolinker/eosc v0.17.3 h1:sr2yT+v/AsqEdciRaaZZj0zL9pTufR5RvDW6+65hraQ= github.com/eolinker/eosc v0.17.3/go.mod h1:xgq816hpanlMXFtZw7Ztdctb1eEk9UPHchY4NfFO6Cw= github.com/eolinker/go-common v1.0.2 h1:rGxcrDdHr+mtMHVPdz3tx7oOsKLo0Msy6W0U1ZNsXaQ= diff --git a/module/my-team/dto/output.go b/module/my-team/dto/output.go index 883ca3ae..fad66bc8 100644 --- a/module/my-team/dto/output.go +++ b/module/my-team/dto/output.go @@ -67,12 +67,13 @@ type Member struct { IsDelete bool `json:"is_delete"` } -func ToMember(model *team_member.Member, roles ...string) *Member { - +func ToMember(model *team_member.Member, userId string, roles ...string) *Member { + return &Member{ User: auto.UUID(model.UID), Roles: auto.List(roles), AttachTime: auto.TimeLabel(model.CreateTime), + IsDelete: userId != model.UID, } } diff --git a/module/my-team/iml.go b/module/my-team/iml.go index 053e5d1c..f5721776 100644 --- a/module/my-team/iml.go +++ b/module/my-team/iml.go @@ -4,21 +4,21 @@ import ( "context" "errors" "fmt" - + "github.com/eolinker/ap-account/service/role" - + "gorm.io/gorm" - + department_member "github.com/eolinker/ap-account/service/department-member" "github.com/eolinker/go-common/auto" - + "github.com/eolinker/ap-account/service/user" - + "github.com/eolinker/go-common/store" - + "github.com/APIParkLab/APIPark/service/service" team_member "github.com/APIParkLab/APIPark/service/team-member" - + team_dto "github.com/APIParkLab/APIPark/module/my-team/dto" "github.com/APIParkLab/APIPark/service/team" "github.com/eolinker/go-common/utils" @@ -44,11 +44,15 @@ func (m *imlTeamModule) UpdateMemberRole(ctx context.Context, id string, input * if err != nil { return err } + supperRole, err := m.roleService.GetSupperRole(ctx, role.GroupTeam) + if err != nil { + return err + } return m.transaction.Transaction(ctx, func(ctx context.Context) error { if len(input.Roles) < 1 { return errors.New("at least one role") } - + err = m.roleMemberService.RemoveUserRole(ctx, role.TeamTarget(id), input.Users...) if err != nil { return err @@ -65,6 +69,14 @@ func (m *imlTeamModule) UpdateMemberRole(ctx context.Context, id string, input * } } } + + count, err := m.roleMemberService.CountByRole(ctx, role.TeamTarget(id), supperRole.Id) + if err != nil { + return err + } + if count < 1 { + return fmt.Errorf("role(%s) must have at least one member", supperRole.Name) + } return nil }) } @@ -74,7 +86,7 @@ func (m *imlTeamModule) GetTeam(ctx context.Context, id string) (*team_dto.Team, if err != nil { return nil, err } - + return &team_dto.Team{ Id: tv.Id, Name: tv.Name, @@ -110,7 +122,7 @@ func (m *imlTeamModule) Search(ctx context.Context, keyword string) ([]*team_dto if err != nil { return nil, err } - + outList := make([]*team_dto.Item, 0, len(list)) for _, v := range list { outList = append(outList, team_dto.ToItem(v, serviceNumMap[v.Id], appNumMap[v.Id])) @@ -138,7 +150,7 @@ func (m *imlTeamModule) Edit(ctx context.Context, id string, input *team_dto.Edi Description: input.Description, }) }) - + if err != nil { return nil, err } @@ -161,7 +173,7 @@ func (m *imlTeamModule) SimpleTeams(ctx context.Context, keyword string) ([]*tea if err != nil { return nil, err } - + projects, err := m.serviceService.Search(ctx, "", map[string]interface{}{ "team": teamIDs, }) @@ -181,7 +193,7 @@ func (m *imlTeamModule) SimpleTeams(ctx context.Context, keyword string) ([]*tea appCount[p.Team]++ } } - + outList := utils.SliceToSlice(list, func(s *team.Team) *team_dto.SimpleTeam { return &team_dto.SimpleTeam{ Id: s.Id, @@ -216,7 +228,7 @@ func (m *imlTeamModule) AddMember(ctx context.Context, id string, uuids ...strin } return nil }) - + } func (m *imlTeamModule) RemoveMember(ctx context.Context, id string, uuids ...string) error { @@ -224,7 +236,7 @@ func (m *imlTeamModule) RemoveMember(ctx context.Context, id string, uuids ...st if err != nil { return err } - + supperRole, err := m.roleService.GetSupperRole(ctx, role.GroupTeam) if err != nil { return err @@ -244,12 +256,12 @@ func (m *imlTeamModule) RemoveMember(ctx context.Context, id string, uuids ...st supperRoleCount++ } } - + if supperRoleCount == int(count) { return errors.New("can not delete all team admin") } } - + return m.transaction.Transaction(ctx, func(ctx context.Context) error { err = m.roleMemberService.RemoveUserRole(ctx, role.TeamTarget(id), uuids...) if err != nil { @@ -257,7 +269,7 @@ func (m *imlTeamModule) RemoveMember(ctx context.Context, id string, uuids ...st } return m.teamMemberService.RemoveMemberFrom(ctx, id, uuids...) }) - + } func (m *imlTeamModule) Members(ctx context.Context, id string, keyword string) ([]*team_dto.Member, error) { @@ -286,12 +298,12 @@ func (m *imlTeamModule) Members(ctx context.Context, id string, keyword string) roleMemberMap := utils.SliceToMapArrayO(roleMembers, func(r *role.Member) (string, string) { return r.User, r.Role }) - + uId := utils.UserId(ctx) out := make([]*team_dto.Member, 0, len(members)) for _, member := range members { - out = append(out, team_dto.ToMember(member, roleMemberMap[member.UID]...)) + out = append(out, team_dto.ToMember(member, uId, roleMemberMap[member.UID]...)) } - + return out, nil } @@ -331,20 +343,20 @@ func (m *imlTeamModule) SimpleMembers(ctx context.Context, id string, keyword st } departmentMemberMap[member.UID] = append(departmentMemberMap[member.UID], member.Come) } - + out := make([]*team_dto.SimpleMember, 0, len(teamMembers)) for _, member := range teamMembers { u, ok := userMap[member.UID] if !ok { continue } - + out = append(out, &team_dto.SimpleMember{ User: auto.UUID(u.UID), Mail: u.Email, Department: auto.List(departmentMemberMap[member.UID]), }) } - + return out, nil }