Skip to content

Commit fcdb019

Browse files
committed
Fixed an unstable JSON error
1 parent 387e8e1 commit fcdb019

File tree

5 files changed

+26
-20
lines changed

5 files changed

+26
-20
lines changed

internal/provider/authorizationmodel/authorization_model_data_source_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ func TestAccAuthorizationModelDataSource(t *testing.T) {
4242
})
4343
}
4444

45-
const expectedFirstAuthorizationModelDataSourceModelJson = `{"schema_version":"1.1","type_definitions":[{"type":"document"}]}`
46-
const expectedLatestAuthorizationModelDataSourceModelJson = `{"schema_version":"1.1","type_definitions":[{"type":"file"}]}`
45+
const expectedFirstAuthorizationModelDataSourceModelJson = `{"conditions":{},"schema_version":"1.1","type_definitions":[{"relations":{},"type":"document"}]}`
46+
const expectedLatestAuthorizationModelDataSourceModelJson = `{"conditions":{},"schema_version":"1.1","type_definitions":[{"relations":{},"type":"file"}]}`
4747

4848
func testAccAuthorizationModelDataSourceConfig() string {
4949
return fmt.Sprintf(`

internal/provider/authorizationmodel/authorization_model_document_data_source.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
1111
"github.com/hashicorp/terraform-plugin-framework/path"
1212
"github.com/hashicorp/terraform-plugin-framework/types"
13+
"google.golang.org/protobuf/encoding/protojson"
1314

1415
openfga "github.com/openfga/go-sdk"
1516
"github.com/openfga/language/pkg/go/transformer"
@@ -98,8 +99,8 @@ func (d *AuthorizationModelDocumentDataSource) Read(ctx context.Context, req dat
9899
}
99100

100101
model := state.Model
101-
jsonString := state.Json.ValueStringPointer()
102102
dslString := state.Dsl.ValueStringPointer()
103+
jsonString := state.Json.ValueStringPointer()
103104

104105
if model != nil {
105106
result, err := json.Marshal(state.Model)
@@ -111,43 +112,48 @@ func (d *AuthorizationModelDocumentDataSource) Read(ctx context.Context, req dat
111112
jsonString = openfga.PtrString(string(result))
112113
}
113114

114-
if jsonString != nil {
115-
result, err := transformer.TransformJSONStringToDSL(*jsonString)
115+
if dslString != nil {
116+
result, err := transformer.TransformDSLToJSON(*dslString)
116117
if err != nil {
117-
resp.Diagnostics.AddError("Input Error", fmt.Sprintf("Unable to transform JSON into DSL, got error: %s", err))
118+
resp.Diagnostics.AddError("Input Error", fmt.Sprintf("Unable to transform DSL into JSON, got error: %s", err))
118119
return
119120
}
120121

121-
dslString = result
122+
jsonString = openfga.PtrString(result)
122123
}
123124

124-
if dslString == nil {
125-
resp.Diagnostics.AddError("Input Error", "DSL is undefined")
125+
if jsonString == nil {
126+
resp.Diagnostics.AddError("Input Error", "JSON is undefined")
126127
return
127128
}
128129

129-
// Transform DSL to canonical JSON form
130-
unstableResult, err := transformer.TransformDSLToJSON(*dslString)
130+
modelProto, err := transformer.LoadJSONStringToProto(*jsonString)
131131
if err != nil {
132-
resp.Diagnostics.AddError("Input Error", fmt.Sprintf("Unable to transform DSL into JSON, got error: %s", err))
132+
resp.Diagnostics.AddError("Input Error", fmt.Sprintf("Unable to transform JSON into Proto, got error: %s", err))
133133
return
134134
}
135135

136-
var tmp any
137-
err = json.Unmarshal([]byte(unstableResult), &tmp)
136+
marshaller := protojson.MarshalOptions{EmitDefaultValues: true}
137+
unstableJsonBytes, err := marshaller.Marshal(modelProto)
138138
if err != nil {
139139
resp.Diagnostics.AddError("Input Error", fmt.Sprintf("Unable to bring JSON in canonical form, got error: %s", err))
140140
return
141141
}
142-
stableResultBytes, err := json.Marshal(tmp)
142+
143+
var sanitizedAuthorizationModel AuthorizationModelWithoutId
144+
err = json.Unmarshal(unstableJsonBytes, &sanitizedAuthorizationModel)
143145
if err != nil {
144146
resp.Diagnostics.AddError("Input Error", fmt.Sprintf("Unable to bring JSON in canonical form, got error: %s", err))
145147
return
146148
}
147149

148-
stableResult := string(stableResultBytes)
150+
stableResultBytes, err := json.Marshal(sanitizedAuthorizationModel)
151+
if err != nil {
152+
resp.Diagnostics.AddError("Input Error", fmt.Sprintf("Unable to bring JSON in canonical form, got error: %s", err))
153+
return
154+
}
149155

150-
state.Result = types.StringValue(stableResult)
156+
state.Result = types.StringValue(string(stableResultBytes))
151157

152158
resp.Diagnostics.Append(resp.State.Set(ctx, &state)...)
153159
}

internal/provider/authorizationmodel/authorization_model_document_data_source_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func TestAccAuthorizationModelDocumentDataSource(t *testing.T) {
5454
})
5555
}
5656

57-
const expectedAuthorizationModelDocumentDataSourceResult = `{"conditions":{"larger_than":{"expression":"a \u003e b","name":"larger_than","parameters":{"a":{"type_name":"TYPE_NAME_INT"},"b":{"type_name":"TYPE_NAME_INT"}}}},"schema_version":"1.1","type_definitions":[{"type":"user"},{"metadata":{"relations":{"viewer":{"directly_related_user_types":[{"type":"user"}]}}},"relations":{"viewer":{"this":{}}},"type":"document"}]}`
57+
const expectedAuthorizationModelDocumentDataSourceResult = `{"conditions":{"larger_than":{"expression":"a \u003e b","name":"larger_than","parameters":{"a":{"generic_types":[],"type_name":"TYPE_NAME_INT"},"b":{"generic_types":[],"type_name":"TYPE_NAME_INT"}}}},"schema_version":"1.1","type_definitions":[{"relations":{},"type":"user"},{"metadata":{"module":"","relations":{"viewer":{"directly_related_user_types":[{"condition":"","type":"user"}],"module":""}}},"relations":{"viewer":{"this":{}}},"type":"document"}]}`
5858

5959
func testAccAuthorizationModelDocumentDataSourceConfigDsl() string {
6060
return fmt.Sprintf(`

internal/provider/authorizationmodel/authorization_model_resource_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func TestAccAuthorizationModelResource(t *testing.T) {
9696
}
9797

9898
func testAccAuthorizationModelResourceModelJson(typeName string) string {
99-
return fmt.Sprintf(`{"conditions":{"non_expired_grant":{"expression":"current_time == grant_time + grant_duration","name":"non_expired_grant","parameters":{"current_time":{"type_name":"TYPE_NAME_TIMESTAMP"},"grant_duration":{"type_name":"TYPE_NAME_DURATION"},"grant_time":{"type_name":"TYPE_NAME_TIMESTAMP"}}}},"schema_version":"1.1","type_definitions":[{"type":"user"},{"metadata":{"relations":{"viewer":{"directly_related_user_types":[{"condition":"non_expired_grant","type":"user"}]}}},"relations":{"viewer":{"this":{}}},"type":%[1]q}]}`, typeName)
99+
return fmt.Sprintf(`{"conditions":{"non_expired_grant":{"expression":"current_time == grant_time + grant_duration","name":"non_expired_grant","parameters":{"current_time":{"generic_types":[],"type_name":"TYPE_NAME_TIMESTAMP"},"grant_duration":{"generic_types":[],"type_name":"TYPE_NAME_DURATION"},"grant_time":{"generic_types":[],"type_name":"TYPE_NAME_TIMESTAMP"}}}},"schema_version":"1.1","type_definitions":[{"relations":{},"type":"user"},{"metadata":{"module":"","relations":{"viewer":{"directly_related_user_types":[{"condition":"non_expired_grant","type":"user"}],"module":""}}},"relations":{"viewer":{"this":{}}},"type":%[1]q}]}`, typeName)
100100
}
101101

102102
func testAccAuthorizationModelResourceConfig(modelJson string) string {

internal/provider/authorizationmodel/authorization_models_data_source_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func TestAccAuthorizationModelsDataSource(t *testing.T) {
6666
}
6767

6868
func testAccAuthorizationModelsDataSourceModelJson(typeName string) string {
69-
return fmt.Sprintf(`{"schema_version":"1.1","type_definitions":[{"type":%[1]q}]}`, typeName)
69+
return fmt.Sprintf(`{"conditions":{},"schema_version":"1.1","type_definitions":[{"relations":{},"type":%[1]q}]}`, typeName)
7070
}
7171

7272
func testAccAuthorizationModelsDataSourceConfig(modelJsons ...string) string {

0 commit comments

Comments
 (0)