diff --git a/.golangci.yaml b/.golangci.yaml index 3f78cd3..3cc10f2 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -118,11 +118,12 @@ issues: - contextcheck exclude-dirs: - - internal/model - - internal/mock + - internal/logic exclude-files: - .*_test.go + - permission_tree.go + - role_permission.go diff --git a/permission.go b/permission.go index c0be72c..9024563 100644 --- a/permission.go +++ b/permission.go @@ -2,7 +2,8 @@ package main import ( "flag" - "fmt" + + "github.com/zeromicro/go-zero/core/logx" "code.30cm.net/digimon/app-cloudep-permission-server/gen_result/pb/permission" "code.30cm.net/digimon/app-cloudep-permission-server/internal/config" @@ -34,6 +35,6 @@ func main() { }) defer s.Stop() - fmt.Printf("Starting rpc server at %s...\n", c.ListenOn) + logx.Infof("Starting rpc server at %s...\n", c.ListenOn) s.Start() } diff --git a/pkg/domain/entity/role.go b/pkg/domain/entity/role.go index 9e76b8d..8fcc3de 100644 --- a/pkg/domain/entity/role.go +++ b/pkg/domain/entity/role.go @@ -5,23 +5,22 @@ import ( "go.mongodb.org/mongo-driver/bson/primitive" ) +// 1. UID (使用者ID) // -//1. UID (使用者ID) +// 這個欄位通常代表創建這個角色的使用者,可能的用途: +// • 追蹤角色的建立者:確保知道誰創建了這個角色。 +// • 限定角色的管理範圍:例如,只有 UID 對應的使用者可以修改或刪除這個角色。 +// • 支援多租戶 (Multi-Tenancy):如果一個 UID 只能看到自己創建的角色,那這個系統可能是多租戶架構的一部分。 // -//這個欄位通常代表創建這個角色的使用者,可能的用途: -//• 追蹤角色的建立者:確保知道誰創建了這個角色。 -//• 限定角色的管理範圍:例如,只有 UID 對應的使用者可以修改或刪除這個角色。 -//• 支援多租戶 (Multi-Tenancy):如果一個 UID 只能看到自己創建的角色,那這個系統可能是多租戶架構的一部分。 +// 2. ClientID (客戶端ID) // -//2. ClientID (客戶端ID) -// -//這個欄位通常代表該角色所屬的應用程式或客戶端,可能的用途: -//• 多租戶架構 (Multi-Tenancy):不同 ClientID 的角色可能互相隔離,確保不同組織不會影響彼此的角色權限。 -//• 對應 OAuth 2.0 或 OpenID Connect: -//• 在 OAuth2 / OIDC 的架構下,每個應用程式 (client_id) 可能有不同的角色和權限。 -//• 例如,client_id 為 web-app-1 的角色與 client_id 為 mobile-app-1 的角色可能完全不同。 -//• API 權限控制: -//• ClientID 可能是用來限制某些角色只能在特定應用程式中被使用,例如 Web 端和行動端的角色不同。 +// 這個欄位通常代表該角色所屬的應用程式或客戶端,可能的用途: +// • 多租戶架構 (Multi-Tenancy):不同 ClientID 的角色可能互相隔離,確保不同組織不會影響彼此的角色權限。 +// • 對應 OAuth 2.0 或 OpenID Connect: +// • 在 OAuth2 / OIDC 的架構下,每個應用程式 (client_id) 可能有不同的角色和權限。 +// • 例如,client_id 為 web-app-1 的角色與 client_id 為 mobile-app-1 的角色可能完全不同。 +// • API 權限控制: +// • ClientID 可能是用來限制某些角色只能在特定應用程式中被使用,例如 Web 端和行動端的角色不同。 // Role 是這樣,如果有綁定某個 UID type Role struct { diff --git a/pkg/domain/error.go b/pkg/domain/error.go index 140f571..10f7ba6 100644 --- a/pkg/domain/error.go +++ b/pkg/domain/error.go @@ -20,6 +20,16 @@ const ( TokenGetErrorCode FailedToGetRolePermission + FailedToGetUserRole + FailedToGetUserRoleByUID + FailedToCreateUserRole + FailedToUpdateUserRole + FailedToListRole + FailedToGetRoleByID + FailedToGetRoleByUID + FailedToCreateRole + FailedToUpdateRole + FailedToDelRole ) func TokenError(ec ers.ErrorCode, s ...string) *ers.LibError { diff --git a/pkg/domain/rbac/rule_test.go b/pkg/domain/rbac/rule_test.go index 73c74a1..d37163e 100644 --- a/pkg/domain/rbac/rule_test.go +++ b/pkg/domain/rbac/rule_test.go @@ -1,8 +1,9 @@ package rbac import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func TestRule_ToString(t *testing.T) { diff --git a/pkg/domain/repository/permission.go b/pkg/domain/repository/permission.go index ed8c122..9aa5f15 100644 --- a/pkg/domain/repository/permission.go +++ b/pkg/domain/repository/permission.go @@ -1,9 +1,10 @@ package repository import ( + "context" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" - "context" "go.mongodb.org/mongo-driver/mongo" ) diff --git a/pkg/domain/repository/role.go b/pkg/domain/repository/role.go index bde3a61..48410ee 100644 --- a/pkg/domain/repository/role.go +++ b/pkg/domain/repository/role.go @@ -1,9 +1,10 @@ package repository import ( + "context" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" - "context" "go.mongodb.org/mongo-driver/mongo" ) diff --git a/pkg/domain/repository/role_permission.go b/pkg/domain/repository/role_permission.go index c0611a6..6e8f309 100644 --- a/pkg/domain/repository/role_permission.go +++ b/pkg/domain/repository/role_permission.go @@ -1,8 +1,9 @@ package repository import ( - "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "context" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "go.mongodb.org/mongo-driver/mongo" ) diff --git a/pkg/domain/repository/user_role.go b/pkg/domain/repository/user_role.go index b589355..1126925 100644 --- a/pkg/domain/repository/user_role.go +++ b/pkg/domain/repository/user_role.go @@ -1,8 +1,9 @@ package repository import ( - "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "context" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "go.mongodb.org/mongo-driver/mongo" ) diff --git a/pkg/domain/token/additional.go b/pkg/domain/token/additional.go index d13874a..f1535d9 100644 --- a/pkg/domain/token/additional.go +++ b/pkg/domain/token/additional.go @@ -30,6 +30,7 @@ var validAdditionalKeys = map[Additional]struct{}{ // IsValidAdditional 檢查是否是有效的 Additional Key func IsValidAdditional(key Additional) bool { _, exists := validAdditionalKeys[key] + return exists } diff --git a/pkg/domain/token/additional_test.go b/pkg/domain/token/additional_test.go index daf7683..357eb6d 100644 --- a/pkg/domain/token/additional_test.go +++ b/pkg/domain/token/additional_test.go @@ -1,8 +1,9 @@ package token import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func TestAdditional_String(t *testing.T) { diff --git a/pkg/domain/token/scope_test.go b/pkg/domain/token/scope_test.go index fe2df14..89de9ce 100644 --- a/pkg/domain/token/scope_test.go +++ b/pkg/domain/token/scope_test.go @@ -1,8 +1,9 @@ package token import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func TestTScope_ToString(t *testing.T) { diff --git a/pkg/domain/token/type_test.go b/pkg/domain/token/type_test.go index 6eb449e..c0bafed 100644 --- a/pkg/domain/token/type_test.go +++ b/pkg/domain/token/type_test.go @@ -1,8 +1,9 @@ package token import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func TestType_ToString(t *testing.T) { diff --git a/pkg/domain/usecase/permission.go b/pkg/domain/usecase/permission.go index 247fff7..31eea6c 100644 --- a/pkg/domain/usecase/permission.go +++ b/pkg/domain/usecase/permission.go @@ -1,9 +1,10 @@ package usecase import ( + "context" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" - "context" ) type PermissionUseCase interface { diff --git a/pkg/domain/usecase/role.go b/pkg/domain/usecase/role.go index 4680135..d587532 100644 --- a/pkg/domain/usecase/role.go +++ b/pkg/domain/usecase/role.go @@ -1,8 +1,9 @@ package usecase import ( - "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" "context" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" ) type RoleUseCase interface { @@ -35,8 +36,8 @@ type Role struct { } type CreateRoleReq struct { - Name *string `json:"name"` // 角色名稱 - UID *string `json:"uid"` - ClientID *string `json:"client_id"` - Status *permission.Status `json:"status"` // 例如 1: 啟用, 0: 停用 + Name string `json:"name"` // 角色名稱 + UID string `json:"uid"` + ClientID string `json:"client_id"` + Status permission.Status `json:"status"` // 例如 1: 啟用, 0: 停用 } diff --git a/pkg/domain/usecase/role_permission.go b/pkg/domain/usecase/role_permission.go index 7491343..9484078 100644 --- a/pkg/domain/usecase/role_permission.go +++ b/pkg/domain/usecase/role_permission.go @@ -1,16 +1,17 @@ package usecase import ( - "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" "context" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" ) type RolePermissionUseCase interface { - Get(ctx context.Context, roleID int64) (permission.Permissions, error) + Get(ctx context.Context, roleID string) (permission.Permissions, error) GetByRoleUID(ctx context.Context, uid string) (permission.Permissions, error) GetByUser(ctx context.Context, uid string) (UserPermission, error) - Create(ctx context.Context, roleID int64, permissions permission.Permissions) error - Delete(ctx context.Context, roleID int64, permissions permission.Permissions) error + Create(ctx context.Context, roleID string, permissions permission.Permissions) error + Delete(ctx context.Context, roleID string, permissions permission.Permissions) error List(ctx context.Context, req ListQuery) (RoleResp, error) } diff --git a/pkg/domain/usecase/user_role.go b/pkg/domain/usecase/user_role.go index e8194e1..9cb8863 100644 --- a/pkg/domain/usecase/user_role.go +++ b/pkg/domain/usecase/user_role.go @@ -6,7 +6,7 @@ type UserRoleUseCase interface { Select(ctx context.Context, filter UserRoleFilter) ([]UserRole, error) Get(ctx context.Context, uid string) (UserRole, error) Create(ctx context.Context, uid, roleID string) (UserRole, error) - Delete(ctx context.Context, uid, roleID string) error + Update(ctx context.Context, uid, roleID string) error } type UserRole struct { diff --git a/pkg/mock/repository/permission.go b/pkg/mock/repository/permission.go new file mode 100644 index 0000000..4470315 --- /dev/null +++ b/pkg/mock/repository/permission.go @@ -0,0 +1,285 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./pkg/domain/repository/permission.go +// +// Generated by this command: +// +// mockgen -source=./pkg/domain/repository/permission.go -destination=./pkg/mock/repository/permission.go -package=mock +// + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + entity "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" + permission "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" + repository "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" + mongo "go.mongodb.org/mongo-driver/mongo" + gomock "go.uber.org/mock/gomock" +) + +// MockPermissionRepository is a mock of PermissionRepository interface. +type MockPermissionRepository struct { + ctrl *gomock.Controller + recorder *MockPermissionRepositoryMockRecorder + isgomock struct{} +} + +// MockPermissionRepositoryMockRecorder is the mock recorder for MockPermissionRepository. +type MockPermissionRepositoryMockRecorder struct { + mock *MockPermissionRepository +} + +// NewMockPermissionRepository creates a new mock instance. +func NewMockPermissionRepository(ctrl *gomock.Controller) *MockPermissionRepository { + mock := &MockPermissionRepository{ctrl: ctrl} + mock.recorder = &MockPermissionRepositoryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockPermissionRepository) EXPECT() *MockPermissionRepositoryMockRecorder { + return m.recorder +} + +// Delete mocks base method. +func (m *MockPermissionRepository) Delete(ctx context.Context, id string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", ctx, id) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *MockPermissionRepositoryMockRecorder) Delete(ctx, id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockPermissionRepository)(nil).Delete), ctx, id) +} + +// FindByNames mocks base method. +func (m *MockPermissionRepository) FindByNames(ctx context.Context, names []string) ([]entity.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FindByNames", ctx, names) + ret0, _ := ret[0].([]entity.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindByNames indicates an expected call of FindByNames. +func (mr *MockPermissionRepositoryMockRecorder) FindByNames(ctx, names any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindByNames", reflect.TypeOf((*MockPermissionRepository)(nil).FindByNames), ctx, names) +} + +// FindOne mocks base method. +func (m *MockPermissionRepository) FindOne(ctx context.Context, query repository.PermissionQuery) (entity.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FindOne", ctx, query) + ret0, _ := ret[0].(entity.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindOne indicates an expected call of FindOne. +func (mr *MockPermissionRepositoryMockRecorder) FindOne(ctx, query any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindOne", reflect.TypeOf((*MockPermissionRepository)(nil).FindOne), ctx, query) +} + +// GetAll mocks base method. +func (m *MockPermissionRepository) GetAll(ctx context.Context, status *permission.Status) ([]entity.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAll", ctx, status) + ret0, _ := ret[0].([]entity.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAll indicates an expected call of GetAll. +func (mr *MockPermissionRepositoryMockRecorder) GetAll(ctx, status any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAll", reflect.TypeOf((*MockPermissionRepository)(nil).GetAll), ctx, status) +} + +// GetAllIntoIDMap mocks base method. +func (m *MockPermissionRepository) GetAllIntoIDMap(ctx context.Context, status *permission.Status) (map[string]entity.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAllIntoIDMap", ctx, status) + ret0, _ := ret[0].(map[string]entity.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAllIntoIDMap indicates an expected call of GetAllIntoIDMap. +func (mr *MockPermissionRepositoryMockRecorder) GetAllIntoIDMap(ctx, status any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllIntoIDMap", reflect.TypeOf((*MockPermissionRepository)(nil).GetAllIntoIDMap), ctx, status) +} + +// Index20250214UP mocks base method. +func (m *MockPermissionRepository) Index20250214UP(ctx context.Context) (*mongo.Cursor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index20250214UP", ctx) + ret0, _ := ret[0].(*mongo.Cursor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Index20250214UP indicates an expected call of Index20250214UP. +func (mr *MockPermissionRepositoryMockRecorder) Index20250214UP(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index20250214UP", reflect.TypeOf((*MockPermissionRepository)(nil).Index20250214UP), ctx) +} + +// Insert mocks base method. +func (m *MockPermissionRepository) Insert(ctx context.Context, permission entity.Permission) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Insert", ctx, permission) + ret0, _ := ret[0].(error) + return ret0 +} + +// Insert indicates an expected call of Insert. +func (mr *MockPermissionRepositoryMockRecorder) Insert(ctx, permission any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockPermissionRepository)(nil).Insert), ctx, permission) +} + +// Update mocks base method. +func (m *MockPermissionRepository) Update(ctx context.Context, id string, req repository.UpdatePermission) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", ctx, id, req) + ret0, _ := ret[0].(error) + return ret0 +} + +// Update indicates an expected call of Update. +func (mr *MockPermissionRepositoryMockRecorder) Update(ctx, id, req any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockPermissionRepository)(nil).Update), ctx, id, req) +} + +// MockGetPermission is a mock of GetPermission interface. +type MockGetPermission struct { + ctrl *gomock.Controller + recorder *MockGetPermissionMockRecorder + isgomock struct{} +} + +// MockGetPermissionMockRecorder is the mock recorder for MockGetPermission. +type MockGetPermissionMockRecorder struct { + mock *MockGetPermission +} + +// NewMockGetPermission creates a new mock instance. +func NewMockGetPermission(ctrl *gomock.Controller) *MockGetPermission { + mock := &MockGetPermission{ctrl: ctrl} + mock.recorder = &MockGetPermissionMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockGetPermission) EXPECT() *MockGetPermissionMockRecorder { + return m.recorder +} + +// FindByNames mocks base method. +func (m *MockGetPermission) FindByNames(ctx context.Context, names []string) ([]entity.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FindByNames", ctx, names) + ret0, _ := ret[0].([]entity.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindByNames indicates an expected call of FindByNames. +func (mr *MockGetPermissionMockRecorder) FindByNames(ctx, names any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindByNames", reflect.TypeOf((*MockGetPermission)(nil).FindByNames), ctx, names) +} + +// FindOne mocks base method. +func (m *MockGetPermission) FindOne(ctx context.Context, query repository.PermissionQuery) (entity.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FindOne", ctx, query) + ret0, _ := ret[0].(entity.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindOne indicates an expected call of FindOne. +func (mr *MockGetPermissionMockRecorder) FindOne(ctx, query any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindOne", reflect.TypeOf((*MockGetPermission)(nil).FindOne), ctx, query) +} + +// GetAll mocks base method. +func (m *MockGetPermission) GetAll(ctx context.Context, status *permission.Status) ([]entity.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAll", ctx, status) + ret0, _ := ret[0].([]entity.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAll indicates an expected call of GetAll. +func (mr *MockGetPermissionMockRecorder) GetAll(ctx, status any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAll", reflect.TypeOf((*MockGetPermission)(nil).GetAll), ctx, status) +} + +// GetAllIntoIDMap mocks base method. +func (m *MockGetPermission) GetAllIntoIDMap(ctx context.Context, status *permission.Status) (map[string]entity.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAllIntoIDMap", ctx, status) + ret0, _ := ret[0].(map[string]entity.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAllIntoIDMap indicates an expected call of GetAllIntoIDMap. +func (mr *MockGetPermissionMockRecorder) GetAllIntoIDMap(ctx, status any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllIntoIDMap", reflect.TypeOf((*MockGetPermission)(nil).GetAllIntoIDMap), ctx, status) +} + +// MockIndex is a mock of Index interface. +type MockIndex struct { + ctrl *gomock.Controller + recorder *MockIndexMockRecorder + isgomock struct{} +} + +// MockIndexMockRecorder is the mock recorder for MockIndex. +type MockIndexMockRecorder struct { + mock *MockIndex +} + +// NewMockIndex creates a new mock instance. +func NewMockIndex(ctrl *gomock.Controller) *MockIndex { + mock := &MockIndex{ctrl: ctrl} + mock.recorder = &MockIndexMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockIndex) EXPECT() *MockIndexMockRecorder { + return m.recorder +} + +// Index20250214UP mocks base method. +func (m *MockIndex) Index20250214UP(ctx context.Context) (*mongo.Cursor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index20250214UP", ctx) + ret0, _ := ret[0].(*mongo.Cursor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Index20250214UP indicates an expected call of Index20250214UP. +func (mr *MockIndexMockRecorder) Index20250214UP(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index20250214UP", reflect.TypeOf((*MockIndex)(nil).Index20250214UP), ctx) +} diff --git a/pkg/mock/repository/role.go b/pkg/mock/repository/role.go new file mode 100644 index 0000000..5e24906 --- /dev/null +++ b/pkg/mock/repository/role.go @@ -0,0 +1,201 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./pkg/domain/repository/role.go +// +// Generated by this command: +// +// mockgen -source=./pkg/domain/repository/role.go -destination=./pkg/mock/repository/role.go -package=mock +// + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + entity "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" + repository "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" + mongo "go.mongodb.org/mongo-driver/mongo" + gomock "go.uber.org/mock/gomock" +) + +// MockRoleRepository is a mock of RoleRepository interface. +type MockRoleRepository struct { + ctrl *gomock.Controller + recorder *MockRoleRepositoryMockRecorder + isgomock struct{} +} + +// MockRoleRepositoryMockRecorder is the mock recorder for MockRoleRepository. +type MockRoleRepositoryMockRecorder struct { + mock *MockRoleRepository +} + +// NewMockRoleRepository creates a new mock instance. +func NewMockRoleRepository(ctrl *gomock.Controller) *MockRoleRepository { + mock := &MockRoleRepository{ctrl: ctrl} + mock.recorder = &MockRoleRepositoryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRoleRepository) EXPECT() *MockRoleRepositoryMockRecorder { + return m.recorder +} + +// All mocks base method. +func (m *MockRoleRepository) All(ctx context.Context, clientID *string) ([]*entity.Role, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "All", ctx, clientID) + ret0, _ := ret[0].([]*entity.Role) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// All indicates an expected call of All. +func (mr *MockRoleRepositoryMockRecorder) All(ctx, clientID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "All", reflect.TypeOf((*MockRoleRepository)(nil).All), ctx, clientID) +} + +// Create mocks base method. +func (m *MockRoleRepository) Create(ctx context.Context, role *entity.Role) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", ctx, role) + ret0, _ := ret[0].(error) + return ret0 +} + +// Create indicates an expected call of Create. +func (mr *MockRoleRepositoryMockRecorder) Create(ctx, role any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockRoleRepository)(nil).Create), ctx, role) +} + +// Delete mocks base method. +func (m *MockRoleRepository) Delete(ctx context.Context, id string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", ctx, id) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *MockRoleRepositoryMockRecorder) Delete(ctx, id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockRoleRepository)(nil).Delete), ctx, id) +} + +// GetByID mocks base method. +func (m *MockRoleRepository) GetByID(ctx context.Context, id string) (*entity.Role, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByID", ctx, id) + ret0, _ := ret[0].(*entity.Role) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByID indicates an expected call of GetByID. +func (mr *MockRoleRepositoryMockRecorder) GetByID(ctx, id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByID", reflect.TypeOf((*MockRoleRepository)(nil).GetByID), ctx, id) +} + +// GetByUID mocks base method. +func (m *MockRoleRepository) GetByUID(ctx context.Context, uid string) (*entity.Role, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByUID", ctx, uid) + ret0, _ := ret[0].(*entity.Role) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByUID indicates an expected call of GetByUID. +func (mr *MockRoleRepositoryMockRecorder) GetByUID(ctx, uid any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByUID", reflect.TypeOf((*MockRoleRepository)(nil).GetByUID), ctx, uid) +} + +// Index20250224UP mocks base method. +func (m *MockRoleRepository) Index20250224UP(ctx context.Context) (*mongo.Cursor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index20250224UP", ctx) + ret0, _ := ret[0].(*mongo.Cursor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Index20250224UP indicates an expected call of Index20250224UP. +func (mr *MockRoleRepositoryMockRecorder) Index20250224UP(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index20250224UP", reflect.TypeOf((*MockRoleRepository)(nil).Index20250224UP), ctx) +} + +// List mocks base method. +func (m *MockRoleRepository) List(ctx context.Context, param repository.ListQuery) ([]*entity.Role, int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "List", ctx, param) + ret0, _ := ret[0].([]*entity.Role) + ret1, _ := ret[1].(int64) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// List indicates an expected call of List. +func (mr *MockRoleRepositoryMockRecorder) List(ctx, param any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockRoleRepository)(nil).List), ctx, param) +} + +// Update mocks base method. +func (m *MockRoleRepository) Update(ctx context.Context, data repository.UpdateReq) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Update", ctx, data) + ret0, _ := ret[0].(error) + return ret0 +} + +// Update indicates an expected call of Update. +func (mr *MockRoleRepositoryMockRecorder) Update(ctx, data any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockRoleRepository)(nil).Update), ctx, data) +} + +// MockRoleIndex is a mock of RoleIndex interface. +type MockRoleIndex struct { + ctrl *gomock.Controller + recorder *MockRoleIndexMockRecorder + isgomock struct{} +} + +// MockRoleIndexMockRecorder is the mock recorder for MockRoleIndex. +type MockRoleIndexMockRecorder struct { + mock *MockRoleIndex +} + +// NewMockRoleIndex creates a new mock instance. +func NewMockRoleIndex(ctrl *gomock.Controller) *MockRoleIndex { + mock := &MockRoleIndex{ctrl: ctrl} + mock.recorder = &MockRoleIndexMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRoleIndex) EXPECT() *MockRoleIndexMockRecorder { + return m.recorder +} + +// Index20250224UP mocks base method. +func (m *MockRoleIndex) Index20250224UP(ctx context.Context) (*mongo.Cursor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index20250224UP", ctx) + ret0, _ := ret[0].(*mongo.Cursor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Index20250224UP indicates an expected call of Index20250224UP. +func (mr *MockRoleIndexMockRecorder) Index20250224UP(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index20250224UP", reflect.TypeOf((*MockRoleIndex)(nil).Index20250224UP), ctx) +} diff --git a/pkg/mock/repository/role_permission.go b/pkg/mock/repository/role_permission.go new file mode 100644 index 0000000..aa7860e --- /dev/null +++ b/pkg/mock/repository/role_permission.go @@ -0,0 +1,155 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./pkg/domain/repository/role_permission.go +// +// Generated by this command: +// +// mockgen -source=./pkg/domain/repository/role_permission.go -destination=./pkg/mock/repository/role_permission.go -package=mock +// + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + entity "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" + mongo "go.mongodb.org/mongo-driver/mongo" + gomock "go.uber.org/mock/gomock" +) + +// MockRolePermissionRepository is a mock of RolePermissionRepository interface. +type MockRolePermissionRepository struct { + ctrl *gomock.Controller + recorder *MockRolePermissionRepositoryMockRecorder + isgomock struct{} +} + +// MockRolePermissionRepositoryMockRecorder is the mock recorder for MockRolePermissionRepository. +type MockRolePermissionRepositoryMockRecorder struct { + mock *MockRolePermissionRepository +} + +// NewMockRolePermissionRepository creates a new mock instance. +func NewMockRolePermissionRepository(ctrl *gomock.Controller) *MockRolePermissionRepository { + mock := &MockRolePermissionRepository{ctrl: ctrl} + mock.recorder = &MockRolePermissionRepositoryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRolePermissionRepository) EXPECT() *MockRolePermissionRepositoryMockRecorder { + return m.recorder +} + +// Create mocks base method. +func (m *MockRolePermissionRepository) Create(ctx context.Context, entity entity.RolePermission) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", ctx, entity) + ret0, _ := ret[0].(error) + return ret0 +} + +// Create indicates an expected call of Create. +func (mr *MockRolePermissionRepositoryMockRecorder) Create(ctx, entity any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockRolePermissionRepository)(nil).Create), ctx, entity) +} + +// Delete mocks base method. +func (m *MockRolePermissionRepository) Delete(ctx context.Context, roleID, permission string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", ctx, roleID, permission) + ret0, _ := ret[0].(error) + return ret0 +} + +// Delete indicates an expected call of Delete. +func (mr *MockRolePermissionRepositoryMockRecorder) Delete(ctx, roleID, permission any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockRolePermissionRepository)(nil).Delete), ctx, roleID, permission) +} + +// Get mocks base method. +func (m *MockRolePermissionRepository) Get(ctx context.Context, roleID string) ([]*entity.RolePermission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", ctx, roleID) + ret0, _ := ret[0].([]*entity.RolePermission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get. +func (mr *MockRolePermissionRepositoryMockRecorder) Get(ctx, roleID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockRolePermissionRepository)(nil).Get), ctx, roleID) +} + +// GetByPermissionID mocks base method. +func (m *MockRolePermissionRepository) GetByPermissionID(ctx context.Context, permissionIDs []string) ([]*entity.RolePermission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByPermissionID", ctx, permissionIDs) + ret0, _ := ret[0].([]*entity.RolePermission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByPermissionID indicates an expected call of GetByPermissionID. +func (mr *MockRolePermissionRepositoryMockRecorder) GetByPermissionID(ctx, permissionIDs any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByPermissionID", reflect.TypeOf((*MockRolePermissionRepository)(nil).GetByPermissionID), ctx, permissionIDs) +} + +// Index20250225UP mocks base method. +func (m *MockRolePermissionRepository) Index20250225UP(ctx context.Context) (*mongo.Cursor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index20250225UP", ctx) + ret0, _ := ret[0].(*mongo.Cursor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Index20250225UP indicates an expected call of Index20250225UP. +func (mr *MockRolePermissionRepositoryMockRecorder) Index20250225UP(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index20250225UP", reflect.TypeOf((*MockRolePermissionRepository)(nil).Index20250225UP), ctx) +} + +// MockRolePermissionIndex is a mock of RolePermissionIndex interface. +type MockRolePermissionIndex struct { + ctrl *gomock.Controller + recorder *MockRolePermissionIndexMockRecorder + isgomock struct{} +} + +// MockRolePermissionIndexMockRecorder is the mock recorder for MockRolePermissionIndex. +type MockRolePermissionIndexMockRecorder struct { + mock *MockRolePermissionIndex +} + +// NewMockRolePermissionIndex creates a new mock instance. +func NewMockRolePermissionIndex(ctrl *gomock.Controller) *MockRolePermissionIndex { + mock := &MockRolePermissionIndex{ctrl: ctrl} + mock.recorder = &MockRolePermissionIndexMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRolePermissionIndex) EXPECT() *MockRolePermissionIndexMockRecorder { + return m.recorder +} + +// Index20250225UP mocks base method. +func (m *MockRolePermissionIndex) Index20250225UP(ctx context.Context) (*mongo.Cursor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index20250225UP", ctx) + ret0, _ := ret[0].(*mongo.Cursor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Index20250225UP indicates an expected call of Index20250225UP. +func (mr *MockRolePermissionIndexMockRecorder) Index20250225UP(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index20250225UP", reflect.TypeOf((*MockRolePermissionIndex)(nil).Index20250225UP), ctx) +} diff --git a/pkg/mock/repository/user_role.go b/pkg/mock/repository/user_role.go new file mode 100644 index 0000000..b2f9dfd --- /dev/null +++ b/pkg/mock/repository/user_role.go @@ -0,0 +1,187 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./pkg/domain/repository/user_role.go +// +// Generated by this command: +// +// mockgen -source=./pkg/domain/repository/user_role.go -destination=./pkg/mock/repository/user_role.go -package=mock +// + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + entity "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" + repository "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" + mongo "go.mongodb.org/mongo-driver/mongo" + gomock "go.uber.org/mock/gomock" +) + +// MockUserRoleRepository is a mock of UserRoleRepository interface. +type MockUserRoleRepository struct { + ctrl *gomock.Controller + recorder *MockUserRoleRepositoryMockRecorder + isgomock struct{} +} + +// MockUserRoleRepositoryMockRecorder is the mock recorder for MockUserRoleRepository. +type MockUserRoleRepositoryMockRecorder struct { + mock *MockUserRoleRepository +} + +// NewMockUserRoleRepository creates a new mock instance. +func NewMockUserRoleRepository(ctrl *gomock.Controller) *MockUserRoleRepository { + mock := &MockUserRoleRepository{ctrl: ctrl} + mock.recorder = &MockUserRoleRepositoryMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockUserRoleRepository) EXPECT() *MockUserRoleRepositoryMockRecorder { + return m.recorder +} + +// CountUsersByRole mocks base method. +func (m *MockUserRoleRepository) CountUsersByRole(ctx context.Context) ([]repository.RoleUserCount, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CountUsersByRole", ctx) + ret0, _ := ret[0].([]repository.RoleUserCount) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CountUsersByRole indicates an expected call of CountUsersByRole. +func (mr *MockUserRoleRepositoryMockRecorder) CountUsersByRole(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CountUsersByRole", reflect.TypeOf((*MockUserRoleRepository)(nil).CountUsersByRole), ctx) +} + +// CreateUserRole mocks base method. +func (m *MockUserRoleRepository) CreateUserRole(ctx context.Context, param entity.UserRole) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateUserRole", ctx, param) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateUserRole indicates an expected call of CreateUserRole. +func (mr *MockUserRoleRepositoryMockRecorder) CreateUserRole(ctx, param any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateUserRole", reflect.TypeOf((*MockUserRoleRepository)(nil).CreateUserRole), ctx, param) +} + +// GetAll mocks base method. +func (m *MockUserRoleRepository) GetAll(ctx context.Context) ([]*entity.UserRole, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAll", ctx) + ret0, _ := ret[0].([]*entity.UserRole) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAll indicates an expected call of GetAll. +func (mr *MockUserRoleRepositoryMockRecorder) GetAll(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAll", reflect.TypeOf((*MockUserRoleRepository)(nil).GetAll), ctx) +} + +// GetByUserID mocks base method. +func (m *MockUserRoleRepository) GetByUserID(ctx context.Context, uid string) (entity.UserRole, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByUserID", ctx, uid) + ret0, _ := ret[0].(entity.UserRole) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByUserID indicates an expected call of GetByUserID. +func (mr *MockUserRoleRepositoryMockRecorder) GetByUserID(ctx, uid any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByUserID", reflect.TypeOf((*MockUserRoleRepository)(nil).GetByUserID), ctx, uid) +} + +// GetUsersByRoleID mocks base method. +func (m *MockUserRoleRepository) GetUsersByRoleID(ctx context.Context, roleID string) ([]entity.UserRole, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUsersByRoleID", ctx, roleID) + ret0, _ := ret[0].([]entity.UserRole) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUsersByRoleID indicates an expected call of GetUsersByRoleID. +func (mr *MockUserRoleRepositoryMockRecorder) GetUsersByRoleID(ctx, roleID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUsersByRoleID", reflect.TypeOf((*MockUserRoleRepository)(nil).GetUsersByRoleID), ctx, roleID) +} + +// Index20250225UP mocks base method. +func (m *MockUserRoleRepository) Index20250225UP(ctx context.Context) (*mongo.Cursor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index20250225UP", ctx) + ret0, _ := ret[0].(*mongo.Cursor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Index20250225UP indicates an expected call of Index20250225UP. +func (mr *MockUserRoleRepositoryMockRecorder) Index20250225UP(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index20250225UP", reflect.TypeOf((*MockUserRoleRepository)(nil).Index20250225UP), ctx) +} + +// UpdateUserRole mocks base method. +func (m *MockUserRoleRepository) UpdateUserRole(ctx context.Context, uid, roleID string) (entity.UserRole, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateUserRole", ctx, uid, roleID) + ret0, _ := ret[0].(entity.UserRole) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateUserRole indicates an expected call of UpdateUserRole. +func (mr *MockUserRoleRepositoryMockRecorder) UpdateUserRole(ctx, uid, roleID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUserRole", reflect.TypeOf((*MockUserRoleRepository)(nil).UpdateUserRole), ctx, uid, roleID) +} + +// MockUserRoleIndex is a mock of UserRoleIndex interface. +type MockUserRoleIndex struct { + ctrl *gomock.Controller + recorder *MockUserRoleIndexMockRecorder + isgomock struct{} +} + +// MockUserRoleIndexMockRecorder is the mock recorder for MockUserRoleIndex. +type MockUserRoleIndexMockRecorder struct { + mock *MockUserRoleIndex +} + +// NewMockUserRoleIndex creates a new mock instance. +func NewMockUserRoleIndex(ctrl *gomock.Controller) *MockUserRoleIndex { + mock := &MockUserRoleIndex{ctrl: ctrl} + mock.recorder = &MockUserRoleIndexMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockUserRoleIndex) EXPECT() *MockUserRoleIndexMockRecorder { + return m.recorder +} + +// Index20250225UP mocks base method. +func (m *MockUserRoleIndex) Index20250225UP(ctx context.Context) (*mongo.Cursor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Index20250225UP", ctx) + ret0, _ := ret[0].(*mongo.Cursor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Index20250225UP indicates an expected call of Index20250225UP. +func (mr *MockUserRoleIndexMockRecorder) Index20250225UP(ctx any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Index20250225UP", reflect.TypeOf((*MockUserRoleIndex)(nil).Index20250225UP), ctx) +} diff --git a/pkg/repository/casbin_redis_adapter.go b/pkg/repository/casbin_redis_adapter.go index 03891f7..9f7f81c 100644 --- a/pkg/repository/casbin_redis_adapter.go +++ b/pkg/repository/casbin_redis_adapter.go @@ -1,15 +1,16 @@ package repository import ( + "context" + "encoding/json" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/rbac" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" - "context" - "encoding/json" "github.com/casbin/casbin/v2/model" "github.com/casbin/casbin/v2/persist" "github.com/zeromicro/go-zero/core/stores/redis" - "time" ) type RBACAdapterParam struct { @@ -144,6 +145,6 @@ func (adapter *rbacAdapter) RemovePolicy(_ string, policyType string, rule []str } // RemoveFilteredPolicy 沒用到先不實作 -func (adapter *rbacAdapter) RemoveFilteredPolicy(_ string, policyType string, fieldIndex int, fieldValues ...string) error { +func (adapter *rbacAdapter) RemoveFilteredPolicy(_ string, _ string, _ int, _ ...string) error { return nil } diff --git a/pkg/repository/casbin_redis_adapter_test.go b/pkg/repository/casbin_redis_adapter_test.go index add446b..ec442c8 100644 --- a/pkg/repository/casbin_redis_adapter_test.go +++ b/pkg/repository/casbin_redis_adapter_test.go @@ -1,13 +1,14 @@ package repository import ( - "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain" - "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/rbac" "context" "encoding/json" + "testing" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/rbac" "github.com/casbin/casbin/v2/model" "github.com/stretchr/testify/assert" - "testing" ) func Test_rbacAdapter_AddPolicy(t *testing.T) { diff --git a/pkg/repository/error.go b/pkg/repository/error.go index 1a5c437..c98cf79 100644 --- a/pkg/repository/error.go +++ b/pkg/repository/error.go @@ -2,6 +2,7 @@ package repository import ( "errors" + "github.com/zeromicro/go-zero/core/stores/mon" ) diff --git a/pkg/repository/permission.go b/pkg/repository/permission.go index e207be3..f84ed90 100644 --- a/pkg/repository/permission.go +++ b/pkg/repository/permission.go @@ -1,17 +1,18 @@ package repository import ( + "context" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" mgo "code.30cm.net/digimon/library-go/mongo" - "context" "github.com/zeromicro/go-zero/core/stores/mon" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" - "time" ) type PermissionRepositoryParam struct { diff --git a/pkg/repository/permission_test.go b/pkg/repository/permission_test.go index 7d68863..6fd5f2b 100644 --- a/pkg/repository/permission_test.go +++ b/pkg/repository/permission_test.go @@ -1,15 +1,16 @@ package repository import ( + "context" + "fmt" + "testing" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" mgo "code.30cm.net/digimon/library-go/mongo" - "context" - "fmt" "github.com/stretchr/testify/assert" "go.mongodb.org/mongo-driver/bson/primitive" - "testing" ) func SetupTestPermissionRepository(db string) (repository.PermissionRepository, func(), error) { diff --git a/pkg/repository/role.go b/pkg/repository/role.go index 0690711..28b73e9 100644 --- a/pkg/repository/role.go +++ b/pkg/repository/role.go @@ -1,17 +1,18 @@ package repository import ( + "context" + "fmt" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" mgo "code.30cm.net/digimon/library-go/mongo" - "context" - "fmt" "github.com/zeromicro/go-zero/core/stores/mon" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" - "time" ) type RoleRepositoryParam struct { diff --git a/pkg/repository/role_permission.go b/pkg/repository/role_permission.go index b13aef2..1ed2ba8 100644 --- a/pkg/repository/role_permission.go +++ b/pkg/repository/role_permission.go @@ -1,15 +1,16 @@ package repository import ( + "context" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" mgo "code.30cm.net/digimon/library-go/mongo" - "context" "github.com/zeromicro/go-zero/core/stores/mon" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" - "time" ) type RolePermissionRepositoryParam struct { diff --git a/pkg/repository/role_permission_test.go b/pkg/repository/role_permission_test.go index 5e09179..48206bb 100644 --- a/pkg/repository/role_permission_test.go +++ b/pkg/repository/role_permission_test.go @@ -1,15 +1,16 @@ package repository import ( + "context" + "fmt" + "testing" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" mgo "code.30cm.net/digimon/library-go/mongo" - "context" - "fmt" "github.com/stretchr/testify/assert" "go.mongodb.org/mongo-driver/bson/primitive" - "testing" - "time" ) func SetupTestRolePermissionRepository(db string) (repository.RolePermissionRepository, func(), error) { diff --git a/pkg/repository/role_test.go b/pkg/repository/role_test.go index 17539ee..0598264 100644 --- a/pkg/repository/role_test.go +++ b/pkg/repository/role_test.go @@ -1,15 +1,16 @@ package repository import ( + "context" + "fmt" + "testing" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" mgo "code.30cm.net/digimon/library-go/mongo" - "context" - "fmt" "github.com/stretchr/testify/assert" "go.mongodb.org/mongo-driver/bson/primitive" - "testing" ) func SetupTestRoleRepository(db string) (repository.RoleRepository, func(), error) { diff --git a/pkg/repository/token.go b/pkg/repository/token.go index 0ab2ef5..9eabb58 100644 --- a/pkg/repository/token.go +++ b/pkg/repository/token.go @@ -47,6 +47,7 @@ func (repo *TokenRepository) setRefreshToken(ctx context.Context, tx redis.Pipel if token.RefreshToken == "" { return nil } + return tx.Set(ctx, domain.GetRefreshTokenRedisKey(token.RefreshToken), token.ID, ttl).Err() } @@ -110,6 +111,7 @@ func (repo *TokenRepository) getTokensBySet(ctx context.Context, setKey string) if errors.Is(err, redis.Nil) { return nil, nil } + return nil, err } @@ -120,11 +122,13 @@ func (repo *TokenRepository) getTokensBySet(ctx context.Context, setKey string) token, err := repo.retrieveToken(ctx, domain.GetAccessTokenRedisKey(id)) if err != nil { tokensToDelete = append(tokensToDelete, id) + continue } if token.ExpiresIn < now { tokensToDelete = append(tokensToDelete, id) + continue } tokens = append(tokens, token) @@ -174,6 +178,7 @@ func (repo *TokenRepository) batchDeleteKeys(ctx context.Context, keys ...string return err } } + return nil }) } @@ -200,6 +205,7 @@ func (repo *TokenRepository) Create(ctx context.Context, token entity.Token) err if err := repo.setTokenRelation(ctx, tx, token.UID, token.DeviceID, token.ID, refreshTTL); err != nil { return err } + return nil }) } @@ -212,6 +218,7 @@ func (repo *TokenRepository) CreateOneTimeToken(ctx context.Context, key string, } _, err = repo.Redis.SetnxExCtx(ctx, domain.GetRefreshTokenRedisKey(key), string(body), int(dt.Seconds())) + return err } @@ -251,6 +258,7 @@ func (repo *TokenRepository) Delete(ctx context.Context, token entity.Token) err domain.GetAccessTokenRedisKey(token.ID), domain.GetRefreshTokenRedisKey(token.RefreshToken), } + return repo.deleteKeysAndRelations(ctx, keys, token.UID, token.DeviceID, token.ID) } @@ -267,6 +275,7 @@ func (repo *TokenRepository) DeleteAccessTokenByID(ctx context.Context, ids []st } _ = repo.deleteKeysAndRelations(ctx, keys, token.UID, token.DeviceID, token.ID) } + return nil } @@ -281,6 +290,7 @@ func (repo *TokenRepository) DeleteAccessTokensByUID(ctx context.Context, uid st return err } } + return nil } @@ -303,6 +313,7 @@ func (repo *TokenRepository) DeleteAccessTokensByDeviceID(ctx context.Context, d for _, token := range tokens { _ = tx.SRem(ctx, domain.GetUIDTokenRedisKey(token.UID), token.ID) } + return nil }); err != nil { return err @@ -313,6 +324,7 @@ func (repo *TokenRepository) DeleteAccessTokensByDeviceID(ctx context.Context, d } _, err = repo.Redis.Del(domain.GetDeviceTokenRedisKey(deviceID)) + return err } diff --git a/pkg/repository/user_role.go b/pkg/repository/user_role.go index a24d1bc..0f17755 100644 --- a/pkg/repository/user_role.go +++ b/pkg/repository/user_role.go @@ -1,16 +1,17 @@ package repository import ( + "context" + "fmt" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" mgo "code.30cm.net/digimon/library-go/mongo" - "context" - "fmt" "github.com/zeromicro/go-zero/core/stores/mon" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" - "time" ) // UserRoleRepositoryParam 定義 MongoDB 配置參數 @@ -106,6 +107,7 @@ func (repo *userRoleRepository) CreateUserRole(ctx context.Context, param entity } _, err := repo.DB.GetClient().InsertOne(ctx, param) + return err } @@ -128,10 +130,9 @@ func (repo *userRoleRepository) UpdateUserRole(ctx context.Context, uid, roleID return updated, nil } - func (repo *userRoleRepository) Index20250225UP(ctx context.Context) (*mongo.Cursor, error) { repo.DB.PopulateIndex(ctx, "role_id", 1, false) - repo.DB.PopulateIndex(ctx, "uid", 1, false) + repo.DB.PopulateIndex(ctx, "uid", 1, true) return repo.DB.GetClient().Indexes().List(ctx) } diff --git a/pkg/repository/user_role_test.go b/pkg/repository/user_role_test.go index ca33626..cdb365a 100644 --- a/pkg/repository/user_role_test.go +++ b/pkg/repository/user_role_test.go @@ -1,15 +1,16 @@ package repository import ( + "context" + "fmt" + "testing" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" mgo "code.30cm.net/digimon/library-go/mongo" - "context" - "fmt" "github.com/stretchr/testify/assert" "go.mongodb.org/mongo-driver/bson/primitive" - "testing" - "time" ) func SetupTestUserRoleRepository(db string) (repository.UserRoleRepository, func(), error) { diff --git a/pkg/usecase/casbin_redis_rbac.go b/pkg/usecase/casbin_redis_rbac.go index aa26b70..2e470de 100644 --- a/pkg/usecase/casbin_redis_rbac.go +++ b/pkg/usecase/casbin_redis_rbac.go @@ -1,6 +1,12 @@ package usecase import ( + "context" + "fmt" + "log" + "net/http" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" @@ -8,14 +14,9 @@ import ( "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase" "code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs/code" - "context" - "fmt" "github.com/casbin/casbin/v2" "github.com/casbin/casbin/v2/model" "github.com/zeromicro/go-zero/core/logx" - "log" - "net/http" - "time" ) type RBACUseCaseParam struct { @@ -35,7 +36,7 @@ type RBACUseCase struct { instance *casbin.Enforcer } -func NewUseCase(param RBACUseCaseParam) usecase.RBACUseCase { +func NewRBACUseCase(param RBACUseCaseParam) usecase.RBACUseCase { result := &RBACUseCase{ adapter: param.RBACRedisAdapter, permissionRepo: param.permissionRepo, @@ -89,7 +90,6 @@ func (use *RBACUseCase) Check(ctx context.Context, role, path, method string) (u return usecase.CheckRolePermissionStatus{}, err } status.Select.PlainCode = policy - } limit := 4 @@ -168,7 +168,7 @@ func (use *RBACUseCase) LoadPolicy(ctx context.Context) error { continue } - _, err = use.instance.AddPolicy(r.UID, p.HTTPPath, p.HTTPMethod, p.Name) + _, err = use.instance.AddPolicy(r.Name, p.HTTPPath, p.HTTPMethod, p.Name) if err != nil { return err } diff --git a/pkg/usecase/casbin_redis_rbac_test.go b/pkg/usecase/casbin_redis_rbac_test.go index aed2454..3d7d586 100644 --- a/pkg/usecase/casbin_redis_rbac_test.go +++ b/pkg/usecase/casbin_redis_rbac_test.go @@ -1 +1,119 @@ package usecase + +import ( + "context" + "net/http" + "testing" + "time" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" + mock "code.30cm.net/digimon/app-cloudep-permission-server/pkg/mock/repository" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/repository" + "github.com/alicebob/miniredis/v2" + "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/core/stores/redis" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.uber.org/mock/gomock" +) + +func setupMiniRedis() (*miniredis.Miniredis, *redis.Redis) { + // 啟動 setupMiniRedis 作為模擬的 Redis 服務 + mr, err := miniredis.Run() + if err != nil { + panic("failed to start miniRedis: " + err.Error()) + } + + // 使用 setupMiniRedis 的地址配置 go-zero Redis 客戶端 + redisConf := redis.RedisConf{ + Host: mr.Addr(), + Type: "node", + } + r := redis.MustNewRedis(redisConf) + + return mr, r +} + +func TestNewRBACUseCase_LoadPolicy(t *testing.T) { + // 固定發行者設定,測試中會用來驗證 claims.Issuer + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + // 準備測試資料 + permID, _ := primitive.ObjectIDFromHex("507f1f77bcf86cd799439011") + permissionData := entity.Permission{ + ID: permID, + Parent: "", + Name: "read_perm", + HTTPMethod: http.MethodGet, + HTTPPath: "/resource", + Status: permission.Open, // 1: 啟用 + // 其他欄位可以隨便填上 + CreateAt: time.Now().Unix(), + UpdateAt: time.Now().Unix(), + } + + roleID, _ := primitive.ObjectIDFromHex("507f1f77bcf86cd799439012") + roleData := &entity.Role{ + ID: roleID, + Name: "test_role", + UID: "role1", + ClientID: "client1", + Status: permission.Open, + CreateAt: time.Now().Unix(), + UpdateAt: time.Now().Unix(), + } + + rolePermissionData := &entity.RolePermission{ + // 這裡 RoleID 與 PermissionID 皆以 Hex 字串儲存 + RoleID: roleID.Hex(), + PermissionID: permID.Hex(), + CreateAt: time.Now().Unix(), + UpdateAt: time.Now().Unix(), + } + + // 建立 mock 物件,並設定期望值 + permissionRepo := mock.NewMockPermissionRepository(mockCtrl) + roleRepo := mock.NewMockRoleRepository(mockCtrl) + rolePermissionRepo := mock.NewMockRolePermissionRepository(mockCtrl) + ctx := context.Background() + permissionRepo.EXPECT(). + GetAll(ctx, nil). + Return([]entity.Permission{permissionData}, nil) + + roleRepo.EXPECT(). + All(ctx, nil). + Return([]*entity.Role{roleData}, nil) + + rolePermissionRepo.EXPECT(). + Get(ctx, roleID.Hex()). + Return([]*entity.RolePermission{rolePermissionData}, nil) + + // 建立 miniRedis 與 adapter + mr, rdb := setupMiniRedis() + defer mr.Close() + + adapter, err := repository.NewRBACAdapter(repository.RBACAdapterParam{Redis: rdb}) + assert.NoError(t, err) + + // 建立 RBACUseCase 測試實例 + uc := NewRBACUseCase(RBACUseCaseParam{ + ModulePath: "../../etc/rbac.conf", // 注意:確認路徑下有對應的模型檔 + permissionRepo: permissionRepo, + roleRepo: roleRepo, + rolePermission: rolePermissionRepo, + RBACRedisAdapter: adapter, + }) + + // 載入 policy + err = uc.LoadPolicy(ctx) + assert.NoError(t, err) + + // 接下來測試 casbin 是否能正確檢查該權限 + status, err := uc.Check(ctx, roleData.Name, permissionData.HTTPPath, permissionData.HTTPMethod) + assert.NoError(t, err) + assert.True(t, status.Allow) + // 預期 PermissionName 為 "read_perm" + assert.Equal(t, "read_perm", status.Select.PermissionName) + +} diff --git a/pkg/usecase/permission_tree.go b/pkg/usecase/permission_tree.go index 20d8d7f..0d109b8 100644 --- a/pkg/usecase/permission_tree.go +++ b/pkg/usecase/permission_tree.go @@ -1,9 +1,10 @@ package usecase import ( + "sync" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" - "sync" "go.mongodb.org/mongo-driver/bson/primitive" ) diff --git a/pkg/usecase/permission_tree_test.go b/pkg/usecase/permission_tree_test.go index 2594496..cbfc9d5 100644 --- a/pkg/usecase/permission_tree_test.go +++ b/pkg/usecase/permission_tree_test.go @@ -1,11 +1,12 @@ package usecase import ( + "sync" + "testing" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" "go.mongodb.org/mongo-driver/bson/primitive" - "sync" - "testing" ) // TestGeneratePermissionTree 測試 GeneratePermissionTree 函數的建立樹功能 diff --git a/pkg/usecase/role.go b/pkg/usecase/role.go new file mode 100644 index 0000000..fff7c17 --- /dev/null +++ b/pkg/usecase/role.go @@ -0,0 +1,235 @@ +package usecase + +import ( + "context" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase" + "code.30cm.net/digimon/library-go/errs" + "code.30cm.net/digimon/library-go/errs/code" + "github.com/zeromicro/go-zero/core/logx" +) + +type RoleUseCaseParam struct { + roleRepository repository.RoleRepository +} + +type RoleUseCase struct { + RoleUseCaseParam +} + +func NewRoleUseCase(param RoleUseCaseParam) usecase.RoleUseCase { + return &RoleUseCase{ + RoleUseCaseParam: param, + } +} + +func (use *RoleUseCase) List(ctx context.Context, param usecase.ListQuery) ([]usecase.Role, int64, error) { + query := repository.ListQuery{ + PageSize: param.PageSize, + PageIndex: param.PageIndex, + ClientID: param.ClientID, + Name: param.Name, + UID: param.UID, + Status: param.Status, + } + if param.UID != nil { + query.UID = param.UID + } + + list, i, err := use.roleRepository.List(ctx, query) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToListRole, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "param", Value: param}, + {Key: "func", Value: "roleRepository.List"}, + {Key: "err", Value: err.Error()}, + }, + "failed to list role") + + return nil, 0, e + } + + result := make([]usecase.Role, 0, len(list)) + + for _, item := range list { + result = append(result, usecase.Role{ + ID: item.ID.Hex(), + UID: item.UID, + Name: item.Name, + Status: item.Status, + ClientID: item.ClientID, + CreateAt: item.CreateAt, + UpdateAt: item.UpdateAt, + }) + } + + return result, i, nil +} + +func (use *RoleUseCase) All(ctx context.Context, clientID *string) ([]usecase.Role, error) { + all, err := use.roleRepository.All(ctx, clientID) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToListRole, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "clientID", Value: clientID}, + {Key: "func", Value: "roleRepository.All"}, + {Key: "err", Value: err.Error()}, + }, + "failed to get all role") + + return nil, e + } + + result := make([]usecase.Role, 0, len(all)) + + for _, item := range all { + result = append(result, usecase.Role{ + ID: item.ID.Hex(), + UID: item.UID, + Name: item.Name, + Status: item.Status, + ClientID: item.ClientID, + CreateAt: item.CreateAt, + UpdateAt: item.UpdateAt, + }) + } + + return result, nil +} + +func (use *RoleUseCase) GetByID(ctx context.Context, id string) (*usecase.Role, error) { + byID, err := use.roleRepository.GetByID(ctx, id) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToGetRoleByID, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "id", Value: id}, + {Key: "func", Value: "roleRepository.GetByID"}, + {Key: "err", Value: err.Error()}, + }, + "failed to get role by id") + + return nil, e + } + + return &usecase.Role{ + ID: byID.ID.Hex(), + UID: byID.UID, + Name: byID.Name, + Status: byID.Status, + ClientID: byID.ClientID, + CreateAt: byID.CreateAt, + UpdateAt: byID.UpdateAt, + }, nil +} + +func (use *RoleUseCase) GetByUID(ctx context.Context, uid string) (*usecase.Role, error) { + byUID, err := use.roleRepository.GetByUID(ctx, uid) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToGetRoleByUID, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "uid", Value: uid}, + {Key: "func", Value: "roleRepository.GetByUID"}, + {Key: "err", Value: err.Error()}, + }, + "failed to get role by uid") + + return nil, e + } + + return &usecase.Role{ + ID: byUID.ID.Hex(), + UID: byUID.UID, + Name: byUID.Name, + Status: byUID.Status, + ClientID: byUID.ClientID, + CreateAt: byUID.CreateAt, + UpdateAt: byUID.UpdateAt, + }, nil +} + +func (use *RoleUseCase) Create(ctx context.Context, role usecase.CreateRoleReq) error { + err := use.roleRepository.Create(ctx, &entity.Role{ + UID: role.UID, + Name: role.Name, + Status: role.Status, + ClientID: role.ClientID, + }) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToCreateRole, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "param", Value: role}, + {Key: "func", Value: "roleRepository.Create"}, + {Key: "err", Value: err.Error()}, + }, + "failed to create role") + + return e + } + + return nil +} + +func (use *RoleUseCase) Update(ctx context.Context, id string, data usecase.CreateRoleReq) error { + err := use.roleRepository.Update(ctx, repository.UpdateReq{ + ID: id, + Name: &data.Name, + UID: &data.UID, + ClientID: &data.ClientID, + Status: &data.Status, + }) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToUpdateRole, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "id", Value: id}, + {Key: "param", Value: data}, + {Key: "func", Value: "roleRepository.Update"}, + {Key: "err", Value: err.Error()}, + }, + "failed to update role") + + return e + } + + return nil +} + +func (use *RoleUseCase) Delete(ctx context.Context, id string) error { + err := use.roleRepository.Delete(ctx, id) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToDelRole, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "id", Value: id}, + {Key: "func", Value: "roleRepository.Delete"}, + {Key: "err", Value: err.Error()}, + }, + "failed to delete role") + + return e + } + + return nil +} diff --git a/pkg/usecase/role_permission.go b/pkg/usecase/role_permission.go new file mode 100644 index 0000000..73a7191 --- /dev/null +++ b/pkg/usecase/role_permission.go @@ -0,0 +1,73 @@ +package usecase + +import ( + "context" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/permission" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase" +) + +type RolePermissionUseCaseParam struct { + //rolePermissionRepository repository.RolePermissionRepository +} + +type RolePermissionUseCase struct { + RolePermissionUseCaseParam +} + +func NewRolePermissionUseCase(param RolePermissionUseCaseParam) usecase.RolePermissionUseCase { + return &RolePermissionUseCase{ + RolePermissionUseCaseParam: param, + } +} + +func (use *RolePermissionUseCase) Get(ctx context.Context, roleID string) (permission.Permissions, error) { + //rolePermissions, err := use.rolePermissionRepository.Get(ctx, roleID) + //if err != nil && !errors.Is(err, repository.ErrRecordNotFound) { + // return nil, usecase.InternalError{Err: fmt.Errorf("permissionRepo.Get error: %w", err)} + //} + // + //permissions, err := uc.PermissionRepo.All(ctx) + //if err != nil && !errors.Is(err, repository.ErrRecordNotFound) { + // return nil, usecase.InternalError{Err: fmt.Errorf("permissionRepo.AllStatus error: %w", err)} + //} + // + //// TODO cache http://jira.logintt.com:8080/browse/ESC-2046 + //return GeneratePermissionTree(permissions).getFullParentPermission(rolePermissions), nil + //get, err := use.rolePermissionRepository.Get(ctx, roleID) + //if err != nil { + // return nil, err + //} + // + //permissions := make(permission.Permissions, len(get)) + //for _, item := range get { + // permissions[item.PermissionID] = item. + //} + // + return permission.Permissions{}, nil +} + +func (use *RolePermissionUseCase) GetByRoleUID(ctx context.Context, uid string) (permission.Permissions, error) { + //TODO implement me + panic("implement me") +} + +func (use *RolePermissionUseCase) GetByUser(ctx context.Context, uid string) (usecase.UserPermission, error) { + //TODO implement me + panic("implement me") +} + +func (use *RolePermissionUseCase) Create(ctx context.Context, roleID string, permissions permission.Permissions) error { + //TODO implement me + panic("implement me") +} + +func (use *RolePermissionUseCase) Delete(ctx context.Context, roleID string, permissions permission.Permissions) error { + //TODO implement me + panic("implement me") +} + +func (use *RolePermissionUseCase) List(ctx context.Context, req usecase.ListQuery) (usecase.RoleResp, error) { + //TODO implement me + panic("implement me") +} diff --git a/pkg/usecase/token_test.go b/pkg/usecase/token_test.go index 757d56c..5cf8165 100644 --- a/pkg/usecase/token_test.go +++ b/pkg/usecase/token_test.go @@ -1,16 +1,17 @@ package usecase import ( + "context" + "fmt" + "testing" + "time" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase" mock "code.30cm.net/digimon/app-cloudep-permission-server/pkg/mock/repository" - "context" - "fmt" "github.com/golang-jwt/jwt/v4" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" - "testing" - "time" ) // TestTokenUseCase_CreateAccessToken_TableDriven 透過 table-driven 方式測試 CreateAccessToken diff --git a/pkg/usecase/user_role.go b/pkg/usecase/user_role.go new file mode 100644 index 0000000..34248a4 --- /dev/null +++ b/pkg/usecase/user_role.go @@ -0,0 +1,132 @@ +package usecase + +import ( + "context" + "fmt" + + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/repository" + "code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/usecase" + "code.30cm.net/digimon/library-go/errs" + "code.30cm.net/digimon/library-go/errs/code" + "github.com/zeromicro/go-zero/core/logx" +) + +type UserRoleUseCaseParam struct { + userRoleRepository repository.UserRoleRepository +} + +type UserRoleUseCase struct { + UserRoleUseCaseParam +} + +func NewUserRoleUseCase(param UserRoleUseCaseParam) usecase.UserRoleUseCase { + return &UserRoleUseCase{ + UserRoleUseCaseParam: param, + } +} + +func (use *UserRoleUseCase) Select(ctx context.Context, filter usecase.UserRoleFilter) ([]usecase.UserRole, error) { + id, err := use.userRoleRepository.GetUsersByRoleID(ctx, filter.RoleID) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToGetUserRole, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "req", Value: filter}, + {Key: "func", Value: "userRoleRepository.GetUsersByRoleID"}, + {Key: "err", Value: err.Error()}, + }, + "failed to get users by role id") + + return nil, e + } + + result := make([]usecase.UserRole, 0, len(id)) + for _, item := range result { + result = append(result, usecase.UserRole{ + UID: item.UID, + RoleID: filter.RoleID, + CreateAt: item.CreateAt, + UpdateAt: item.UpdateAt, + }) + } + + return result, nil +} + +func (use *UserRoleUseCase) Get(ctx context.Context, uid string) (usecase.UserRole, error) { + id, err := use.userRoleRepository.GetByUserID(ctx, uid) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToGetUserRoleByUID, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "uid", Value: uid}, + {Key: "func", Value: "userRoleRepository.GetByUserID"}, + {Key: "err", Value: err.Error()}, + }, + "failed to get users by role id") + + return usecase.UserRole{}, e + } + + return usecase.UserRole{ + UID: id.UID, + RoleID: id.RoleID, + CreateAt: id.CreateAt, + UpdateAt: id.UpdateAt, + }, nil +} + +func (use *UserRoleUseCase) Create(ctx context.Context, uid, roleID string) (usecase.UserRole, error) { + ins := entity.UserRole{ + UID: uid, + RoleID: roleID, + } + err := use.userRoleRepository.CreateUserRole(ctx, ins) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToCreateUserRole, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "uid-role", Value: fmt.Sprintf("%s-%s", uid, roleID)}, + {Key: "func", Value: "userRoleRepository.CreateUserRole"}, + {Key: "err", Value: err.Error()}, + }, + "failed to create user role") + + return usecase.UserRole{}, e + } + + return usecase.UserRole{ + UID: ins.UID, + RoleID: ins.RoleID, + CreateAt: ins.CreateAt, + UpdateAt: ins.UpdateAt, + }, nil +} + +func (use *UserRoleUseCase) Update(ctx context.Context, uid, roleID string) error { + _, err := use.userRoleRepository.UpdateUserRole(ctx, uid, roleID) + if err != nil { + e := errs.DatabaseErrorWithScopeL( + code.CloudEPPermission, + domain.FailedToUpdateUserRole, + logx.WithContext(ctx), + []logx.LogField{ + {Key: "uid-role", Value: fmt.Sprintf("%s-%s", uid, roleID)}, + {Key: "func", Value: "userRoleRepository.UpdateUserRole"}, + {Key: "err", Value: err.Error()}, + }, + "failed to update user role") + + return e + } + + return nil +}