Skip to content

Commit 3200af5

Browse files
committed
feat: policy editor — accordion, what-if dry-eval, view-aware warnings, budget labeling (A1/A5/A3/1.4/3.3) (#933)
Synced from sferarc/pgbeam@7f3c13f
1 parent 8cc3538 commit 3200af5

11 files changed

Lines changed: 459 additions & 0 deletions

src/generated/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ export type { DeleteReplicaPathDatabaseId, DeleteReplicaPathReplicaId, DeleteRep
4343
export type { DeleteWebhookEndpointPathProjectId, DeleteWebhookEndpointPathWebhookId, DeleteWebhookEndpointRequestConfig, DeleteWebhookEndpointResponse, DeleteWebhookEndpointResponses, DeleteWebhookEndpointStatus204, DeleteWebhookEndpointStatus400, DeleteWebhookEndpointStatus401, DeleteWebhookEndpointStatus403, DeleteWebhookEndpointStatus404 } from "./types/DeleteWebhookEndpoint";
4444
export type { DiscardDatabaseBranchPathBranchId, DiscardDatabaseBranchPathProjectId, DiscardDatabaseBranchRequestConfig, DiscardDatabaseBranchResponse, DiscardDatabaseBranchResponses, DiscardDatabaseBranchStatus204, DiscardDatabaseBranchStatus400, DiscardDatabaseBranchStatus401, DiscardDatabaseBranchStatus403, DiscardDatabaseBranchStatus404 } from "./types/DiscardDatabaseBranch";
4545
export type { DnsInstructions } from "./types/DnsInstructions";
46+
export type { DryEvalInput } from "./types/DryEvalInput";
47+
export type { DryEvalMaskedColumn, DryEvalMaskedColumnKindEnumKey } from "./types/DryEvalMaskedColumn";
48+
export type { DryEvalPolicyData, DryEvalPolicyPathProjectId, DryEvalPolicyRequestConfig, DryEvalPolicyResponse, DryEvalPolicyResponses, DryEvalPolicyStatus200, DryEvalPolicyStatus400, DryEvalPolicyStatus401, DryEvalPolicyStatus403, DryEvalPolicyStatus404, DryEvalPolicyStatus429 } from "./types/DryEvalPolicy";
49+
export type { DryEvalResult, DryEvalResultVerdictEnumKey } from "./types/DryEvalResult";
4650
export type { Error } from "./types/Error";
4751
export type { ExportAccountDataRequestConfig, ExportAccountDataResponse, ExportAccountDataResponses, ExportAccountDataStatus200, ExportAccountDataStatus401, ExportAccountDataStatus404, ExportAccountDataStatus429 } from "./types/ExportAccountData";
4852
export type { ExportAuditLogsPathProjectId, ExportAuditLogsQueryCredentialId, ExportAuditLogsQueryDecision, ExportAuditLogsQueryEnd, ExportAuditLogsQueryEvent, ExportAuditLogsQuerySource, ExportAuditLogsQueryStart, ExportAuditLogsRequestConfig, ExportAuditLogsResponse, ExportAuditLogsResponses, ExportAuditLogsStatus200, ExportAuditLogsStatus400, ExportAuditLogsStatus401, ExportAuditLogsStatus403, ExportAuditLogsStatus404, ExportAuditLogsStatus429 } from "./types/ExportAuditLogs";
@@ -57,6 +61,7 @@ export type { GetProjectPathProjectId, GetProjectRequestConfig, GetProjectRespon
5761
export type { GetProjectInsightsPathProjectId, GetProjectInsightsQueryLimit, GetProjectInsightsQueryRange, GetProjectInsightsRequestConfig, GetProjectInsightsResponse, GetProjectInsightsResponses, GetProjectInsightsStatus200, GetProjectInsightsStatus400, GetProjectInsightsStatus401, GetProjectInsightsStatus404, GetProjectInsightsStatus429 } from "./types/GetProjectInsights";
5862
export type { GetProjectMetricsPathProjectId, GetProjectMetricsQueryLimit, GetProjectMetricsQueryRegion, GetProjectMetricsRequestConfig, GetProjectMetricsResponse, GetProjectMetricsResponses, GetProjectMetricsStatus200, GetProjectMetricsStatus400, GetProjectMetricsStatus401, GetProjectMetricsStatus404, GetProjectMetricsStatus429 } from "./types/GetProjectMetrics";
5963
export type { GetProjectUsagePathProjectId, GetProjectUsageQueryEndDate, GetProjectUsageQueryStartDate, GetProjectUsageRequestConfig, GetProjectUsageResponse, GetProjectUsageResponses, GetProjectUsageStatus200, GetProjectUsageStatus400, GetProjectUsageStatus401, GetProjectUsageStatus404, GetProjectUsageStatus429 } from "./types/GetProjectUsage";
64+
export type { GetSchemaCatalogPathDatabaseId, GetSchemaCatalogPathProjectId, GetSchemaCatalogRequestConfig, GetSchemaCatalogResponse, GetSchemaCatalogResponses, GetSchemaCatalogStatus200, GetSchemaCatalogStatus400, GetSchemaCatalogStatus401, GetSchemaCatalogStatus403, GetSchemaCatalogStatus404, GetSchemaCatalogStatus429 } from "./types/GetSchemaCatalog";
6065
export type { GetSupportCasePathCaseId, GetSupportCasePathOrgId, GetSupportCaseRequestConfig, GetSupportCaseResponses, GetSupportCaseStatus200, GetSupportCaseStatus400, GetSupportCaseStatus401, GetSupportCaseStatus403, GetSupportCaseStatus404 } from "./types/GetSupportCase";
6166
export type { GetSupportCaseResponse } from "./types/GetSupportCaseResponse";
6267
export type { GetWebhookEndpointPathProjectId, GetWebhookEndpointPathWebhookId, GetWebhookEndpointRequestConfig, GetWebhookEndpointResponse, GetWebhookEndpointResponses, GetWebhookEndpointStatus200, GetWebhookEndpointStatus400, GetWebhookEndpointStatus401, GetWebhookEndpointStatus403, GetWebhookEndpointStatus404 } from "./types/GetWebhookEndpoint";
@@ -127,6 +132,9 @@ export type { RowFilter } from "./types/RowFilter";
127132
export type { SSLModeKey } from "./types/SSLMode";
128133
export type { ScanDatabaseForPiiPathDatabaseId, ScanDatabaseForPiiPathProjectId, ScanDatabaseForPiiRequestConfig, ScanDatabaseForPiiResponse, ScanDatabaseForPiiResponses, ScanDatabaseForPiiStatus200, ScanDatabaseForPiiStatus400, ScanDatabaseForPiiStatus401, ScanDatabaseForPiiStatus403, ScanDatabaseForPiiStatus404, ScanDatabaseForPiiStatus429 } from "./types/ScanDatabaseForPii";
129134
export type { ScanPiiResult } from "./types/ScanPiiResult";
135+
export type { SchemaCatalog } from "./types/SchemaCatalog";
136+
export type { SchemaCatalogColumn } from "./types/SchemaCatalogColumn";
137+
export type { SchemaCatalogRelation, SchemaCatalogRelationKindEnumKey } from "./types/SchemaCatalogRelation";
130138
export type { SlackEventPayload } from "./types/SlackEventPayload";
131139
export type { StatementRules } from "./types/StatementRules";
132140
export type { SubmitCancellationFeedbackData, SubmitCancellationFeedbackPathOrgId, SubmitCancellationFeedbackRequestConfig, SubmitCancellationFeedbackResponse, SubmitCancellationFeedbackResponses, SubmitCancellationFeedbackStatus204, SubmitCancellationFeedbackStatus400, SubmitCancellationFeedbackStatus401, SubmitCancellationFeedbackStatus403, SubmitCancellationFeedbackStatus429 } from "./types/SubmitCancellationFeedback";
@@ -172,6 +180,8 @@ export { createAgentCredentialRequestPrincipalTypeEnum } from "./types/CreateAge
172180
export { createProjectRequestCloudEnum } from "./types/CreateProjectRequest";
173181
export { databaseBranchStatusEnum } from "./types/DatabaseBranch";
174182
export { databaseRole } from "./types/DatabaseRole";
183+
export { dryEvalMaskedColumnKindEnum } from "./types/DryEvalMaskedColumn";
184+
export { dryEvalResultVerdictEnum } from "./types/DryEvalResult";
175185
export { healthResponseStatusEnum } from "./types/HealthResponse";
176186
export { maskingRuleKindEnum } from "./types/MaskingRule";
177187
export { mcpRequestJsonrpcEnum, mcpRequestMethodEnum } from "./types/McpRequest";
@@ -186,6 +196,7 @@ export { projectCloudEnum } from "./types/Project";
186196
export { projectStatus } from "./types/ProjectStatus";
187197
export { regionProviderEnum, regionStatusEnum } from "./types/Region";
188198
export { SSLMode } from "./types/SSLMode";
199+
export { schemaCatalogRelationKindEnum } from "./types/SchemaCatalogRelation";
189200
export { supportCaseStatus } from "./types/SupportCaseStatus";
190201
export { supportMessageSource } from "./types/SupportMessageSource";
191202
export { updateAgentCredentialStatusRequestStatusEnum } from "./types/UpdateAgentCredentialStatusRequest";

src/generated/operations-map.gen.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import type { UpdateDatabaseRequestConfig, UpdateDatabaseStatus200 } from "./typ
3232
import type { DeleteDatabaseRequestConfig } from "./types/DeleteDatabase";
3333
import type { TestDatabaseConnectionRequestConfig, TestDatabaseConnectionStatus200 } from "./types/TestDatabaseConnection";
3434
import type { ScanDatabaseForPiiRequestConfig, ScanDatabaseForPiiStatus200 } from "./types/ScanDatabaseForPii";
35+
import type { GetSchemaCatalogRequestConfig, GetSchemaCatalogStatus200 } from "./types/GetSchemaCatalog";
3536
import type { ListCustomDomainsRequestConfig, ListCustomDomainsStatus200 } from "./types/ListCustomDomains";
3637
import type { CreateCustomDomainRequestConfig, CreateCustomDomainStatus201 } from "./types/CreateCustomDomain";
3738
import type { DeleteCustomDomainRequestConfig } from "./types/DeleteCustomDomain";
@@ -46,6 +47,7 @@ import type { CreatePolicyProfileRequestConfig, CreatePolicyProfileStatus201 } f
4647
import type { GetPolicyProfileRequestConfig, GetPolicyProfileStatus200 } from "./types/GetPolicyProfile";
4748
import type { UpdatePolicyProfileRequestConfig, UpdatePolicyProfileStatus200 } from "./types/UpdatePolicyProfile";
4849
import type { DeletePolicyProfileRequestConfig } from "./types/DeletePolicyProfile";
50+
import type { DryEvalPolicyRequestConfig, DryEvalPolicyStatus200 } from "./types/DryEvalPolicy";
4951
import type { ListProjectsRequestConfig, ListProjectsStatus200 } from "./types/ListProjects";
5052
import type { CreateProjectRequestConfig, CreateProjectStatus201 } from "./types/CreateProject";
5153
import type { GetProjectRequestConfig, GetProjectStatus200 } from "./types/GetProject";
@@ -134,6 +136,7 @@ export const operationsByTag = {
134136
deleteDatabase: { method: "DELETE", path: "/v1/projects/{project_id}/databases/{database_id}" },
135137
testDatabaseConnection: { method: "POST", path: "/v1/projects/{project_id}/databases/{database_id}/test-connection" },
136138
scanDatabaseForPii: { method: "POST", path: "/v1/projects/{project_id}/databases/{database_id}/scan-pii" },
139+
getSchemaCatalog: { method: "GET", path: "/v1/projects/{project_id}/databases/{database_id}/schema-catalog" },
137140
},
138141
platform: {
139142
getHealth: { method: "GET", path: "/v1/health" },
@@ -148,6 +151,7 @@ export const operationsByTag = {
148151
getPolicyProfile: { method: "GET", path: "/v1/projects/{project_id}/policies/{policy_id}" },
149152
updatePolicyProfile: { method: "PUT", path: "/v1/projects/{project_id}/policies/{policy_id}" },
150153
deletePolicyProfile: { method: "DELETE", path: "/v1/projects/{project_id}/policies/{policy_id}" },
154+
dryEvalPolicy: { method: "POST", path: "/v1/projects/{project_id}/policy-evaluations" },
151155
},
152156
support: {
153157
listSupportCases: { method: "GET", path: "/v1/organizations/{org_id}/support/cases" },
@@ -199,6 +203,7 @@ export const operationsByPath = {
199203
"DELETE /v1/projects/{project_id}/databases/{database_id}": { method: "DELETE", path: "/v1/projects/{project_id}/databases/{database_id}", operationId: "deleteDatabase" },
200204
"POST /v1/projects/{project_id}/databases/{database_id}/test-connection": { method: "POST", path: "/v1/projects/{project_id}/databases/{database_id}/test-connection", operationId: "testDatabaseConnection" },
201205
"POST /v1/projects/{project_id}/databases/{database_id}/scan-pii": { method: "POST", path: "/v1/projects/{project_id}/databases/{database_id}/scan-pii", operationId: "scanDatabaseForPii" },
206+
"GET /v1/projects/{project_id}/databases/{database_id}/schema-catalog": { method: "GET", path: "/v1/projects/{project_id}/databases/{database_id}/schema-catalog", operationId: "getSchemaCatalog" },
202207
"GET /v1/projects/{project_id}/domains": { method: "GET", path: "/v1/projects/{project_id}/domains", operationId: "listCustomDomains" },
203208
"POST /v1/projects/{project_id}/domains": { method: "POST", path: "/v1/projects/{project_id}/domains", operationId: "createCustomDomain" },
204209
"DELETE /v1/projects/{project_id}/domains/{domain_id}": { method: "DELETE", path: "/v1/projects/{project_id}/domains/{domain_id}", operationId: "deleteCustomDomain" },
@@ -213,6 +218,7 @@ export const operationsByPath = {
213218
"GET /v1/projects/{project_id}/policies/{policy_id}": { method: "GET", path: "/v1/projects/{project_id}/policies/{policy_id}", operationId: "getPolicyProfile" },
214219
"PUT /v1/projects/{project_id}/policies/{policy_id}": { method: "PUT", path: "/v1/projects/{project_id}/policies/{policy_id}", operationId: "updatePolicyProfile" },
215220
"DELETE /v1/projects/{project_id}/policies/{policy_id}": { method: "DELETE", path: "/v1/projects/{project_id}/policies/{policy_id}", operationId: "deletePolicyProfile" },
221+
"POST /v1/projects/{project_id}/policy-evaluations": { method: "POST", path: "/v1/projects/{project_id}/policy-evaluations", operationId: "dryEvalPolicy" },
216222
"GET /v1/projects": { method: "GET", path: "/v1/projects", operationId: "listProjects" },
217223
"POST /v1/projects": { method: "POST", path: "/v1/projects", operationId: "createProject" },
218224
"GET /v1/projects/{project_id}": { method: "GET", path: "/v1/projects/{project_id}", operationId: "getProject" },
@@ -266,6 +272,7 @@ type UpdateDatabaseParams = { pathParams: NonNullable<UpdateDatabaseRequestConfi
266272
type DeleteDatabaseParams = { pathParams: NonNullable<DeleteDatabaseRequestConfig["pathParams"]> };
267273
type TestDatabaseConnectionParams = { pathParams: NonNullable<TestDatabaseConnectionRequestConfig["pathParams"]> };
268274
type ScanDatabaseForPiiParams = { pathParams: NonNullable<ScanDatabaseForPiiRequestConfig["pathParams"]> };
275+
type GetSchemaCatalogParams = { pathParams: NonNullable<GetSchemaCatalogRequestConfig["pathParams"]> };
269276
type ListCustomDomainsParams = { pathParams: NonNullable<ListCustomDomainsRequestConfig["pathParams"]>; queryParams?: NonNullable<ListCustomDomainsRequestConfig["queryParams"]> };
270277
type CreateCustomDomainParams = { pathParams: NonNullable<CreateCustomDomainRequestConfig["pathParams"]>; body: NonNullable<CreateCustomDomainRequestConfig["data"]> };
271278
type DeleteCustomDomainParams = { pathParams: NonNullable<DeleteCustomDomainRequestConfig["pathParams"]> };
@@ -279,6 +286,7 @@ type CreatePolicyProfileParams = { pathParams: NonNullable<CreatePolicyProfileRe
279286
type GetPolicyProfileParams = { pathParams: NonNullable<GetPolicyProfileRequestConfig["pathParams"]> };
280287
type UpdatePolicyProfileParams = { pathParams: NonNullable<UpdatePolicyProfileRequestConfig["pathParams"]>; body: NonNullable<UpdatePolicyProfileRequestConfig["data"]> };
281288
type DeletePolicyProfileParams = { pathParams: NonNullable<DeletePolicyProfileRequestConfig["pathParams"]> };
289+
type DryEvalPolicyParams = { pathParams: NonNullable<DryEvalPolicyRequestConfig["pathParams"]>; body: NonNullable<DryEvalPolicyRequestConfig["data"]> };
282290
type ListProjectsParams = { queryParams: NonNullable<ListProjectsRequestConfig["queryParams"]> };
283291
type CreateProjectParams = { body: NonNullable<CreateProjectRequestConfig["data"]> };
284292
type GetProjectParams = { pathParams: NonNullable<GetProjectRequestConfig["pathParams"]> };
@@ -366,6 +374,7 @@ export interface ApiOperations {
366374
deleteDatabase(params: DeleteDatabaseParams): Promise<void>;
367375
testDatabaseConnection(params: TestDatabaseConnectionParams): Promise<TestDatabaseConnectionStatus200>;
368376
scanDatabaseForPii(params: ScanDatabaseForPiiParams): Promise<ScanDatabaseForPiiStatus200>;
377+
getSchemaCatalog(params: GetSchemaCatalogParams): Promise<GetSchemaCatalogStatus200>;
369378
};
370379
platform: {
371380
getHealth(): Promise<GetHealthStatus200>;
@@ -380,6 +389,7 @@ export interface ApiOperations {
380389
getPolicyProfile(params: GetPolicyProfileParams): Promise<GetPolicyProfileStatus200>;
381390
updatePolicyProfile(params: UpdatePolicyProfileParams): Promise<UpdatePolicyProfileStatus200>;
382391
deletePolicyProfile(params: DeletePolicyProfileParams): Promise<void>;
392+
dryEvalPolicy(params: DryEvalPolicyParams): Promise<DryEvalPolicyStatus200>;
383393
};
384394
support: {
385395
listSupportCases(params: ListSupportCasesParams): Promise<ListSupportCasesStatus200>;
@@ -431,6 +441,7 @@ export interface RequestMap {
431441
"DELETE /v1/projects/{project_id}/databases/{database_id}": { params: DeleteDatabaseParams; response: void };
432442
"POST /v1/projects/{project_id}/databases/{database_id}/test-connection": { params: TestDatabaseConnectionParams; response: TestDatabaseConnectionStatus200 };
433443
"POST /v1/projects/{project_id}/databases/{database_id}/scan-pii": { params: ScanDatabaseForPiiParams; response: ScanDatabaseForPiiStatus200 };
444+
"GET /v1/projects/{project_id}/databases/{database_id}/schema-catalog": { params: GetSchemaCatalogParams; response: GetSchemaCatalogStatus200 };
434445
"GET /v1/projects/{project_id}/domains": { params: ListCustomDomainsParams; response: ListCustomDomainsStatus200 };
435446
"POST /v1/projects/{project_id}/domains": { params: CreateCustomDomainParams; response: CreateCustomDomainStatus201 };
436447
"DELETE /v1/projects/{project_id}/domains/{domain_id}": { params: DeleteCustomDomainParams; response: void };
@@ -445,6 +456,7 @@ export interface RequestMap {
445456
"GET /v1/projects/{project_id}/policies/{policy_id}": { params: GetPolicyProfileParams; response: GetPolicyProfileStatus200 };
446457
"PUT /v1/projects/{project_id}/policies/{policy_id}": { params: UpdatePolicyProfileParams; response: UpdatePolicyProfileStatus200 };
447458
"DELETE /v1/projects/{project_id}/policies/{policy_id}": { params: DeletePolicyProfileParams; response: void };
459+
"POST /v1/projects/{project_id}/policy-evaluations": { params: DryEvalPolicyParams; response: DryEvalPolicyStatus200 };
448460
"GET /v1/projects": { params: ListProjectsParams; response: ListProjectsStatus200 };
449461
"POST /v1/projects": { params: CreateProjectParams; response: CreateProjectStatus201 };
450462
"GET /v1/projects/{project_id}": { params: GetProjectParams; response: GetProjectStatus200 };
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* Generated by Kubb (https://kubb.dev/).
3+
* Do not edit manually.
4+
*/
5+
6+
import type { PolicyProfileInput } from "./PolicyProfileInput";
7+
8+
/**
9+
* @description A SQL statement to test plus the policy to test it against. Supply exactly one of policy_id (an existing saved policy) or policy (an unsaved draft, e.g. the in-progress editor form).
10+
* @type object
11+
*/
12+
export type DryEvalInput = {
13+
/**
14+
* @description The single SQL statement to evaluate.
15+
* @minLength 1
16+
* @maxLength 100000
17+
* @example SELECT email FROM users WHERE id = 1
18+
* @type string
19+
*/
20+
sql: string;
21+
/**
22+
* @description ID of an existing saved policy profile to evaluate against.
23+
* @example pol_01h455vb4pex5vsknk084sn02q
24+
* @type string | undefined
25+
*/
26+
policy_id?: string;
27+
/**
28+
* @description Mutable fields of a policy profile (used for create and update).
29+
* @type object | undefined
30+
*/
31+
policy?: PolicyProfileInput;
32+
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Generated by Kubb (https://kubb.dev/).
3+
* Do not edit manually.
4+
*/
5+
6+
export const dryEvalMaskedColumnKindEnum = {
7+
redact: "redact",
8+
null: "null",
9+
hash: "hash"
10+
} as const;
11+
12+
export type DryEvalMaskedColumnKindEnumKey = (typeof dryEvalMaskedColumnKindEnum)[keyof typeof dryEvalMaskedColumnKindEnum];
13+
14+
/**
15+
* @description One result column that would be masked, with the mask kind applied.
16+
* @type object
17+
*/
18+
export type DryEvalMaskedColumn = {
19+
/**
20+
* @description The output column name (post-alias) the client would see masked.
21+
* @example email
22+
* @type string
23+
*/
24+
column: string;
25+
/**
26+
* @description How the column is masked.
27+
* @type string
28+
*/
29+
kind: DryEvalMaskedColumnKindEnumKey;
30+
};

0 commit comments

Comments
 (0)