Skip to content

Commit 73a088d

Browse files
authored
fix: UpdatePolicy update mask (bytebase#17240)
1 parent 7c454e1 commit 73a088d

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

backend/api/v1/org_policy_service.go

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,19 @@ func (s *OrgPolicyService) UpdatePolicy(ctx context.Context, req *connect.Reques
160160
switch path {
161161
case "inherit_from_parent":
162162
patch.InheritFromParent = &req.Msg.Policy.InheritFromParent
163-
case "payload":
163+
case
164+
"rollout_policy",
165+
"disable_copy_data_policy",
166+
"masking_rule_policy",
167+
"masking_exception_policy",
168+
"restrict_issue_creation_for_sql_review_policy",
169+
"tag_policy",
170+
"data_source_query_policy",
171+
"export_data_policy",
172+
"query_data_policy":
173+
if !pathMatchType(path, policy.Type) {
174+
return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("invalid path %s for policy type %s", path, policy.Type.String()))
175+
}
164176
if err := validatePolicyPayload(policy.Type, req.Msg.Policy); err != nil {
165177
return nil, connect.NewError(connect.CodeInvalidArgument, errors.Wrap(err, "invalid policy"))
166178
}
@@ -172,6 +184,7 @@ func (s *OrgPolicyService) UpdatePolicy(ctx context.Context, req *connect.Reques
172184
case "enforce":
173185
patch.Enforce = &req.Msg.Policy.Enforce
174186
default:
187+
return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("unexpected path %s", path))
175188
}
176189
}
177190

@@ -188,6 +201,31 @@ func (s *OrgPolicyService) UpdatePolicy(ctx context.Context, req *connect.Reques
188201
return connect.NewResponse(response), nil
189202
}
190203

204+
func pathMatchType(path string, policyType storepb.Policy_Type) bool {
205+
switch policyType {
206+
case storepb.Policy_ROLLOUT:
207+
return path == "rollout_policy"
208+
case storepb.Policy_DISABLE_COPY_DATA:
209+
return path == "disable_copy_data_policy"
210+
case storepb.Policy_MASKING_RULE:
211+
return path == "masking_rule_policy"
212+
case storepb.Policy_MASKING_EXCEPTION:
213+
return path == "masking_exception_policy"
214+
case storepb.Policy_RESTRICT_ISSUE_CREATION_FOR_SQL_REVIEW:
215+
return path == "restrict_issue_creation_for_sql_review_policy"
216+
case storepb.Policy_TAG:
217+
return path == "tag_policy"
218+
case storepb.Policy_DATA_SOURCE_QUERY:
219+
return path == "data_source_query_policy"
220+
case storepb.Policy_EXPORT_DATA:
221+
return path == "export_data_policy"
222+
case storepb.Policy_QUERY_DATA:
223+
return path == "query_data_policy"
224+
default:
225+
return false
226+
}
227+
}
228+
191229
// DeletePolicy deletes a policy for a specific resource.
192230
func (s *OrgPolicyService) DeletePolicy(ctx context.Context, req *connect.Request[v1pb.DeletePolicyRequest]) (*connect.Response[emptypb.Empty], error) {
193231
policy, _, err := s.findPolicyMessage(ctx, req.Msg.Name)

frontend/src/store/modules/v1/policy.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export const usePolicyV1Store = defineStore("policy_v1", {
185185
});
186186
const request = create(UpdatePolicyRequestSchema, {
187187
policy: fullPolicy,
188-
updateMask: { paths: ["payload"] },
188+
updateMask: { paths: getUpdateMaskFromPolicyType(policy.type) },
189189
allowMissing: true,
190190
});
191191
const response =
@@ -201,6 +201,33 @@ export const usePolicyV1Store = defineStore("policy_v1", {
201201
},
202202
});
203203

204+
const getUpdateMaskFromPolicyType = (policyType: PolicyType) => {
205+
switch (policyType) {
206+
case PolicyType.ROLLOUT_POLICY:
207+
return [PolicySchema.field.rolloutPolicy.name];
208+
case PolicyType.MASKING_EXCEPTION:
209+
return [PolicySchema.field.maskingExceptionPolicy.name];
210+
case PolicyType.MASKING_RULE:
211+
return [PolicySchema.field.maskingRulePolicy.name];
212+
case PolicyType.DATA_EXPORT:
213+
return [PolicySchema.field.exportDataPolicy.name];
214+
case PolicyType.DATA_QUERY:
215+
return [PolicySchema.field.queryDataPolicy.name];
216+
case PolicyType.DATA_SOURCE_QUERY:
217+
return [PolicySchema.field.dataSourceQueryPolicy.name];
218+
case PolicyType.DISABLE_COPY_DATA:
219+
return [PolicySchema.field.disableCopyDataPolicy.name];
220+
case PolicyType.RESTRICT_ISSUE_CREATION_FOR_SQL_REVIEW:
221+
return [PolicySchema.field.restrictIssueCreationForSqlReviewPolicy.name];
222+
case PolicyType.TAG:
223+
return [PolicySchema.field.tagPolicy.name];
224+
case PolicyType.POLICY_TYPE_UNSPECIFIED:
225+
throw new Error("unexpected POLICY_TYPE_UNSPECIFIED");
226+
default:
227+
throw new Error(`unknown policyType ${policyType satisfies never}`);
228+
}
229+
};
230+
204231
export const usePolicyListByResourceTypeAndPolicyType = (
205232
params: MaybeRef<{
206233
resourceType: PolicyResourceType;

0 commit comments

Comments
 (0)