diff --git a/pkg/abac/pap/group.go b/pkg/abac/pap/group.go index 94463041..711d0fa9 100644 --- a/pkg/abac/pap/group.go +++ b/pkg/abac/pap/group.go @@ -238,18 +238,20 @@ func (c *groupController) CheckSubjectEffectGroups( } groupIDBelong[groupID] = map[string]interface{}{ - "belong": true, - "expired_at": group.ExpiredAt, - "created_at": group.CreatedAt, + "belong": true, + "expired_at": group.ExpiredAt, + "created_at": group.CreatedAt, + "is_direct_added": group.IsDirectAdded, } } for _, groupID := range groupIDs { if _, ok := groupIDBelong[groupID]; !ok { groupIDBelong[groupID] = map[string]interface{}{ - "belong": false, - "expired_at": 0, - "created_at": time.Time{}, + "belong": false, + "expired_at": 0, + "created_at": time.Time{}, + "is_direct_added": false, } } } diff --git a/pkg/abac/pap/group_test.go b/pkg/abac/pap/group_test.go index 44d57e8a..100298db 100644 --- a/pkg/abac/pap/group_test.go +++ b/pkg/abac/pap/group_test.go @@ -416,7 +416,7 @@ var _ = Describe("GroupController", func() { It("ok, all groupID valid", func() { mockGroupService := mock.NewMockGroupService(ctl) mockGroupService.EXPECT().ListEffectSubjectGroupsBySubjectPKGroupPKs(gomock.Any(), gomock.Any()).Return( - []types.SubjectGroup{{ + []types.SubjectGroupWithSource{{ GroupPK: 10, ExpiredAt: 1, CreatedAt: time.Time{}, @@ -435,21 +435,23 @@ var _ = Describe("GroupController", func() { assert.NoError(GinkgoT(), err) assert.Len(GinkgoT(), groupIDBelong, 2) assert.Equal(GinkgoT(), map[string]interface{}{ - "belong": true, - "expired_at": int64(1), - "created_at": time.Time{}, + "belong": true, + "expired_at": int64(1), + "created_at": time.Time{}, + "is_direct_added": false, }, groupIDBelong["10"]) assert.Equal(GinkgoT(), map[string]interface{}{ - "belong": false, - "expired_at": 0, - "created_at": time.Time{}, + "belong": false, + "expired_at": 0, + "created_at": time.Time{}, + "is_direct_added": false, }, groupIDBelong["20"]) }) It("ok, has invalid groupID", func() { mockGroupService := mock.NewMockGroupService(ctl) mockGroupService.EXPECT().ListEffectSubjectGroupsBySubjectPKGroupPKs(gomock.Any(), gomock.Any()).Return( - []types.SubjectGroup{{ + []types.SubjectGroupWithSource{{ GroupPK: 10, ExpiredAt: 1, }, { @@ -466,19 +468,22 @@ var _ = Describe("GroupController", func() { assert.NoError(GinkgoT(), err) assert.Len(GinkgoT(), groupIDBelong, 3) assert.Equal(GinkgoT(), map[string]interface{}{ - "belong": true, - "expired_at": int64(1), - "created_at": time.Time{}, + "belong": true, + "expired_at": int64(1), + "created_at": time.Time{}, + "is_direct_added": false, }, groupIDBelong["10"]) assert.Equal(GinkgoT(), map[string]interface{}{ - "belong": false, - "expired_at": 0, - "created_at": time.Time{}, + "belong": false, + "expired_at": 0, + "created_at": time.Time{}, + "is_direct_added": false, }, groupIDBelong["20"]) assert.Equal(GinkgoT(), map[string]interface{}{ - "belong": false, - "expired_at": 0, - "created_at": time.Time{}, + "belong": false, + "expired_at": 0, + "created_at": time.Time{}, + "is_direct_added": false, }, groupIDBelong["invalid"]) }) }) diff --git a/pkg/service/group.go b/pkg/service/group.go index 32ad69f6..2eb775c9 100644 --- a/pkg/service/group.go +++ b/pkg/service/group.go @@ -47,7 +47,10 @@ type GroupService interface { ListPagingSubjectSystemGroups( subjectPK int64, systemID string, beforeExpiredAt, limit, offset int64, ) ([]types.SubjectGroup, error) - ListEffectSubjectGroupsBySubjectPKGroupPKs(subjectPK int64, groupPKs []int64) ([]types.SubjectGroup, error) + ListEffectSubjectGroupsBySubjectPKGroupPKs( + subjectPK int64, + groupPKs []int64, + ) ([]types.SubjectGroupWithSource, error) FilterGroupPKsHasMemberBeforeExpiredAt(groupPKs []int64, expiredAt int64) ([]int64, error) BulkDeleteBySubjectPKsWithTx(tx *sqlx.Tx, subjectPKs []int64) error @@ -280,7 +283,7 @@ func (l *groupService) FilterGroupPKsHasMemberBeforeExpiredAt( func (l *groupService) ListEffectSubjectGroupsBySubjectPKGroupPKs( subjectPK int64, groupPKs []int64, -) (subjectGroups []types.SubjectGroup, err error) { +) (subjectGroups []types.SubjectGroupWithSource, err error) { errorWrapf := errorx.NewLayerFunctionErrorWrapf(GroupSVC, "ListEffectSubjectGroupsBySubjectPKGroupPKs") relations, err := l.manager.ListRelationBySubjectPKGroupPKs(subjectPK, groupPKs) @@ -303,9 +306,15 @@ func (l *groupService) ListEffectSubjectGroupsBySubjectPKGroupPKs( groupPKset := set.NewInt64Set() - subjectGroups = make([]types.SubjectGroup, 0, len(relations)+len(templateRelations)) + subjectGroups = make([]types.SubjectGroupWithSource, 0, len(relations)+len(templateRelations)) for _, r := range relations { - subjectGroups = append(subjectGroups, convertToSubjectGroup(r)) + subjectGroups = append(subjectGroups, types.SubjectGroupWithSource{ + PK: r.PK, + GroupPK: r.GroupPK, + ExpiredAt: r.ExpiredAt, + CreatedAt: r.CreatedAt, + IsDirectAdded: true, + }) groupPKset.Add(r.GroupPK) } @@ -315,7 +324,7 @@ func (l *groupService) ListEffectSubjectGroupsBySubjectPKGroupPKs( continue } - subjectGroups = append(subjectGroups, types.SubjectGroup{ + subjectGroups = append(subjectGroups, types.SubjectGroupWithSource{ PK: r.PK, GroupPK: r.GroupPK, ExpiredAt: r.ExpiredAt, diff --git a/pkg/service/group_test.go b/pkg/service/group_test.go index 4f04803b..77e7e47e 100644 --- a/pkg/service/group_test.go +++ b/pkg/service/group_test.go @@ -460,9 +460,10 @@ var _ = Describe("GroupService", func() { subjectGroups, err := manager.ListEffectSubjectGroupsBySubjectPKGroupPKs(int64(123), []int64{1}) assert.NoError(GinkgoT(), err) - assert.ElementsMatch(GinkgoT(), []types.SubjectGroup{{ - GroupPK: 1, - ExpiredAt: 1, + assert.ElementsMatch(GinkgoT(), []types.SubjectGroupWithSource{{ + GroupPK: 1, + ExpiredAt: 1, + IsDirectAdded: true, }, { GroupPK: 2, ExpiredAt: 1, diff --git a/pkg/service/mock/group.go b/pkg/service/mock/group.go index 2d4b8dd5..7bac86b0 100644 --- a/pkg/service/mock/group.go +++ b/pkg/service/mock/group.go @@ -285,10 +285,10 @@ func (mr *MockGroupServiceMockRecorder) GetTemplateGroupMemberCount(groupPK, tem } // ListEffectSubjectGroupsBySubjectPKGroupPKs mocks base method. -func (m *MockGroupService) ListEffectSubjectGroupsBySubjectPKGroupPKs(subjectPK int64, groupPKs []int64) ([]types.SubjectGroup, error) { +func (m *MockGroupService) ListEffectSubjectGroupsBySubjectPKGroupPKs(subjectPK int64, groupPKs []int64) ([]types.SubjectGroupWithSource, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListEffectSubjectGroupsBySubjectPKGroupPKs", subjectPK, groupPKs) - ret0, _ := ret[0].([]types.SubjectGroup) + ret0, _ := ret[0].([]types.SubjectGroupWithSource) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/pkg/service/types/subject.go b/pkg/service/types/subject.go index f362d235..bd192aa4 100644 --- a/pkg/service/types/subject.go +++ b/pkg/service/types/subject.go @@ -42,6 +42,15 @@ type SubjectGroup struct { CreatedAt time.Time `json:"created_at"` } +// SubjectGroup subject关联的组 +type SubjectGroupWithSource struct { + PK int64 `json:"pk"` + GroupPK int64 `json:"group_pk"` + ExpiredAt int64 `json:"expired_at"` + CreatedAt time.Time `json:"created_at"` + IsDirectAdded bool `json:"is_direct_added"` +} + // GroupSubject 关系数据 type GroupSubject struct { SubjectPK int64 `json:"subject_pk"`