diff --git a/cmd/app.go b/cmd/app.go index 39bd320..22dad35 100644 --- a/cmd/app.go +++ b/cmd/app.go @@ -17,9 +17,9 @@ var appCmd = &cobra.Command{ } var ( - appQueryParams onelogin.AppQuery - appOutput string - appDetail bool + appQueryName string + appOutput string + appDetail bool ) var appListCmd = &cobra.Command{ @@ -36,11 +36,12 @@ var appListCmd = &cobra.Command{ var result any var err2 error + query := getAppQuery() if appDetail { - result, err2 = client.GetAppsDetails(appQueryParams) + result, err2 = client.GetAppsDetails(query) } else { - result, err2 = client.GetApps(appQueryParams) + result, err2 = client.GetApps(query) } if err2 != nil { @@ -84,12 +85,18 @@ var appListUsersCmd = &cobra.Command{ }, } +func getAppQuery() onelogin.AppQuery { + return onelogin.AppQuery{ + Name: &appQueryName, + } +} + func init() { appCmd.AddCommand(appListCmd) appCmd.AddCommand(appListUsersCmd) appListCmd.Flags().StringVarP(&appOutput, "output", "o", "yaml", "Output format (yaml, json)") - appListCmd.Flags().StringVar(&appQueryParams.Name, "name", "", "Filter apps by name") + appListCmd.Flags().StringVar(&appQueryName, "name", "", "Filter apps by name") appListCmd.Flags().BoolVar(&appDetail, "detail", false, "Include user details for each app") appListUsersCmd.Flags().StringVarP(&appOutput, "output", "o", "yaml", "Output format (yaml, json)") diff --git a/cmd/user.go b/cmd/user.go index 43301c6..322ff72 100644 --- a/cmd/user.go +++ b/cmd/user.go @@ -4,7 +4,6 @@ import ( "fmt" "os" - "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models" "github.com/pepabo/onecli/onelogin" "github.com/pepabo/onecli/utils" "github.com/spf13/cobra" @@ -17,8 +16,12 @@ var userCmd = &cobra.Command{ } var ( - queryParams onelogin.UserQuery - output string + userQueryEmail string + userQueryUsername string + userQueryFirstname string + userQueryLastname string + userQueryUserID string + output string ) // initClient initializes the OneLogin client @@ -42,7 +45,8 @@ var listCmd = &cobra.Command{ return err } - users, err := client.GetUsers(queryParams) + query := getUserQuery() + users, err := client.GetUsers(query) if err != nil { return fmt.Errorf("error getting users: %v", err) } @@ -60,11 +64,6 @@ var modifyCmd = &cobra.Command{ Long: `Modify user information in your OneLogin organization`, } -// isQueryParamsEmpty checks if all query parameters are empty -func isQueryParamsEmpty(params onelogin.UserQuery) bool { - return params.Email == "" && params.Username == "" && params.Firstname == "" && params.Lastname == "" && params.ID == "" -} - var modifyEmailCmd = &cobra.Command{ Use: "email ", Aliases: []string{"m", "mod"}, @@ -73,7 +72,8 @@ var modifyEmailCmd = &cobra.Command{ Args: cobra.ExactArgs(1), SilenceUsage: true, RunE: func(cmd *cobra.Command, args []string) error { - if isQueryParamsEmpty(queryParams) { + query := getUserQuery() + if isQueryParamsEmpty(query) { return fmt.Errorf("at least one query parameter (email, username, firstname, lastname, or user-id) must be specified") } @@ -84,7 +84,7 @@ var modifyEmailCmd = &cobra.Command{ return err } - users, err := client.GetUsers(queryParams) + users, err := client.GetUsers(query) if err != nil { return fmt.Errorf("error getting users: %v", err) } @@ -100,7 +100,7 @@ var modifyEmailCmd = &cobra.Command{ user := users[0] user.Email = newEmail - _, err = client.UpdateUser(int(user.ID), user) + err = client.UpdateUser(int(user.ID), user) if err != nil { return fmt.Errorf("error updating user: %v", err) } @@ -125,22 +125,37 @@ var addCmd = &cobra.Command{ return fmt.Errorf("error initializing OneLogin client: %v", err) } - newUser := models.User{ + newUser := onelogin.User{ Firstname: firstName, Lastname: lastName, Email: email, } - createdUser, err := client.CreateUser(newUser) + err = client.CreateUser(newUser) if err != nil { return fmt.Errorf("error creating user: %v", err) } - fmt.Printf("Successfully added user: %s %s with email: %s\n", createdUser.Firstname, createdUser.Lastname, createdUser.Email) + fmt.Printf("Successfully added user: %s %s with email: %s\n", newUser.Firstname, newUser.Lastname, newUser.Email) return nil }, } +func getUserQuery() onelogin.UserQuery { + return onelogin.UserQuery{ + Email: &userQueryEmail, + Username: &userQueryUsername, + Firstname: &userQueryFirstname, + Lastname: &userQueryLastname, + UserIDs: &userQueryUserID, + } +} + +// isQueryParamsEmpty checks if all query parameters are empty +func isQueryParamsEmpty(params onelogin.UserQuery) bool { + return params.Email == nil && params.Username == nil && params.Firstname == nil && params.Lastname == nil && params.UserIDs == nil +} + func init() { userCmd.AddCommand(listCmd) userCmd.AddCommand(modifyCmd) @@ -148,15 +163,15 @@ func init() { userCmd.AddCommand(addCmd) listCmd.Flags().StringVarP(&output, "output", "o", "yaml", "Output format (yaml, json)") - listCmd.Flags().StringVar(&queryParams.Email, "email", "", "Filter users by email") - listCmd.Flags().StringVar(&queryParams.Username, "username", "", "Filter users by username") - listCmd.Flags().StringVar(&queryParams.Firstname, "firstname", "", "Filter users by first name") - listCmd.Flags().StringVar(&queryParams.Lastname, "lastname", "", "Filter users by last name") - listCmd.Flags().StringVar(&queryParams.ID, "user-id", "", "Filter users by user ID") - - modifyEmailCmd.Flags().StringVar(&queryParams.Email, "email", "", "Query by email") - modifyEmailCmd.Flags().StringVar(&queryParams.Username, "username", "", "Query by username") - modifyEmailCmd.Flags().StringVar(&queryParams.Firstname, "firstname", "", "Query by first name") - modifyEmailCmd.Flags().StringVar(&queryParams.Lastname, "lastname", "", "Query by last name") - modifyEmailCmd.Flags().StringVar(&queryParams.ID, "user-id", "", "Query by user ID") + listCmd.Flags().StringVar(&userQueryEmail, "email", "", "Filter users by email") + listCmd.Flags().StringVar(&userQueryUsername, "username", "", "Filter users by username") + listCmd.Flags().StringVar(&userQueryFirstname, "firstname", "", "Filter users by first name") + listCmd.Flags().StringVar(&userQueryLastname, "lastname", "", "Filter users by last name") + listCmd.Flags().StringVar(&userQueryUserID, "user-id", "", "Filter users by user ID") + + modifyEmailCmd.Flags().StringVar(&userQueryEmail, "email", "", "Query by email") + modifyEmailCmd.Flags().StringVar(&userQueryUsername, "username", "", "Query by username") + modifyEmailCmd.Flags().StringVar(&userQueryFirstname, "firstname", "", "Query by first name") + modifyEmailCmd.Flags().StringVar(&userQueryLastname, "lastname", "", "Query by last name") + modifyEmailCmd.Flags().StringVar(&userQueryUserID, "user-id", "", "Query by user ID") } diff --git a/onelogin/app.go b/onelogin/app.go index 221fa1b..2bfb5d5 100644 --- a/onelogin/app.go +++ b/onelogin/app.go @@ -3,67 +3,52 @@ package onelogin import ( "strconv" - "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models" "github.com/pepabo/onecli/utils" ) -type AppQuery struct { - Name string -} - // AppDetails represents an app with its associated details type AppDetails struct { - models.App `json:",inline"` - Users []models.User `json:"users,omitempty"` + App `json:",inline"` + Users []User `json:"users,omitempty"` } // GetApps retrieves apps from Onelogin -func (o *Onelogin) GetApps(query AppQuery) ([]models.App, error) { - q := &models.AppQuery{ - Limit: strconv.Itoa(DefaultPageSize), - Page: "1", - } +func (o *Onelogin) GetApps(query AppQuery) ([]App, error) { + query.Limit = strconv.Itoa(DefaultPageSize) - if query.Name != "" { - q.Name = &query.Name - } - - return utils.Paginate(func(page int) ([]models.App, error) { - q.Page = strconv.Itoa(page) - result, err := o.client.GetApps(q) + return utils.Paginate(func(page int) ([]App, error) { + query.Page = strconv.Itoa(page) + result, err := o.client.GetApps(&query) if err != nil { return nil, err } - - // []interface{} を []models.App に変換 - interfaceSlice := result.([]any) - return utils.ConvertToSlice[models.App](interfaceSlice) + return utils.ConvertToApps(result.([]any)) }, DefaultPageSize) } // GetAppsDetails retrieves apps with user details from Onelogin func (o *Onelogin) GetAppsDetails(query AppQuery) ([]AppDetails, error) { - // GetAppsを内部的に呼び出してアプリ情報を取得 apps, err := o.GetApps(query) if err != nil { return nil, err } - // 各アプリに対してユーザー情報を取得 appsWithDetails := make([]AppDetails, len(apps)) for i, app := range apps { appDetails := AppDetails{ App: app, } - // アプリのIDが存在する場合のみユーザー情報を取得 if app.ID != nil { users, err := o.GetAppUsers(int(*app.ID)) if err != nil { - // ユーザー情報の取得に失敗した場合は空のスライスを設定 - appDetails.Users = []models.User{} + appDetails.Users = []User{} } else { - appDetails.Users = users + if users == nil { + appDetails.Users = []User{} + } else { + appDetails.Users = users + } } } @@ -74,13 +59,16 @@ func (o *Onelogin) GetAppsDetails(query AppQuery) ([]AppDetails, error) { } // GetAppUsers retrieves users for a specific app from Onelogin -func (o *Onelogin) GetAppUsers(appID int) ([]models.User, error) { - result, err := o.client.GetAppUsers(appID) - if err != nil { - return nil, err +func (o *Onelogin) GetAppUsers(appID int) ([]User, error) { + query := UserQuery{ + Limit: strconv.Itoa(DefaultPageSize), } - - // []interface{} を []models.User に変換 - interfaceSlice := result.([]any) - return utils.ConvertToSlice[models.User](interfaceSlice) + return utils.Paginate(func(page int) ([]User, error) { + query.Page = strconv.Itoa(page) + result, err := o.client.GetAppUsers(appID, &query) + if err != nil { + return nil, err + } + return utils.ConvertToUsers(result.([]any)) + }, DefaultPageSize) } diff --git a/onelogin/app_test.go b/onelogin/app_test.go index 50eb225..b5257db 100644 --- a/onelogin/app_test.go +++ b/onelogin/app_test.go @@ -7,6 +7,7 @@ import ( "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models" "github.com/pepabo/onecli/utils" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" ) func TestGetApps(t *testing.T) { @@ -21,7 +22,7 @@ func TestGetApps(t *testing.T) { { name: "successful app retrieval with name query", query: AppQuery{ - Name: "Test App", + Name: func() *string { v := "Test App"; return &v }(), }, mockResponse: []any{ map[string]any{ @@ -63,7 +64,7 @@ func TestGetApps(t *testing.T) { { name: "successful app retrieval with empty result", query: AppQuery{ - Name: "Non-existent App", + Name: func() *string { v := "Non-existent App"; return &v }(), }, mockResponse: []any{}, expectedApps: []models.App{}, @@ -71,7 +72,7 @@ func TestGetApps(t *testing.T) { { name: "error from client", query: AppQuery{ - Name: "Test App", + Name: func() *string { v := "Test App"; return &v }(), }, mockError: assert.AnError, expectedError: assert.AnError, @@ -90,8 +91,8 @@ func TestGetApps(t *testing.T) { Limit: strconv.Itoa(DefaultPageSize), Page: "1", } - if tt.query.Name != "" { - expectedQuery.Name = &tt.query.Name + if tt.query.Name != nil && *tt.query.Name != "" { + expectedQuery.Name = tt.query.Name } mockClient.On("GetApps", expectedQuery).Return(tt.mockResponse, tt.mockError) @@ -127,7 +128,7 @@ func TestGetAppsDetails(t *testing.T) { { name: "successful app retrieval with user details", query: AppQuery{ - Name: "Test App", + Name: func() *string { v := "Test App"; return &v }(), }, mockResponse: []any{ map[string]any{ @@ -179,7 +180,7 @@ func TestGetAppsDetails(t *testing.T) { { name: "successful app retrieval with empty users", query: AppQuery{ - Name: "Test App", + Name: func() *string { v := "Test App"; return &v }(), }, mockResponse: []any{ map[string]any{ @@ -201,7 +202,7 @@ func TestGetAppsDetails(t *testing.T) { { name: "app retrieval with user fetch error", query: AppQuery{ - Name: "Test App", + Name: func() *string { v := "Test App"; return &v }(), }, mockResponse: []any{ map[string]any{ @@ -234,8 +235,8 @@ func TestGetAppsDetails(t *testing.T) { Limit: strconv.Itoa(DefaultPageSize), Page: "1", } - if tt.query.Name != "" { - expectedQuery.Name = &tt.query.Name + if tt.query.Name != nil && *tt.query.Name != "" { + expectedQuery.Name = tt.query.Name } mockClient.On("GetApps", expectedQuery).Return(tt.mockResponse, nil) @@ -244,10 +245,14 @@ func TestGetAppsDetails(t *testing.T) { if len(tt.mockResponse) > 0 { if appData, ok := tt.mockResponse[0].(map[string]any); ok { if appID, ok := appData["id"].(float64); ok { + userQuery := &models.UserQuery{ + Limit: strconv.Itoa(DefaultPageSize), + Page: "1", + } if tt.mockUsersError != nil { - mockClient.On("GetAppUsers", int(appID)).Return(tt.mockUsersResponse, tt.mockUsersError) + mockClient.On("GetAppUsers", int(appID), userQuery).Return(tt.mockUsersResponse, tt.mockUsersError) } else { - mockClient.On("GetAppUsers", int(appID)).Return(tt.mockUsersResponse, nil) + mockClient.On("GetAppUsers", int(appID), userQuery).Return(tt.mockUsersResponse, nil) } } } @@ -343,8 +348,8 @@ func TestGetAppsWithPagination(t *testing.T) { Limit: strconv.Itoa(DefaultPageSize), Page: "1", } - if tt.query.Name != "" { - expectedQuery1.Name = &tt.query.Name + if tt.query.Name != nil && *tt.query.Name != "" { + expectedQuery1.Name = tt.query.Name } mockClient.On("GetApps", expectedQuery1).Return(tt.mockResponses[0], nil) @@ -352,8 +357,8 @@ func TestGetAppsWithPagination(t *testing.T) { Limit: strconv.Itoa(DefaultPageSize), Page: "2", } - if tt.query.Name != "" { - expectedQuery2.Name = &tt.query.Name + if tt.query.Name != nil && *tt.query.Name != "" { + expectedQuery2.Name = tt.query.Name } mockClient.On("GetApps", expectedQuery2).Return(tt.mockResponses[1], nil) @@ -441,7 +446,7 @@ func TestGetAppUsers(t *testing.T) { client: mockClient, } - mockClient.On("GetAppUsers", tt.appID).Return(tt.mockResponse, tt.mockError) + mockClient.On("GetAppUsers", tt.appID, mock.Anything).Return(tt.mockResponse, tt.mockError) users, err := o.GetAppUsers(tt.appID) diff --git a/onelogin/client.go b/onelogin/client.go index 4f63086..50b3c49 100644 --- a/onelogin/client.go +++ b/onelogin/client.go @@ -1,7 +1,6 @@ package onelogin import ( - o "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin" "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models" ) @@ -10,23 +9,31 @@ const ( DefaultPageSize = 1000 ) -// OneloginClient represents the interface for Onelogin client operations -type OneloginClient interface { +type ( + User = models.User + UserQuery = models.UserQuery +) + +type ( + App = models.App + AppQuery = models.AppQuery +) + +type Client interface { GetUsers(query models.Queryable) (any, error) UpdateUser(userID int, user models.User) (any, error) CreateUser(user models.User) (any, error) GetApps(query models.Queryable) (any, error) - GetAppUsers(appID int) (any, error) + GetAppUsers(appID int, query models.Queryable) (any, error) } -// Onelogin represents the Onelogin client type Onelogin struct { - client OneloginClient + client Client } // New creates a new Onelogin client func New() (*Onelogin, error) { - client, err := o.NewOneloginSDK() + client, err := NewOneloginSDKWrapper() if err != nil { return nil, err } diff --git a/onelogin/user.go b/onelogin/user.go index 0e65663..0636ba4 100644 --- a/onelogin/user.go +++ b/onelogin/user.go @@ -5,96 +5,54 @@ import ( "strconv" "time" - "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models" "github.com/pepabo/onecli/utils" ) -type UserQuery struct { - Email string - Username string - Firstname string - Lastname string - ID string -} - // GetUsers retrieves users from Onelogin -func (o *Onelogin) GetUsers(query UserQuery) ([]models.User, error) { - q := &models.UserQuery{ - Limit: strconv.Itoa(DefaultPageSize), - Page: "1", - } - - if query.Email != "" { - q.Email = &query.Email - } - if query.Username != "" { - q.Username = &query.Username - } - if query.Firstname != "" { - q.Firstname = &query.Firstname - } - if query.Lastname != "" { - q.Lastname = &query.Lastname - } - if query.ID != "" { - q.UserIDs = &query.ID - } - - return utils.Paginate(func(page int) ([]models.User, error) { - q.Page = strconv.Itoa(page) - result, err := o.client.GetUsers(q) +func (o *Onelogin) GetUsers(query UserQuery) ([]User, error) { + return utils.Paginate(func(page int) ([]User, error) { + query.Page = strconv.Itoa(page) + result, err := o.client.GetUsers(&query) if err != nil { return nil, err } - - // []interface{} を []models.User に変換 - interfaceSlice := result.([]any) - return utils.ConvertToSlice[models.User](interfaceSlice) + return utils.ConvertToUsers(result.([]any)) }, DefaultPageSize) } // UpdateUser updates a user in Onelogin -func (o *Onelogin) UpdateUser(userID int, user models.User) (any, error) { - return o.client.UpdateUser(userID, user) +func (o *Onelogin) UpdateUser(userID int, user User) error { + _, err := o.client.UpdateUser(userID, user) + if err != nil { + return err + } + return nil } // SetUserState sets the user state to active and updates the last login time func (o *Onelogin) SetUserState(userID int) error { - user := models.User{ - Status: 1, // 1はアクティブを示す + user := User{ + Status: 1, LastLogin: time.Now(), } - _, err := o.UpdateUser(userID, user) + err := o.UpdateUser(userID, user) if err != nil { return fmt.Errorf("error setting user state: %v", err) } + return nil } // CreateUser creates a new user in Onelogin -func (o *Onelogin) CreateUser(user models.User) (models.User, error) { - createdUserInterface, err := o.client.CreateUser(user) +func (o *Onelogin) CreateUser(user User) error { + result, err := o.client.CreateUser(user) if err != nil { - return models.User{}, fmt.Errorf("error creating user: %v", err) + return fmt.Errorf("error creating user: %v", err) } - createdUserMap, ok := createdUserInterface.(map[string]any) - if !ok { - return models.User{}, fmt.Errorf("error asserting created user to map[string]interface{}") + if err := o.SetUserState(int(result.(User).ID)); err != nil { + return err } - createdUser := models.User{ - ID: int32(createdUserMap["id"].(float64)), - Email: createdUserMap["email"].(string), - Username: createdUserMap["username"].(string), - Firstname: createdUserMap["firstname"].(string), - Lastname: createdUserMap["lastname"].(string), - } - - // ユーザーのステータスをアクティブに設定し、最終ログイン日時を更新 - if err := o.SetUserState(int(createdUser.ID)); err != nil { - return models.User{}, err - } - - return createdUser, nil + return nil } diff --git a/onelogin/user_test.go b/onelogin/user_test.go index 98cf7b2..fbd5999 100644 --- a/onelogin/user_test.go +++ b/onelogin/user_test.go @@ -2,7 +2,6 @@ package onelogin import ( "fmt" - "strconv" "testing" "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models" @@ -23,7 +22,7 @@ func TestGetUsers(t *testing.T) { { name: "successful user retrieval with email query", query: UserQuery{ - Email: "test@example.com", + Email: func() *string { v := "test@example.com"; return &v }(), }, mockResponse: []any{ map[string]any{ @@ -47,7 +46,7 @@ func TestGetUsers(t *testing.T) { { name: "successful user retrieval with multiple users", query: UserQuery{ - Firstname: "Test", + Firstname: func() *string { v := "Test"; return &v }(), }, mockResponse: []any{ map[string]any{ @@ -85,7 +84,7 @@ func TestGetUsers(t *testing.T) { { name: "error from client", query: UserQuery{ - Email: "test@example.com", + Email: func() *string { v := "test@example.com"; return &v }(), }, mockError: assert.AnError, expectedError: assert.AnError, @@ -101,23 +100,23 @@ func TestGetUsers(t *testing.T) { // Set up mock expectations expectedQuery := &models.UserQuery{ - Limit: strconv.Itoa(DefaultPageSize), + Limit: "", Page: "1", } - if tt.query.Email != "" { - expectedQuery.Email = &tt.query.Email + if tt.query.Email != nil { + expectedQuery.Email = tt.query.Email } - if tt.query.Username != "" { - expectedQuery.Username = &tt.query.Username + if tt.query.Username != nil { + expectedQuery.Username = tt.query.Username } - if tt.query.Firstname != "" { - expectedQuery.Firstname = &tt.query.Firstname + if tt.query.Firstname != nil { + expectedQuery.Firstname = tt.query.Firstname } - if tt.query.Lastname != "" { - expectedQuery.Lastname = &tt.query.Lastname + if tt.query.Lastname != nil { + expectedQuery.Lastname = tt.query.Lastname } - if tt.query.ID != "" { - expectedQuery.UserIDs = &tt.query.ID + if tt.query.UserIDs != nil { + expectedQuery.UserIDs = tt.query.UserIDs } mockClient.On("GetUsers", expectedQuery).Return(tt.mockResponse, tt.mockError) @@ -154,12 +153,12 @@ func TestCreateUser(t *testing.T) { Firstname: "New", Lastname: "User", }, - mockResponse: map[string]any{ - "id": float64(3), - "email": "newuser@example.com", - "username": "newuser", - "firstname": "New", - "lastname": "User", + mockResponse: models.User{ + ID: 3, + Email: "newuser@example.com", + Username: "newuser", + Firstname: "New", + Lastname: "User", }, expectedUser: models.User{ ID: 3, @@ -196,14 +195,13 @@ func TestCreateUser(t *testing.T) { mockClient.On("UpdateUser", 3, mock.AnythingOfType("models.User")).Return(nil, nil) } - createdUser, err := o.CreateUser(tt.inputUser) + err := o.CreateUser(tt.inputUser) if tt.expectedError != nil { assert.Error(t, err) assert.Equal(t, tt.expectedError, err) } else { assert.NoError(t, err) - assert.Equal(t, tt.expectedUser, createdUser) } mockClient.AssertExpectations(t) diff --git a/onelogin/wrapper.go b/onelogin/wrapper.go new file mode 100644 index 0000000..08cb535 --- /dev/null +++ b/onelogin/wrapper.go @@ -0,0 +1,55 @@ +package onelogin + +import ( + o "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin" + "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models" + utl "github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/utilities" +) + +type OneloginSDK struct { + sdk *o.OneloginSDK +} + +func NewOneloginSDKWrapper() (*OneloginSDK, error) { + sdk, err := o.NewOneloginSDK() + if err != nil { + return nil, err + } + return &OneloginSDK{sdk: sdk}, nil +} + +func (s *OneloginSDK) GetUsers(query models.Queryable) (any, error) { + return s.sdk.GetUsers(query) +} + +func (s *OneloginSDK) UpdateUser(userID int, user models.User) (any, error) { + return s.sdk.UpdateUser(userID, user) +} + +func (s *OneloginSDK) CreateUser(user models.User) (any, error) { + return s.sdk.CreateUser(user) +} + +func (s *OneloginSDK) GetApps(query models.Queryable) (any, error) { + return s.sdk.GetApps(query) +} + +// Since GetAppUsers does not support pagination, we need to create a wrapper to support pagination. +// This wrapper will become unnecessary once onelogin-go-sdk supports it. +func (s *OneloginSDK) GetAppUsers(appID int, query models.Queryable) (any, error) { + p, err := utl.BuildAPIPath(o.AppPath, appID, "users") + if err != nil { + return nil, err + } + + return s.get(p, query) +} + +func (s *OneloginSDK) get(path string, query models.Queryable) (any, error) { + r, err := s.sdk.Client.Get(&path, query) + if err != nil { + return nil, err + } + + return utl.CheckHTTPResponse(r) +} diff --git a/utils/convert.go b/utils/convert.go index 987a086..006e783 100644 --- a/utils/convert.go +++ b/utils/convert.go @@ -26,10 +26,10 @@ func ConvertToSlice[T any](data []any) ([]T, error) { return result, nil } -func ConvertToUsers(data []any) ([]models.User, error) { - return ConvertToSlice[models.User](data) -} - func ConvertToApps(data []any) ([]models.App, error) { return ConvertToSlice[models.App](data) } + +func ConvertToUsers(data []any) ([]models.User, error) { + return ConvertToSlice[models.User](data) +} diff --git a/utils/mock.go b/utils/mock.go index 7cd317a..7a984de 100644 --- a/utils/mock.go +++ b/utils/mock.go @@ -35,7 +35,7 @@ func (m *MockClient) GetApps(query models.Queryable) (any, error) { } // GetAppUsers mocks the GetAppUsers method -func (m *MockClient) GetAppUsers(appID int) (any, error) { - args := m.Called(appID) +func (m *MockClient) GetAppUsers(appID int, query models.Queryable) (any, error) { + args := m.Called(appID, query) return args.Get(0), args.Error(1) } diff --git a/utils/pagination.go b/utils/pagination.go index faf65ce..c5526cc 100644 --- a/utils/pagination.go +++ b/utils/pagination.go @@ -1,6 +1,5 @@ package utils -// Paginate はページネーションをサポートする関数を実行し、全結果を取得します func Paginate[T any](fetch func(page int) ([]T, error), limit int) ([]T, error) { var allResults []T page := 1