Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions cmd/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand All @@ -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 {
Expand Down Expand Up @@ -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)")
Expand Down
67 changes: 41 additions & 26 deletions cmd/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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
Expand All @@ -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)
}
Expand All @@ -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 <new-email>",
Aliases: []string{"m", "mod"},
Expand All @@ -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")
}

Expand All @@ -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)
}
Expand All @@ -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)
}
Expand All @@ -125,38 +125,53 @@ 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)
modifyCmd.AddCommand(modifyEmailCmd)
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")
}
62 changes: 25 additions & 37 deletions onelogin/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}

Expand All @@ -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)
}
Loading