diff --git a/jumpcloud/data_source_jumpcloud_application.go b/jumpcloud/data_source_jumpcloud_application.go index 188b7e0..adcddc4 100644 --- a/jumpcloud/data_source_jumpcloud_application.go +++ b/jumpcloud/data_source_jumpcloud_application.go @@ -51,7 +51,7 @@ func dataSourceJumpCloudApplicationRead(d *schema.ResourceData, m interface{}) e for _, application := range applications { log.Printf("[DEBUG] Checking application with DisplayName: %s, DisplayLabel: %s\n", application.DisplayName, application.DisplayLabel) - + if (nameExists && application.DisplayName == applicationName) || (displayLabelExists && application.DisplayLabel == displayLabel) { d.SetId(application.Id) return nil diff --git a/jumpcloud/data_source_test.go b/jumpcloud/data_source_test.go index 236c8c4..ca35b31 100644 --- a/jumpcloud/data_source_test.go +++ b/jumpcloud/data_source_test.go @@ -7,7 +7,7 @@ import ( // "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) -//Make sure to replace "your-jumpcloud-api-key" with your actual JumpCloud API key. +// Make sure to replace "your-jumpcloud-api-key" with your actual JumpCloud API key. const testConfig = ` provider "jumpcloud" { # Configure your JumpCloud API key @@ -21,9 +21,9 @@ data "jumpcloud_user" "test" { func TestAccDataSourceJumpCloudUser(t *testing.T) { resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, + PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, - CheckDestroy: nil, + CheckDestroy: nil, Steps: []resource.TestStep{ { Config: testConfig, @@ -34,4 +34,4 @@ func TestAccDataSourceJumpCloudUser(t *testing.T) { }, }, }) -} \ No newline at end of file +} diff --git a/jumpcloud/data_source_user.go b/jumpcloud/data_source_user.go index af17e26..b480d22 100644 --- a/jumpcloud/data_source_user.go +++ b/jumpcloud/data_source_user.go @@ -37,14 +37,12 @@ func getUserDetails(client *jcapiv1.APIClient, email string) (*jcapiv1.Systemuse filterJson := fmt.Sprintf("[{\"email\": \"%s\"}]", email) var filter interface{} json.Unmarshal([]byte(filterJson), &filter) - + optionals := map[string]interface{}{ "body": jcapiv1.Search{ Filter: &filter, }, } - - res, _, err := client.SearchApi.SearchSystemusersPost(ctx, contentType, accept, optionals) if err != nil { @@ -62,7 +60,6 @@ func getUserDetails(client *jcapiv1.APIClient, email string) (*jcapiv1.Systemuse return &user, nil } - func dataSourceJumpCloudUserRead(d *schema.ResourceData, m interface{}) error { configv1 := convertV2toV1Config(m.(*jcapiv2.Configuration)) client := jcapiv1.NewAPIClient(configv1) diff --git a/jumpcloud/provider.go b/jumpcloud/provider.go index 2010212..c5a9c24 100644 --- a/jumpcloud/provider.go +++ b/jumpcloud/provider.go @@ -25,19 +25,18 @@ func Provider() *schema.Provider { }, }, ResourcesMap: map[string]*schema.Resource{ - "jumpcloud_application": resourceApplication(), - "jumpcloud_user": resourceUser(), - "jumpcloud_user_group": resourceUserGroup(), - "jumpcloud_user_group_membership": resourceUserGroupMembership(), - "jumpcloud_system_group": resourceGroupsSystem(), + "jumpcloud_application": resourceApplication(), + "jumpcloud_user": resourceUser(), + "jumpcloud_user_group": resourceUserGroup(), + "jumpcloud_user_group_membership": resourceUserGroupMembership(), + "jumpcloud_system_group": resourceGroupsSystem(), "jumpcloud_user_group_association": resourceUserGroupAssociation(), }, DataSourcesMap: map[string]*schema.Resource{ - "jumpcloud_user": dataSourceJumpCloudUser(), - "jumpcloud_user_group": dataSourceJumpCloudUserGroup(), + "jumpcloud_user": dataSourceJumpCloudUser(), + "jumpcloud_user_group": dataSourceJumpCloudUserGroup(), "jumpcloud_application": dataSourceJumpCloudApplication(), - - }, + }, ConfigureFunc: providerConfigure, } } diff --git a/jumpcloud/resource_application_test.go b/jumpcloud/resource_application_test.go index bff0b78..7105869 100644 --- a/jumpcloud/resource_application_test.go +++ b/jumpcloud/resource_application_test.go @@ -46,4 +46,4 @@ resource "jumpcloud_application" "example_app" { aws_session_duration = 432000 } `, displayLabel, randSuffix) -} \ No newline at end of file +} diff --git a/jumpcloud/resource_system_group.go b/jumpcloud/resource_system_group.go index ba8ccf2..66ee393 100644 --- a/jumpcloud/resource_system_group.go +++ b/jumpcloud/resource_system_group.go @@ -5,7 +5,7 @@ import ( "fmt" jcapiv2 "github.com/TheJumpCloud/jcapi-go/v2" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func resourceGroupsSystem() *schema.Resource { diff --git a/jumpcloud/resource_user.go b/jumpcloud/resource_user.go index 3551599..e19ce20 100644 --- a/jumpcloud/resource_user.go +++ b/jumpcloud/resource_user.go @@ -211,14 +211,11 @@ func resourceUserUpdate(d *schema.ResourceData, m interface{}) error { return err } - // The code from the create function is almost identical, but the structure is different : - // jcapiv1.Systemuserput != jcapiv1.Systemuserputpost payload := jcapiv1.Systemuserput{ Username: d.Get("username").(string), Email: d.Get("email").(string), Firstname: d.Get("firstname").(string), Lastname: d.Get("lastname").(string), - Displayname: d.Get("display_name").(string), Password: d.Get("password").(string), EnableUserPortalMultifactor: d.Get("enable_mfa").(bool), LdapBindingUser: d.Get("ldap_binding_user").(bool), @@ -228,6 +225,15 @@ func resourceUserUpdate(d *schema.ResourceData, m interface{}) error { PhoneNumbers: phoneNumbers, } + // Dynamically set the display name if there's a change + if d.HasChange("display_name") { + if displayName, ok := d.GetOk("display_name"); ok { + payload.Displayname = displayName.(string) + } else { + payload.Displayname = "" // Clear display name if not provided in the config + } + } + req := map[string]interface{}{ "body": payload, } diff --git a/jumpcloud/resource_user_group_association.go b/jumpcloud/resource_user_group_association.go index 7abe380..14568e2 100644 --- a/jumpcloud/resource_user_group_association.go +++ b/jumpcloud/resource_user_group_association.go @@ -12,10 +12,10 @@ import ( func resourceUserGroupAssociation() *schema.Resource { return &schema.Resource{ Description: "Provides a resource for associating a JumpCloud user group to objects like SSO applications, G Suite, Office 365, LDAP and more.", - Create: resourceUserGroupAssociationCreate, - Read: resourceUserGroupAssociationRead, - Update: nil, - Delete: resourceUserGroupAssociationDelete, + Create: resourceUserGroupAssociationCreate, + Read: resourceUserGroupAssociationRead, + Update: nil, + Delete: resourceUserGroupAssociationDelete, Schema: map[string]*schema.Schema{ "group_id": { Description: "The ID of the `resource_user_group` resource.", @@ -59,7 +59,6 @@ func resourceUserGroupAssociation() *schema.Resource { } } - func modifyUserGroupAssociation(client *jcapiv2.APIClient, d *schema.ResourceData, action string) diag.Diagnostics { @@ -90,7 +89,6 @@ func resourceUserGroupAssociationCreate(d *schema.ResourceData, meta interface{} return resourceUserGroupAssociationRead(d, meta) } - func resourceUserGroupAssociationRead(d *schema.ResourceData, meta interface{}) error { config := meta.(*jcapiv2.Configuration) client := jcapiv2.NewAPIClient(config) @@ -128,4 +126,4 @@ func resourceUserGroupAssociationDelete(d *schema.ResourceData, meta interface{} return fmt.Errorf("Error deleting user group association: %v", diags) } return nil -} \ No newline at end of file +} diff --git a/jumpcloud/resource_user_group_association_test.go b/jumpcloud/resource_user_group_association_test.go index 3327054..93bae9d 100644 --- a/jumpcloud/resource_user_group_association_test.go +++ b/jumpcloud/resource_user_group_association_test.go @@ -12,9 +12,9 @@ func TestAccUserGroupAssociation(t *testing.T) { randSuffix := acctest.RandStringFromCharSet(10, acctest.CharSetAlpha) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: nil, + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: nil, Steps: []resource.TestStep{ { Config: testUserGroupAssocConfig(randSuffix), @@ -42,4 +42,4 @@ resource "jumpcloud_user_group_association" "test_association" { type = "application" } `, randSuffix, randSuffix, randSuffix) -} \ No newline at end of file +} diff --git a/jumpcloud/resource_user_group_membership.go b/jumpcloud/resource_user_group_membership.go index ef10b4a..fa35964 100644 --- a/jumpcloud/resource_user_group_membership.go +++ b/jumpcloud/resource_user_group_membership.go @@ -11,85 +11,85 @@ import ( ) func resourceUserGroupMembership() *schema.Resource { - return &schema.Resource{ - Description: "Provides a resource for managing user group memberships.", - Create: resourceUserGroupMembershipCreate, - Read: resourceUserGroupMembershipRead, - Update: nil, // No update routine, as association cannot be updated - Delete: resourceUserGroupMembershipDelete, - Schema: map[string]*schema.Schema{ - "userid": { - Description: "The ID of the `resource_user` object.", - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - "groupid": { - Description: "The ID of the `resource_user_group` object.", - Type: schema.TypeString, - Required: true, - ForceNew: true, - }, - }, - Importer: &schema.ResourceImporter{ - State: userGroupMembershipImporter, - }, - } + return &schema.Resource{ + Description: "Provides a resource for managing user group memberships.", + Create: resourceUserGroupMembershipCreate, + Read: resourceUserGroupMembershipRead, + Update: nil, // No update routine, as association cannot be updated + Delete: resourceUserGroupMembershipDelete, + Schema: map[string]*schema.Schema{ + "userid": { + Description: "The ID of the `resource_user` object.", + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + "groupid": { + Description: "The ID of the `resource_user_group` object.", + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + }, + Importer: &schema.ResourceImporter{ + State: userGroupMembershipImporter, + }, + } } func userGroupMembershipImporter(d *schema.ResourceData, m interface{}) ([]*schema.ResourceData, error) { - ids := strings.Split(d.Id(), "/") - if len(ids) != 2 { - return nil, fmt.Errorf("Invalid import format. Expected 'groupid/userid'") - } - groupID, userID := ids[0], ids[1] + ids := strings.Split(d.Id(), "/") + if len(ids) != 2 { + return nil, fmt.Errorf("Invalid import format. Expected 'groupid/userid'") + } + groupID, userID := ids[0], ids[1] - _ = d.Set("groupid", groupID) - _ = d.Set("userid", userID) + _ = d.Set("groupid", groupID) + _ = d.Set("userid", userID) - config := m.(*jcapiv2.Configuration) - client := jcapiv2.NewAPIClient(config) + config := m.(*jcapiv2.Configuration) + client := jcapiv2.NewAPIClient(config) - isMember, err := checkUserGroupMembership(client, groupID, userID) - if err != nil { - return nil, err - } + isMember, err := checkUserGroupMembership(client, groupID, userID) + if err != nil { + return nil, err + } - if isMember { - d.SetId(groupID + "/" + userID) - return []*schema.ResourceData{d}, nil - } + if isMember { + d.SetId(groupID + "/" + userID) + return []*schema.ResourceData{d}, nil + } - return nil, fmt.Errorf("User %s is not a member of group %s", userID, groupID) + return nil, fmt.Errorf("User %s is not a member of group %s", userID, groupID) } func checkUserGroupMembership(client *jcapiv2.APIClient, groupID, userID string) (bool, error) { - for i := 0; ; i++ { - optionals := map[string]interface{}{ - "groupId": groupID, - "limit": int32(100), - "skip": int32(i * 100), - } - - graphconnect, _, err := client.UserGroupMembersMembershipApi.GraphUserGroupMembersList( - context.TODO(), groupID, "", "", optionals) - if err != nil { - return false, err - } - - for _, v := range graphconnect { - if v.To.Id == userID { - return true, nil - } - } - - if len(graphconnect) < 100 { - break - } else { - time.Sleep(100 * time.Millisecond) - } - } - return false, nil + for i := 0; ; i++ { + optionals := map[string]interface{}{ + "groupId": groupID, + "limit": int32(100), + "skip": int32(i * 100), + } + + graphconnect, _, err := client.UserGroupMembersMembershipApi.GraphUserGroupMembersList( + context.TODO(), groupID, "", "", optionals) + if err != nil { + return false, err + } + + for _, v := range graphconnect { + if v.To.Id == userID { + return true, nil + } + } + + if len(graphconnect) < 100 { + break + } else { + time.Sleep(100 * time.Millisecond) + } + } + return false, nil } func modifyUserGroupMembership(client *jcapiv2.APIClient, @@ -108,7 +108,7 @@ func modifyUserGroupMembership(client *jcapiv2.APIClient, _, err := client.UserGroupMembersMembershipApi.GraphUserGroupMembersPost( context.TODO(), d.Get("groupid").(string), "", "", req) - return err + return err } func resourceUserGroupMembershipCreate(d *schema.ResourceData, m interface{}) error { @@ -131,7 +131,7 @@ func resourceUserGroupMembershipRead(d *schema.ResourceData, m interface{}) erro optionals := map[string]interface{}{ "groupId": d.Get("groupid").(string), "limit": int32(100), - "skip": int32(i * 100), + "skip": int32(i * 100), } graphconnect, _, err := client.UserGroupMembersMembershipApi.GraphUserGroupMembersList( diff --git a/jumpcloud/structures_user.go b/jumpcloud/structures_user.go index 7d5b7cb..61f5709 100644 --- a/jumpcloud/structures_user.go +++ b/jumpcloud/structures_user.go @@ -4,7 +4,7 @@ import ( jcapiv1 "github.com/TheJumpCloud/jcapi-go/v1" ) -func flattenPhoneNumbers(pn []jcapiv1.SystemuserreturnPhoneNumbers) []interface{} { +func flattenPhoneNumbers(pn []jcapiv1.SystemuserreturnPhoneNumbers) []interface{} { if pn == nil { return make([]interface{}, 0) } @@ -12,7 +12,7 @@ func flattenPhoneNumbers(pn []jcapiv1.SystemuserreturnPhoneNumbers) []interface phoneNumbers := make([]interface{}, 0) for _, v := range pn { phoneNumbers = append(phoneNumbers, map[string]interface{}{ - "type": v.Type_, + "type": v.Type_, "number": v.Number, }) } @@ -30,7 +30,7 @@ func expandPhoneNumbers(input []interface{}) []map[string]string { if phoneNumber, ok := v.(map[string]interface{}); ok { phoneNumbers = append(phoneNumbers, map[string]string{ "number": phoneNumber["number"].(string), - "type": phoneNumber["type"].(string), + "type": phoneNumber["type"].(string), }) } diff --git a/jumpcloud/utils.go b/jumpcloud/utils.go index 7cc3f04..e71938d 100644 --- a/jumpcloud/utils.go +++ b/jumpcloud/utils.go @@ -37,4 +37,4 @@ func stringInSlice(a string, list []string) bool { } } return false -} \ No newline at end of file +}