Skip to content

Commit 40998bb

Browse files
authored
Merge pull request #19 from pepabo/feat/paginate-get-app-users
feat: Add pagination support to GetAppUsers and refactor related code
2 parents 9db2ec3 + 4c54bca commit 40998bb

File tree

11 files changed

+218
-186
lines changed

11 files changed

+218
-186
lines changed

cmd/app.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ var appCmd = &cobra.Command{
1717
}
1818

1919
var (
20-
appQueryParams onelogin.AppQuery
21-
appOutput string
22-
appDetail bool
20+
appQueryName string
21+
appOutput string
22+
appDetail bool
2323
)
2424

2525
var appListCmd = &cobra.Command{
@@ -36,11 +36,12 @@ var appListCmd = &cobra.Command{
3636

3737
var result any
3838
var err2 error
39+
query := getAppQuery()
3940

4041
if appDetail {
41-
result, err2 = client.GetAppsDetails(appQueryParams)
42+
result, err2 = client.GetAppsDetails(query)
4243
} else {
43-
result, err2 = client.GetApps(appQueryParams)
44+
result, err2 = client.GetApps(query)
4445
}
4546

4647
if err2 != nil {
@@ -84,12 +85,18 @@ var appListUsersCmd = &cobra.Command{
8485
},
8586
}
8687

88+
func getAppQuery() onelogin.AppQuery {
89+
return onelogin.AppQuery{
90+
Name: &appQueryName,
91+
}
92+
}
93+
8794
func init() {
8895
appCmd.AddCommand(appListCmd)
8996
appCmd.AddCommand(appListUsersCmd)
9097

9198
appListCmd.Flags().StringVarP(&appOutput, "output", "o", "yaml", "Output format (yaml, json)")
92-
appListCmd.Flags().StringVar(&appQueryParams.Name, "name", "", "Filter apps by name")
99+
appListCmd.Flags().StringVar(&appQueryName, "name", "", "Filter apps by name")
93100
appListCmd.Flags().BoolVar(&appDetail, "detail", false, "Include user details for each app")
94101

95102
appListUsersCmd.Flags().StringVarP(&appOutput, "output", "o", "yaml", "Output format (yaml, json)")

cmd/user.go

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"os"
66

7-
"github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models"
87
"github.com/pepabo/onecli/onelogin"
98
"github.com/pepabo/onecli/utils"
109
"github.com/spf13/cobra"
@@ -17,8 +16,12 @@ var userCmd = &cobra.Command{
1716
}
1817

1918
var (
20-
queryParams onelogin.UserQuery
21-
output string
19+
userQueryEmail string
20+
userQueryUsername string
21+
userQueryFirstname string
22+
userQueryLastname string
23+
userQueryUserID string
24+
output string
2225
)
2326

2427
// initClient initializes the OneLogin client
@@ -42,7 +45,8 @@ var listCmd = &cobra.Command{
4245
return err
4346
}
4447

45-
users, err := client.GetUsers(queryParams)
48+
query := getUserQuery()
49+
users, err := client.GetUsers(query)
4650
if err != nil {
4751
return fmt.Errorf("error getting users: %v", err)
4852
}
@@ -60,11 +64,6 @@ var modifyCmd = &cobra.Command{
6064
Long: `Modify user information in your OneLogin organization`,
6165
}
6266

63-
// isQueryParamsEmpty checks if all query parameters are empty
64-
func isQueryParamsEmpty(params onelogin.UserQuery) bool {
65-
return params.Email == "" && params.Username == "" && params.Firstname == "" && params.Lastname == "" && params.ID == ""
66-
}
67-
6867
var modifyEmailCmd = &cobra.Command{
6968
Use: "email <new-email>",
7069
Aliases: []string{"m", "mod"},
@@ -73,7 +72,8 @@ var modifyEmailCmd = &cobra.Command{
7372
Args: cobra.ExactArgs(1),
7473
SilenceUsage: true,
7574
RunE: func(cmd *cobra.Command, args []string) error {
76-
if isQueryParamsEmpty(queryParams) {
75+
query := getUserQuery()
76+
if isQueryParamsEmpty(query) {
7777
return fmt.Errorf("at least one query parameter (email, username, firstname, lastname, or user-id) must be specified")
7878
}
7979

@@ -84,7 +84,7 @@ var modifyEmailCmd = &cobra.Command{
8484
return err
8585
}
8686

87-
users, err := client.GetUsers(queryParams)
87+
users, err := client.GetUsers(query)
8888
if err != nil {
8989
return fmt.Errorf("error getting users: %v", err)
9090
}
@@ -100,7 +100,7 @@ var modifyEmailCmd = &cobra.Command{
100100
user := users[0]
101101
user.Email = newEmail
102102

103-
_, err = client.UpdateUser(int(user.ID), user)
103+
err = client.UpdateUser(int(user.ID), user)
104104
if err != nil {
105105
return fmt.Errorf("error updating user: %v", err)
106106
}
@@ -125,38 +125,53 @@ var addCmd = &cobra.Command{
125125
return fmt.Errorf("error initializing OneLogin client: %v", err)
126126
}
127127

128-
newUser := models.User{
128+
newUser := onelogin.User{
129129
Firstname: firstName,
130130
Lastname: lastName,
131131
Email: email,
132132
}
133133

134-
createdUser, err := client.CreateUser(newUser)
134+
err = client.CreateUser(newUser)
135135
if err != nil {
136136
return fmt.Errorf("error creating user: %v", err)
137137
}
138138

139-
fmt.Printf("Successfully added user: %s %s with email: %s\n", createdUser.Firstname, createdUser.Lastname, createdUser.Email)
139+
fmt.Printf("Successfully added user: %s %s with email: %s\n", newUser.Firstname, newUser.Lastname, newUser.Email)
140140
return nil
141141
},
142142
}
143143

144+
func getUserQuery() onelogin.UserQuery {
145+
return onelogin.UserQuery{
146+
Email: &userQueryEmail,
147+
Username: &userQueryUsername,
148+
Firstname: &userQueryFirstname,
149+
Lastname: &userQueryLastname,
150+
UserIDs: &userQueryUserID,
151+
}
152+
}
153+
154+
// isQueryParamsEmpty checks if all query parameters are empty
155+
func isQueryParamsEmpty(params onelogin.UserQuery) bool {
156+
return params.Email == nil && params.Username == nil && params.Firstname == nil && params.Lastname == nil && params.UserIDs == nil
157+
}
158+
144159
func init() {
145160
userCmd.AddCommand(listCmd)
146161
userCmd.AddCommand(modifyCmd)
147162
modifyCmd.AddCommand(modifyEmailCmd)
148163
userCmd.AddCommand(addCmd)
149164

150165
listCmd.Flags().StringVarP(&output, "output", "o", "yaml", "Output format (yaml, json)")
151-
listCmd.Flags().StringVar(&queryParams.Email, "email", "", "Filter users by email")
152-
listCmd.Flags().StringVar(&queryParams.Username, "username", "", "Filter users by username")
153-
listCmd.Flags().StringVar(&queryParams.Firstname, "firstname", "", "Filter users by first name")
154-
listCmd.Flags().StringVar(&queryParams.Lastname, "lastname", "", "Filter users by last name")
155-
listCmd.Flags().StringVar(&queryParams.ID, "user-id", "", "Filter users by user ID")
156-
157-
modifyEmailCmd.Flags().StringVar(&queryParams.Email, "email", "", "Query by email")
158-
modifyEmailCmd.Flags().StringVar(&queryParams.Username, "username", "", "Query by username")
159-
modifyEmailCmd.Flags().StringVar(&queryParams.Firstname, "firstname", "", "Query by first name")
160-
modifyEmailCmd.Flags().StringVar(&queryParams.Lastname, "lastname", "", "Query by last name")
161-
modifyEmailCmd.Flags().StringVar(&queryParams.ID, "user-id", "", "Query by user ID")
166+
listCmd.Flags().StringVar(&userQueryEmail, "email", "", "Filter users by email")
167+
listCmd.Flags().StringVar(&userQueryUsername, "username", "", "Filter users by username")
168+
listCmd.Flags().StringVar(&userQueryFirstname, "firstname", "", "Filter users by first name")
169+
listCmd.Flags().StringVar(&userQueryLastname, "lastname", "", "Filter users by last name")
170+
listCmd.Flags().StringVar(&userQueryUserID, "user-id", "", "Filter users by user ID")
171+
172+
modifyEmailCmd.Flags().StringVar(&userQueryEmail, "email", "", "Query by email")
173+
modifyEmailCmd.Flags().StringVar(&userQueryUsername, "username", "", "Query by username")
174+
modifyEmailCmd.Flags().StringVar(&userQueryFirstname, "firstname", "", "Query by first name")
175+
modifyEmailCmd.Flags().StringVar(&userQueryLastname, "lastname", "", "Query by last name")
176+
modifyEmailCmd.Flags().StringVar(&userQueryUserID, "user-id", "", "Query by user ID")
162177
}

onelogin/app.go

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,67 +3,52 @@ package onelogin
33
import (
44
"strconv"
55

6-
"github.com/onelogin/onelogin-go-sdk/v4/pkg/onelogin/models"
76
"github.com/pepabo/onecli/utils"
87
)
98

10-
type AppQuery struct {
11-
Name string
12-
}
13-
149
// AppDetails represents an app with its associated details
1510
type AppDetails struct {
16-
models.App `json:",inline"`
17-
Users []models.User `json:"users,omitempty"`
11+
App `json:",inline"`
12+
Users []User `json:"users,omitempty"`
1813
}
1914

2015
// GetApps retrieves apps from Onelogin
21-
func (o *Onelogin) GetApps(query AppQuery) ([]models.App, error) {
22-
q := &models.AppQuery{
23-
Limit: strconv.Itoa(DefaultPageSize),
24-
Page: "1",
25-
}
16+
func (o *Onelogin) GetApps(query AppQuery) ([]App, error) {
17+
query.Limit = strconv.Itoa(DefaultPageSize)
2618

27-
if query.Name != "" {
28-
q.Name = &query.Name
29-
}
30-
31-
return utils.Paginate(func(page int) ([]models.App, error) {
32-
q.Page = strconv.Itoa(page)
33-
result, err := o.client.GetApps(q)
19+
return utils.Paginate(func(page int) ([]App, error) {
20+
query.Page = strconv.Itoa(page)
21+
result, err := o.client.GetApps(&query)
3422
if err != nil {
3523
return nil, err
3624
}
37-
38-
// []interface{} を []models.App に変換
39-
interfaceSlice := result.([]any)
40-
return utils.ConvertToSlice[models.App](interfaceSlice)
25+
return utils.ConvertToApps(result.([]any))
4126
}, DefaultPageSize)
4227
}
4328

4429
// GetAppsDetails retrieves apps with user details from Onelogin
4530
func (o *Onelogin) GetAppsDetails(query AppQuery) ([]AppDetails, error) {
46-
// GetAppsを内部的に呼び出してアプリ情報を取得
4731
apps, err := o.GetApps(query)
4832
if err != nil {
4933
return nil, err
5034
}
5135

52-
// 各アプリに対してユーザー情報を取得
5336
appsWithDetails := make([]AppDetails, len(apps))
5437
for i, app := range apps {
5538
appDetails := AppDetails{
5639
App: app,
5740
}
5841

59-
// アプリのIDが存在する場合のみユーザー情報を取得
6042
if app.ID != nil {
6143
users, err := o.GetAppUsers(int(*app.ID))
6244
if err != nil {
63-
// ユーザー情報の取得に失敗した場合は空のスライスを設定
64-
appDetails.Users = []models.User{}
45+
appDetails.Users = []User{}
6546
} else {
66-
appDetails.Users = users
47+
if users == nil {
48+
appDetails.Users = []User{}
49+
} else {
50+
appDetails.Users = users
51+
}
6752
}
6853
}
6954

@@ -74,13 +59,16 @@ func (o *Onelogin) GetAppsDetails(query AppQuery) ([]AppDetails, error) {
7459
}
7560

7661
// GetAppUsers retrieves users for a specific app from Onelogin
77-
func (o *Onelogin) GetAppUsers(appID int) ([]models.User, error) {
78-
result, err := o.client.GetAppUsers(appID)
79-
if err != nil {
80-
return nil, err
62+
func (o *Onelogin) GetAppUsers(appID int) ([]User, error) {
63+
query := UserQuery{
64+
Limit: strconv.Itoa(DefaultPageSize),
8165
}
82-
83-
// []interface{} を []models.User に変換
84-
interfaceSlice := result.([]any)
85-
return utils.ConvertToSlice[models.User](interfaceSlice)
66+
return utils.Paginate(func(page int) ([]User, error) {
67+
query.Page = strconv.Itoa(page)
68+
result, err := o.client.GetAppUsers(appID, &query)
69+
if err != nil {
70+
return nil, err
71+
}
72+
return utils.ConvertToUsers(result.([]any))
73+
}, DefaultPageSize)
8674
}

0 commit comments

Comments
 (0)