package sqlserverflexbeta import ( "fmt" "slices" "strconv" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/v3beta1api" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/conversion" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/core" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/utils" ) // mapDataSourceFields maps the API response to a dataSourceModel. func mapDataSourceFields(userResp *v3beta1api.GetUserResponse, model *dataSourceModel, region string) error { if userResp == nil { return fmt.Errorf("response is nil") } if model == nil { return fmt.Errorf("model input is nil") } user := userResp // Handle user ID var userId int64 if model.UserId.ValueInt64() != 0 { userId = model.UserId.ValueInt64() } else if user.Id != 0 { userId = user.Id } else { return fmt.Errorf("user id not present") } // Set main attributes model.Id = utils.BuildInternalTerraformId( model.ProjectId.ValueString(), region, model.InstanceId.ValueString(), strconv.FormatInt(userId, 10), ) model.UserId = types.Int64Value(userId) model.Username = types.StringValue(user.Username) // Map roles if user.Roles == nil { model.Roles = types.List(types.SetNull(types.StringType)) } else { var roles []attr.Value resRoles := user.Roles slices.Sort(resRoles) for _, role := range resRoles { roles = append(roles, types.StringValue(string(role))) } rolesSet, diags := types.SetValue(types.StringType, roles) if diags.HasError() { return fmt.Errorf("failed to map roles: %w", core.DiagsToError(diags)) } model.Roles = types.List(rolesSet) } // Set remaining attributes model.Host = types.StringValue(user.Host) model.Port = types.Int64Value(int64(user.Port)) model.Region = types.StringValue(region) model.Status = types.StringValue(user.Status) model.DefaultDatabase = types.StringValue(user.DefaultDatabase) return nil } // mapFields maps the API response to a resourceModel. func mapFields(userResp *v3beta1api.GetUserResponse, model *resourceModel, region string) error { if userResp == nil { return fmt.Errorf("response is nil") } if model == nil { return fmt.Errorf("model input is nil") } user := userResp // Handle user ID var userId int64 if model.UserId.ValueInt64() != 0 { userId = model.UserId.ValueInt64() } else if user.Id != 0 { userId = user.Id } else { return fmt.Errorf("user id not present") } // Set main attributes model.Id = types.Int64Value(userId) model.UserId = types.Int64Value(userId) model.Username = types.StringValue(user.Username) // Map roles if userResp.Roles != nil { resRoles := userResp.Roles slices.Sort(resRoles) var roles []attr.Value for _, role := range resRoles { roles = append(roles, types.StringValue(string(role))) } rolesSet, diags := types.ListValue(types.StringType, roles) if diags.HasError() { return fmt.Errorf("failed to map roles: %w", core.DiagsToError(diags)) } model.Roles = rolesSet } // Ensure roles is not null if model.Roles.IsNull() || model.Roles.IsUnknown() { model.Roles = types.List(types.SetNull(types.StringType)) } // Set connection details model.Host = types.StringValue(user.Host) model.Port = types.Int64Value(int64(user.Port)) model.Region = types.StringValue(region) return nil } // mapFieldsCreate maps the API response from creating a user to a resourceModel. func mapFieldsCreate(userResp *v3beta1api.CreateUserResponse, model *resourceModel, region string) error { if userResp == nil { return fmt.Errorf("response is nil") } if model == nil { return fmt.Errorf("model input is nil") } user := userResp userId := user.Id model.Id = types.Int64Value(userId) model.UserId = types.Int64Value(userId) model.Username = types.StringValue(user.Username) model.Password = types.StringValue(user.Password) if user.Roles != nil { resRoles := user.Roles slices.Sort(resRoles) var roles []attr.Value for _, role := range resRoles { roles = append(roles, types.StringValue(string(role))) } rolesList, diags := types.ListValue(types.StringType, roles) if diags.HasError() { return fmt.Errorf("failed to map roles: %w", core.DiagsToError(diags)) } model.Roles = rolesList } if model.Roles.IsNull() || model.Roles.IsUnknown() { model.Roles = types.List(types.SetNull(types.StringType)) } model.Password = types.StringValue(user.Password) model.Uri = types.StringValue(user.Uri) model.Host = types.StringValue(user.Host) model.Port = types.Int64Value(int64(user.Port)) model.Region = types.StringValue(region) model.Status = types.StringValue(user.Status) model.DefaultDatabase = types.StringValue(user.DefaultDatabase) return nil } // toCreatePayload converts a resourceModel to an API CreateUserRequestPayload. func toCreatePayload( model *resourceModel, roles []string, ) (*v3beta1api.CreateUserRequestPayload, error) { if model == nil { return nil, fmt.Errorf("nil model") } pl := v3beta1api.CreateUserRequestPayload{ Username: model.Username.ValueString(), Roles: roles, } slices.Sort(roles) if !model.DefaultDatabase.IsNull() || !model.DefaultDatabase.IsUnknown() { pl.DefaultDatabase = conversion.StringValueToPointer(model.DefaultDatabase) } return &pl, nil }